Android架构

RK3326 Android8.1内置第三方apk 到/syst

2021-08-23  本文已影响0人  Wood木木

基本步骤
新建文件夹(与安装包名字一致)
(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这个目录。

上一篇 下一篇

猜你喜欢

热点阅读