RK3326 Android8.1内置第三方apk 到/system/app、/system/priv-app、/data/app

基本步骤

  • 新建文件夹(与安装包名字一致

        (1)文件内容:APK安装包

        (2)文件内容:Android.mk

  • Android 源码编译时必定执行的Makefile里添加自己的APK名字

 PRODUCT_PACKAGES += \
    SouGouInput 
  • 可以参考Android源码下APK的目录结构

Android.mk(以搜狗输入法为例,预装到 /system/priv-app

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := SouGouInput
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES :=  SouGouInput.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)

最后修改为

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := SouGouInput
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)

因为报了下面的错误,所以添加了LOCAL_BUILT_MODULE_STEM := package.apk

ninja: error: 'vendor/rockchip/common/apps/RK3288Tools/RK3288Tools/RK3288Tools.apk', needed by 'out/target/product/rk3326_evb/obj/APPS/RK3288Tools_intermediates/package.apk', missing and no known rule to make it

正在使用的 Android.mk

###############################################################################
# GoogleInput
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := GoogleInput
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 :=
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_REQUIRED_MODULES :=
LOCAL_PREBUILT_JNI_LIBS := \
    lib/armeabi-v7a/libconvert_checkpoint_jni.so \
    lib/armeabi-v7a/libexpressive_concepts_model_less_predictor_jni_native.so \
    lib/armeabi-v7a/libgoogle_speech_jni.so \
    lib/armeabi-v7a/libintegrated_shared_object.so \
    lib/armeabi-v7a/libogg_opus_encoder.so \
    lib/armeabi-v7a/libtensorflow_jni.so

include $(BUILD_PREBUILT)

库很重要,apk会先在当前目录寻找库文件。如果没有库文件的话apk会奔溃掉。

关键的语法规则

  • LOCAL_PRIVILEGED_MODULE := true

        (1)决定了其编译后的在ROM中的安装位置

        (2)如果不设置或者设置为false,安装位置为system/app;如果设置为true,安装位置为system/priv-app

  • LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)

        (1)预置apk到/data/app中,即让预置的apk可以卸载。

        (2)在5.0 6.0之后的系统中,这样配置即可实现这个功能。

  • LOCAL_CERTIFICATE := platform

        (1)用于设置签名

                ① testkey:普通APK,默认情况下使用。当不设置的时候,默认使用这一项。

                ② platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。

                ③ shared:该APK需要和home/contacts进程共享数据。

                ④ media:该APK是media/download系统中的一环。

                ⑤ PRESIGNED 使用原来的签名,就是已经签过名了。

        (2)Settings.apk 就是 platform 级别的签名,系统级应用都应该使用这个签名

  • LOCAL_DEX_PREOPT := false

        如果以后对应的APK要进行在线升级,则需要把这个加上。编译时不会进行预优化,保证了APK的完整性。

  • LOCAL_PREBUILT_JNI_LIBS := 
        (1)用于加载库
        (2)参考
LOCAL_PREBUILT_JNI_LIBS := \
    lib/armeabi-v7a/libserial_port.so

 

注意:

这里没有测试过安装到/data/app这个目录。

你可能感兴趣的:(Android系统开发,rockchip)