Android预置Apk到系统,有以下几种情况:
1、带源码的apk/不带源码的apk
2、带so库/不带so库
3、用户可以卸载,恢复出厂设置时不能恢复/恢复出厂设置时能够恢复
4、预置的位置
预置到system/app/目录 (不可卸载)
预置到system/priv-app/目录 (不可卸载,系统核心应用)
预置到data/app/目录 (可卸载)
#Android.mk文件
首先看两个简单的系统自带的apk的Android.mk
1、包含源码的apk package/app/Music
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))
2、不带源码的apk google/apps/Chrome
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)
Android.mk中的相关配置项
1.LOCAL_PRIVILEGED_MODULE
决定编译后apk的位置,如果设置为true,则生成在/system/priv-app,如果不设置或false,则生成在/system/app。
2.LOCAL_CERTIFICATE可设置的值如下:
testkey 默认使用,普通的apk
platform APK所在进程的UID为system,完成一些系统的核心功能
shared
media
PRESIGNED 表示APK签名使用原来签名,即第三方签名
3.$(call my-dir)
获取当前文件夹的路径
4.$(call all-java-files-under, src)
获取src目录下所有java文件
5.$(call all-makefiles-under,local_path)
获取local_path目录下所有Make文件
6.LOCAL_PATH
LOCAL_PATH := $(call my-dir)
此变量指示源文件在开发树中所处的位置。 在这里,构建系统提供的宏函数 my-dir 将返回当前目录(Android.mk 文件本身所在的目录)的路径。
7.CLEAR_VARS
include $(CLEAR_VARS)
由构建系统提供, CLEAR_VARS 变量指向一个特殊的 GNU Makefile,后者会清除许多 LOCAL_XXX 变量,GNU Makefile 不会清除 LOCAL_PATH
8.LOCAL_MODULE
LOCAL_MODULE := ApkTest
存储您要构建的模块的名称,每个模块名称必须唯一,且不含任何空格.如果未设置,则默认使用LOCAL_PACKAGE_NAME
9.LOCAL_PACKAGE_NAME
LOCAL_PACKAGE_NAME:= ApkTest
编译出来的apk名称
10.LOCAL_MODULE_TAGS
LOCAL_MODULE_TAGS := optional
指定在什么版本下才会编译该模块,可能是eng、user、debug、development、optional。
其中,optional是默认标签,指该模块在所有版本下都编译。
11.LOCAL_MODULE_CLASS
LOCAL_MODULE_CLASS := APPS
标识所编译模块放置的位置, APPS表示放置在/system/app目录下。
12.LOCAL_SRC_FILES
LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk源文件列表
将带源码的APK预置进系统(默认放在package/app下面)
1.在packages/apps下面以需要预置的APK的名字创建一个新文件夹,以预置一个名为ApkTest的APK 为例
2.将ApkTest APK的源码拷贝ApkTest文件夹下
3.在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 整个工程
将无源码的 APK 预置进系统(默认放在package/app下面)
1.在packages/apps下面以需要预置的 APK 名字创建文件夹,以预置一个名为ApkTest的APK为例
2.将ApkTest.apk放到packages/apps/ApkTest下面
3.在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)
4.打开文件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下。