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