一、环境
高通865 Android10
二、预制相关步骤
1、 在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为TestDataDir的APK为例
2、将TestDataDir.apk 放到 packages/apps/TestDataDir目录下
3、在packages/apps/TestDataDir目录下创建文件 Android.mk,文件内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# 模块名称
LOCAL_MODULE :=TestDataDir
# 定义编译完成之后的类型:除了APPS,还有ETC,EXECUTABLES(.bin)SHARED_LIBRARIES(.so)等选择值
LOCAL_MODULE_CLASS :=APPS
# APK文件
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#或者LOCAL_SRC_FILES := TestDataDir.apk
# 定义app签名可用选择项platform,shared,media,签名,如无需重签名,则直接设置为PRESIGNED使用已有签名;需要重签,则设置为对应签名的值。
LOCAL_CERTIFICATE := PRESIGNED
# 不管是user 还是eng 版本都会编译此app ;
# LOCAL_MODULE_TAGS := optiona
# 目标编译后的输出目录
#LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app
# APK预置的so
# ifeq ($(strip $(TARGET_ARCH)), arm64)
# LOCAL_PREBUILT_JNI_LIBS := libs/arm64-v8a/libjni_jpeg.so
# else ifeq ($(strip $(TARGET_ARCH)), x86_64)
# LOCAL_PREBUILT_JNI_LIBS := libs/x86_64/libjni_jpeg.so
# else ifeq ($(strip $(TARGET_ARCH)),arm)
# LOCAL_PREBUILT_JNI_LIBS := libs/armeabi-v7a/libjni_jpeg.so
# else
# LOCAL_PREBUILT_JNI_LIBS := libs/x86/libjni_jpeg.so
# endif
# true--将apk编进“/system/priv-app/目录”;如果为false,或者不加这句话,就会编进“/system/app”
#LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)
#注: 使用LOCAL_PREBUILT_JNI_LIBS列出所有so的路径,@标识符会将apk中的so抽离出来build进system/lib或者system/lib64中
# 例如:LOCAL_PREBUILT_JNI_LIBS:= \
# @lib/armeabi/libtest.so \
# @lib/armeabi/libtest2.so
4、在build/make/target/product/handheld_product.mk中添加TestDataDir
5、在以下文件中添加TestDataDir(如果系统中没有白名单配置文件,可省略此步骤)
device/qcom/kona/apps_white_list.txt
device/qcom/qssi/apps_white_list.txt
6、编译验证
三、一些参数详解
1、LOCAL_CERTIFICATE := platform/shared/media(注意,Android.mk填platform/shared/media这三个中的哪一个是根据AndroidManifest.xml确定的):
(1)platform签名:
AndroidManifest.xml的manifest节点中添加 android:sharedUserId=”android.uid.system”,
Android.mk中增加 LOCAL_CERTIFICATE := platform
(2)shared签名:
AndroidManifest.xml的manifest节点中增加android:sharedUserId=”android.uid.shared”,
Android.mk中增加LOCAL_CERTIFICATE := shared
(3)media签名:
AndroidManifest.xml的manifest节点中增加 android:sharedUserId=”android.media”,
Android.mk中增加 LOCAL_CERTIFICATE := media
2、include $(BUILD_PACKAGE)
include $(BUILD_PREBUILT) #这种方式把文件当成编译项目,
include $(BUILD_PACKAGE) #是用来编译生成apk。
include $(BUILD_STATIC_LIBRARY) #表示编译成静态库
include $(BUILD_SHARED_LIBRARY) #表示编译成动态库
include $(BUILD_EXECUTABLE) #表示编译成可执行程序
include $(BUILD_STATIC_JAVA_LIBRARY) #表示编译生成静态jar包
3、常用函数
$(call all-java-files-under, <src>) #获取指定目录下的所有java文件。
$(call all-c-files-under, <src>) #获取指定目录下的所有c文件。
$(call all-Iaidl-files-under, <src>) #获取指定目录下的所有AIDL文件。
$(call all-makefiles-under, <folder>) #获取指定目录下的所有Make文件。
#获取Build输入的目标文件夹路径。
$(call intermediates-dir-for, <class>, <app_name>, <host or target>, <common?>)
#在LOCAL_PATH的所有子目录中查找.mk文件,不包括当前目录
$(call first-makefiles-under,$(LOCAL_PATH))