一、带源码的apk/不带源码的apkjava
二、带so库/不带so库bash
三、用户能够卸载,恢复出厂设置时不能恢复/恢复出厂设置时可以恢复app
四、预置的位置ide
首先看两个简单的系统自带的apk的Android.mk函数
一、包含源码的apk package/app/Music
ui
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := Music
LOCAL_SDK_VERSION := current
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
include $(BUILD_PACKAGE)
# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
复制代码
二、不带源码的apk google/apps/Chrome
google
LOCAL_PATH := $(call my-dir)
my_archs := arm arm64
my_src_arch := $(call get-prebuilt-src-arch, $(my_archs))
include $(CLEAR_VARS)
LOCAL_MODULE := Chrome
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_OVERRIDES_PACKAGES := WebViewGoogle Browser Browser2 MtkBrowser MtkBrowserAutoTests BrowserSanityTest
LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk
LOCAL_REQUIRED_MODULES := WebViewStub BookmarkProvider PartnerBookmarksProvider
LOCAL_MODULE_TARGET_ARCH := $(my_src_arch)
LOCAL_MULTILIB := both
include $(BUILD_PREBUILT)
复制代码
内置Apk的关键点在于配置编译文件,即Android.mk文件,下面介绍一部分Android.mk中的相关配置项,更多的能够去网上寻找:spa
决定编译后apk的位置,若是设置为true,则生成在/system/priv-app,若是不设置或false,则生成在/system/app。
复制代码
LOCAL_CERTIFICATE可设置的值以下:
testkey 默认使用,普通的apk
platform APK所在进程的UID为system,完成一些系统的核心功能
shared
media
复制代码
获取当前文件夹的路径
复制代码
获取src目录下全部java文件
复制代码
获取local_path目录下全部Make文件
复制代码
LOCAL_PATH := $(call my-dir)
此变量指示源文件在开发树中所处的位置。 在这里,构建系统提供的宏函数 my-dir 将返回当前目录(Android.mk 文件自己所在的目录)的路径。
复制代码
include $(CLEAR_VARS)
由构建系统提供, CLEAR_VARS 变量指向一个特殊的 GNU Makefile,后者会清除许多 LOCAL_XXX 变量,GNU Makefile 不会清除 LOCAL_PATH
复制代码
LOCAL_MODULE := ApkTest
存储您要构建的模块的名称,每一个模块名称必须惟一,且不含任何空格.若是未设置,则默认使用LOCAL_PACKAGE_NAME
复制代码
LOCAL_PACKAGE_NAME:= ApkTest
编译出来的apk名称
复制代码
LOCAL_MODULE_TAGS := optional
指定在什么版本下才会编译该模块,多是eng、user、debug、development、optional。
其中,optional是默认标签,指该模块在全部版本下都编译。
复制代码
LOCAL_MODULE_CLASS := APPS
标识所编译模块放置的位置, APPS表示放置在/system/app目录下。
复制代码
LOCAL_SRC_FILES := $(call all-java-files-under, src)或者
LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk
源文件列表
复制代码
在packages/apps下面以须要预置的APK的名字建立一个新文件夹,以预置一个名为ApkTest的APK 为例debug
将ApkTest APK的源码拷贝ApkTest文件夹下code
在ApkTest目录下建立一个名为 Android.mk的文件,内容以下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := ApkTest
LOCAL_SDK_VERSION := current
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
include $(BUILD_PACKAGE)
# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
复制代码
打开文件 device/mediatek/common/devices.mk , 将ApkTest添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += ApkTest
从新 build 整个工程
在packages/apps下面以须要预置的 APK 名字建立文件夹,以预置一个名为ApkTest的APK为例
将ApkTest.apk放到packages/apps/ApkTest下面
在packages/apps/ApkTest下面建立文件Android.mk,文件内容以下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := ApkTest
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
复制代码
打开文件device\mediatek\common\device.mk,将ApkTest添加到PRODUCT_PACKAGES里面
PRODUCT_PACKAGES += ApkTest
从新build整个工程
若是App使用System Level的permission,须要預置到/system/priv-app底下 (原在/system/app)。
修改Android.mk,增长LOCAL_PRIVILEGED_MODULE := true,以声明app须要放在/system/priv-app下。
复制代码
待更新