从事系统开发工作的朋友都知道,手机厂商因为各种原因会在系统中预装一些第三方应用来作为手机的卖点或者额外的收入,但是随着Android 系统日益强大和完善,对一些应用的安全性和稳定性的要求也越来越高。下面就对在预装三方apk的过程中遇到的一些问题做点总结,有错误或者没讲到的地方欢迎大家指正和提建议。
首先,我们先来了解下日常预装三方应用涉及到的安装路径,因预装的需求不同导致部分apk的预装路径也有所差别,主要有以下几个路径:
1.system/app/ :该目录下存放的是一些系统级的应用,该目录下的应用能获取到比较高的权限,应用不可卸载,如Phone、Contacts等
2.system/priv-app/ :该目录是从Android 4.4开始出现的目录,它存放的是一些系统核心应用,能获取到比system/app/下应用更高的权限,应用不可卸载,如:Setting、SystemUI等。
3.vendor/app/ :该目录存放制造商的一些应用,应用不可卸载。
4.data/app/ :该目录下存放的一些第三方应用,应用可卸载。
接下来,我们把预装应用总体分为四个部分:
一、预装有源码的应用
我们可以在package/app/下或者vendor下预装带有源码的应用,这里以vendor下预装为例:
(1).在vendor下新建preload文件夹,在preload下创建APK的文件夹,以DemoApp为例,将APK的Source code 拷贝至DemoApp下,删除/bin 和/gen目录。
(2).在DemoApp中创建Android.mk文件,并添加如下内容:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := DemoApp
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
LOCAL_SRC_FILES := $(call all-subdir-java-files)
include $(BUILD_PACKAGE)
(3).在device/制造商/项目名/项目名.mk文件中做如下配置
PRODUCT_PACKAGES += DemoApp
(4).重新编译整个工程
注:LOCAL_CERTIFICATE 表示apk的签名方式,有platform 和PRESIGNED,platform 表示apk使用系统签名,PRESIGNED表示使用apk原来的签名。LOCAL_PRIVILEGED_MODULE := true表示apk将预装到system/priv-app/下
二、预装无源码并且不可卸载的应用
(1).在vendor下新建preloadApk文件夹,以Demo.apk为例,将Demo.apk拷贝至preloadApk下.
(2).新建Android.mk文件,添加如下内容:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Demo
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
# priv-app
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)
(3).在device/制造商/项目名/项目名.mk文件中做如下配置
PRODUCT_PACKAGES += DemoApp
(4).重新编译整个工程
三、预装无源码并且可卸载的应用
将apk预装成可卸载的方法有很多种,这里介绍其中一种:
(1).在vendor下新建preloadApk文件夹,以Demo.apk为例,将Demo.apk拷贝至preloadApk下.
(2).新建Android.mk文件,添加如下内容:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Demo
$(shell mkdir -p $(TARGET_OUT)/preloadApp/$(LOCAL_MODULE))
$(shell cp $(