1. 前言
在做项目的过程中,有时候有定制需求,要把第三方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-app
3. 其他需求
3.1 编译第三方的aar包到apk中
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
####### 引入androidasync-3.1.0 aar包 编译到apk中 ##############
LOCAL_STATIC_JAVA_AAR_LIBRARIES := androidasync-3.1.0
LOCAL_USE_AAPT2 := true
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages com.koushikdutta.async
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := MyTestApp
include $(BUILD_PACKAGE)
######## 引入androidasync-3.1.0 aar包 预编译 #############
#第三方aar包预编译
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
androidasync-3.1.0:libs/androidasync-3.1.0.aar
include $(BUILD_MULTI_PREBUILT)
# Use the following include to make our testapk.
include $(callall-makefiles-under,$(LOCAL_PATH))
说明:
1. LOCAL_STATIC_JAVA_AAR_LIBRARIES := androidasync-3.1.0 编译依赖的aar包到apk中
2. LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages com.koushikdutta.async
使用aar包中的资源文件时,需要配置此参数, com.koushikdutta.async 可以在此aar包中的AndroidManifest.xml 文件中查找到。
3. 第三方aar包预编译代码
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
androidasync-3.1.0:libs/androidasync-3.1.0.aar
include $(BUILD_MULTI_PREBUILT)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := aar包别名 : aar包路径
aar包别名: 一定要与LOCAL_STATIC_JAVA_AAR_LIBRARIES里所取的别名一致,且不含.aar;
aar包路径: 一定要是真实的存放第三方aar包的路径, 我把aar放置到libs 文件夹下面
所以为libs/androidasync-3.1.0.aar
4. 使用BUILD_MULTI_PREBUILT 预编译
3.2 编译依赖第三方jar包的代码片段
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
#编译依赖第三方的jar包到此apk中
LOCAL_STATIC_JAVA_LIBRARIES := 第三方Jar包1别名(任意取名) 第三方Jar包2别名(任意取名)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := MyTestApp
include $(BUILD_PACKAGE)
#第三方jar包预编译
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
contextualcards:libs/contextualcards.jar
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编译
3.3 编译一个静态java库代码片段
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.4 编译可执行文件代码片段
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.5 编译第三方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。