Android之APK预装
应用安装的目录
/system/priv-app
该路径存放一些系统底层的应用,比如Setting,systemUI等。该目录中的app拥有较高的系统权限,而且如果要使用android:protectionLevel=signatureOrSystem
,那么该app必须放到priv-app目录中去。/system/app
该目录中存放的系统app权限相对较低,而且当拥有root权限时,就有可能卸载掉这些app。/vendor/app
该目录存放vendor厂商的app/oem/app
该目录中存放oem特有的app。/data/app
用户安装的第三方app
PMS启动的时候,也是按照上述顺序逐个扫描解析这些目录中的apk的
Android标准的APK预装
在
packages/apps
新建文件夹,如XXX添加编译内容,新建并配置编译文件Android.mk,分2种情况
带源码
- 将Source code拷贝到XXX文件夹下,仅保留必要的目录,删除不必要的目录
- 创建Android.mk文件,可参考其他工程添加内容,根据自己工程的需要添加必要的编译条件:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := XXX include $(BUILD_PACKAGE)
不带源码
- 将APK拷贝到XXX文件夹下
- 创建Android.mk文件,可参考其他工程添加内容
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Module name should match apk name to be installed LOCAL_MODULE := XXX LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_PREBUILT_JNI_LIBS:= \ @lib/armeabi/libtest.so \ @lib/armeabi/libtest2.so LOCAL_CERTIFICATE := PRESIGNED include $(BUILD_PREBUILT)
若无so,删除 LOCAL_PREBUILT_JNI_LIBS
若有so,使用LOCAL_PREBUILT_JNI_LIBS列出所有so的路径,不要忘记使用
@
。@
标识符会将apk中的so抽离出来build进apk同级目录下的lib文件夹中若apk支持不同cpu类型的so,针对so的部分的处理:
Ifeq ($(TARGET_ARCH),arm) LOCAL_PREBUILT_JNI_LIBS := \ @lib/armeabi-v7a/xxx.so\ @ lib/armeabi-v7a/xxxx.so else ifeq ($(TARGET_ARCH),x86) LOCAL_PREBUILT_JNI_LIBS := \ @lib/x86/xxx.so else ifeq ($(TARGET_ARCH),arm64) LOCAL_PREBUILT_JNI_LIBS := \ @lib/armeabi-v8a/xxx.so
即将和TARGET_ARCH对应的so抽离出来
具体的Android.mk内容需要根据APK来进行调整,RK3399对于so库的处理有点不一样,具体参看源码
- 将XXX添加到
PRODUCT_PACKAGES
, 一般可添加到上级总的mk文件中,如在device/xx/device.mk
PRODUCT_PACKAGES += XXX
- 重新编译整个工程
注意:
如果App使用System Level的permission,需要預置到/system/priv-app
底下 (原在/system/app
)。 修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true
,以声明app需要放在/system/priv-app
下
RK3399预装只不过是将以上过程弄成了自动化生成编译脚本而已,主要是SO库的处理和Android.mk文件的生成