在做项目的过程中,有时候有定制需求,要把第三方apk预制到手机系统中,这样app就不能被卸载掉。比如客户需要把 酷狗音乐 搜狗输入法预制到手机中,作为默认的音乐播放器,默认输入法等需求,首先我们需要自己写Android.mk 文件把app编译进系统中。如果不清楚Android.mk的语法规则,可以先看看之前写的文章:编写Android.mk把Android studio项目编译到AOSP源码中_broadview_java的博客-CSDN博客_android.mk studio
2. 具体实现我们可以把第三方app预制到 system/app system/priv-app product/priv-app/ product/app
等不同路径,mk文件编写如下:
如下是把 MyTestApp.apk 编译到系统 system/priv-app 路径下
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := MyTestApp LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := APPS #直接用app的签名 LOCAL_CERTIFICATE := PRESIGNED LOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) #加上此配置,默认编译到system/priv-app/ 路径下 如果想修改为product/priv-app路径,见下面说明 LOCAL_PRIVILEGED_MODULE := true include $(BUILD_PREBUILT)
如果想编译到product/priv-app 路径下,则只需要修改为
LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT)/priv-app3. 其他需求 3.1 编译依赖第三方jar包的apk代码片段
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
#java静态库
LOCAL_STATIC_JAVA_LIBRARIES := 第三方Jar包1别名(任意取名) 第三方Jar包2别名(任意取名)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := MyTestApp
include $(BUILD_PACKAGE)
#编译依赖第三方的jar包或aar到此apk中
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=
contextualcards:libs/contextualcards.jar
lottie-2.8.1:libs/lottie-2.8.1.aar
#如下为格式:
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := 第三方Jar包1别名:第三方Jar包1路径
第三方aar包2别名:第三方aar包2路径
include $(BUILD_MULTI_PREBUILT)
# Use the following include to make our testapk.
include $(callall-makefiles-under,$(LOCAL_PATH))
注意事项:
LOCAL_STATIC_JAVA_LIBRARIES 后面应是你的APK程序所需要的JAVA库的JAR文件名
LOCAL_STATIC_JAVA_LIBRARIES取jar库的别名,可以任意取值;
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := jar库的别名:jar文件路径
jar库的别名一定要与LOCAL_STATIC_JAVA_LIBRARIES里所取的别名一致,且不含.jar;
jar文件路径一定要是真实的存放第三方jar包的路径。
使用BUILD_MULTI_PREBUILT编译
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Any libraries that this library depends on
LOCAL_JAVA_LIBRARIES :=
dialer-auto-value-target
org.apache.http.legacy
ims-common
telephony-common
radio_interactor_common
unisoc_ims_common
radio_interactor_common
# Build a static jar file.
include $(BUILD_STATIC_JAVA_LIBRARY)
LOCAL_JAVA_LIBRARIES表示:共享库是由加载器加载到内存,在运行时使用的。
用 include $(BUILD_STATIC_JAVA_LIBRARY) 表示编译静态java库
3.3 编译可执行文件代码片段LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := CppKernelVariables LOCAL_SRC_FILES := KernelVariables.cpp simple.rs include frameworks/rs/tests/lldb/cpp/common.mk include $(BUILD_EXECUTABLE)
用 include $(BUILD_EXECUTABLE) 来编译
3.4 编译第三方so库到APK代码片段include $(CLEAR_VARS) #编译so文件 LOCAL_PREBUILT_LIBS :=libBMaptest:libs/armeabi/libBMaptest.so LOCAL_MODULE_TAGS := optional include $(BUILD_MULTI_PREBUILT)
集成.so动态库
LOCAL_PREBUILT_LIBS指定prebuilt so的规则,格式:别名:so文件路径。注意:别名一般不可改变,特别是第三方jar包使用.so库的情况,且不含.so;so文件路径一定要是真实的存放第三方so文件的路径。 根据定义描述:所以 libBMaptest. so放在libs/armeabi 路径下。
编译用BUILD_MULTI_PREBUILT。



