应用安装的目录

  • /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预装

  1. packages/apps新建文件夹,如XXX

  2. 添加编译内容,新建并配置编译文件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库的处理有点不一样,具体参看源码

  1. 将XXX添加到PRODUCT_PACKAGES, 一般可添加到上级总的mk文件中,如在device/xx/device.mk
    PRODUCT_PACKAGES += XXX
  2. 重新编译整个工程

注意:
如果App使用System Level的permission,需要預置到/system/priv-app底下 (原在/system/app)。 修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true,以声明app需要放在/system/priv-app

RK3399预装只不过是将以上过程弄成了自动化生成编译脚本而已,主要是SO库的处理和Android.mk文件的生成

参考