第三方应用的预置
也就是手机上预置第三方应用,一般需要预置无代码的APK和有源码的APP
1. Android.mk基础知识
? Android N(7)之后多了一种Android.bp格式,不过现在大多数仍然是以mk来书写配置文件,它相当于提供了编译参数
1.1 mk实例
LOCAL_PATH := $(ca1l my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)
LOCAL开头的变量意思就是mk文件需要这个变量
include表示mk需要执行的脚本
-
LOCAL_ PATH := $(ca1l my-dir) 每一个Android.mk文件必须要定义LOCAL_PATH开始,用于tree中查找位置,意思就是编译的时候将该目录加进去。my -dir是系统提供,表示返回当前路径 -
include $(CLEAR_VARS) CLEAR_VARS变量是由Build System提供,并指向一个指定的GNU Makefile,负责清理很多的LOCAL_XXX配置,但是不会清理LOCAL_PATH,也就是说,在编译新的模块之前把之前编译模块的信息给清除 -
LOCAL_MODULE := helloworld 模块名,默认是$(LOCAL_PACKAGE_NAME),如果没有会编译失败。apk是以LOCAL_PACKAGE_NAME指定模块名,其余都是以这个 -
LOCAL_CERTIFICATE 在什么情况下签名
- testkey:普通APK,默认使用
- platform:该APK完成一些系统核心功能,编译出来的APK的UID为system,参见Settings的mk或者bp文件
- shared:该APK需要和home/contacts进程共享数据,参见Launcher
- media:该APK是media/download系统中的一环,参见Gellery、
- PRESIGNED:已经签名
-
LOCAL_SRC_FILES := helloworld.c -
LOCAL_MODULE_CLASS := APPS 指定模块的类型,可以不用定义
- APPS编译APK文件
- JAVA_LIBRAYIES编译jar包
- SHARED_LIBRAYIES定义动态库文件
- EXECUTABLES编译可执行文件
-
include $(BUILD_SHARED_LIBRARY) $里的值表示编译库,意思就是用什么编译库去编译,有以下七个库
- BUILD_PACKAGE既可以编译APK,也可以编译包文件,但是需要指定LOCAL_EXPORT_PACKAGE_RESOURCES:=true
- BUILD_JAVA_LIBRAYRY为java共享库
- BUILD_STATIC_JAVA_LIBRARY为java静态库
- BUILD_EXECUTABLE为执行文件
- BUILD_SHARED_LIBRARY为native共享库
- BUILD_STATIC_LIBRARY为native静态库
- BUILD_PREBUILD把文件当成编译项目
-
LOCAL_MODULE_TAGES := USER ENG TESTS OPTIONAL 可选定义,表示什么版本情况下编译该版本,默认为optional
- user/eng/tests:指该模块只在user/eng/tests版本下编译
- optional:指该模块在所有版本下都编译
-
LOCAL_PRIVILEGED_MODULE 如果不设置或设置成false,安装位置在system/app,如果设置成true,安装位置在system/priv-app -
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/operator/app 目标的安装路径,意思是把编译的目标安装在这个目录下
2.预置无代码APK
-
拿到APK -
在aosp/vendor/xxxcompany/3rdAPP/下新建apk同名目录 -
将APK放入该目录并新建Android.mk文件 -
#告诉系统这个目录需要编译
LOCAL_PATH := $(call my-dir)
#清理变量
include $(CLEAR_VARS)
#在所有版本下编译
LOCAL_MODULE_TAGES := optional
#模块名,和package总有一个要设置
LOCAL_MODULE := MyTest
#签名
LOCAL_CERTIFICATE := PRESIGNED
#编译源文件
LOCAL_SRC_FILE := $(LOCAL_MODULE).apk
#编译
include $(BUTLD_PREBUTLT)
-
做好以上几步,如果单编test,是可以编译的,但是如果编译模块就不行了 -
需要更改device.mk,这次针对的产品是:aosp_x86-eng,进入到aosp/build/target/board/generic_x86/device.mk文件 -
增加PRODUCT_PACKAGES += \MyTest -
不同公司产品的device.mk目录不一样
3.预置有源码的APP
预置第三方APP要麻烦很多,需要涉及jar包和so库,下面以AndroidStudio新建工程CodeApp目录
确认预置的目标目标为:vendor/xxxcompany/3rdAPP/CodeApp,创建三个文件夹分别是libs,res,src和安卓清单文件
这几个文件夹和清单文件都在CodeApp中
libs:把jar和so库都放入
res:就是app/src/main/res/
src:就是app/src/main/java/
添加Android.mk文件,规则和apk基本相同,但是针对jar包和so库要单独进行处理
3.1 引入jar包
例如要引用activitymainbinding.jar文件,位于libs目录下
第一步、需要声明jar包的位置
LOCAL_PREBUILT_STATC_JAVA_LIBRARIES := \
static-library:libs/activitymainbinding.jar
完整的就应该这样写
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATC_JAVA_LIBRARIES := \
static-library:libs/activitymainbinding.jar
include $(BUILD_MULTI_PREBUILT)
第二步,需要引入声明的变量
LOCAL_STATIC-JAVA_LIBRIES := \
STATIC-LIBRARY
3.2 引入so库
假设libs/armeabi下面有一个libcodeapp.so,需要引用他,有两种方式
1、可以在Android.mk引用so库
? 声明so库
LOCAL_PREBUTIL_JNI_LIBS := libs/armeabi/libcodeapp.so
? 如果有多个so库
LOCAL_PREBUTIL_JNI_LIBS := \
libs/armeabi/libcodeapp.so \
libs/armeabi/libcodeapp1.so
? 或者用这个方式
? 第一步还是先声明
include $(CLEAR_VARS)
LOCAL_PREBUTIL_JNI_LIBS := libcodeapp:libs/armeabi/libcodeapp.so
include $(BUILD_MULTI_PREBUILT)
? 第二部引用声明的so库
LOCAL_JNI_shared_LIBraries := \
libcodeapp
2、在libs下建一个Adnroid.mk配置好so库,直接include
? libs/Android.mk如下
include $(CLEAR_ _VARS)
LOCAL MODULE_ TAGS := optional
LOCAL_ MODULE_ SUFFIX := . so
LOCAL_ MODULE := libcodeapp
| LOCAL_ MODULE_ CLASS := SHARED_ LIBRARIES
#此语句可以先不添加进行编译
LOCAL_ CHECK_ ELF_ FILES := false
LOCAL_ SRC_ FILES :=libs/ armeabi/$( LOCAL_ MODULE). so
LOCAL_ MULTILIB := 64
include $(BUILD_ PREBUILT)
#====================================================
include $(CLEAR _VARS)
LOCAL_ MODULE_ TAGS := optional
LOCAL_ MODULE_ SUFFIX := .SO
LOCAL_ MODULE := libnewtest
LOCAL_ MODULE_ CLASS:= SHARED LIBRARIES
#此语句可以先不添加进行编译
LOCAL_ CHECK_ ELF FILES::= false
LOCAL_ SRC_ FILES := libs/armeabi/$(LOCAL_ MODULE).so
LOCAL_ MULTILIB := 64
include $(BUILD_ PREBUILT)
? 根目录mk需要引入
include $(LOCAL_ PATH)/libs/ Android .mk
? 同时需要引入so库
LOCAL_ JNI_ SHARED_ LIBRARIES := \
libcodeapp\
libnewtest
3.3 导入系统依赖
? build.gradle一般会有依赖项如下
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
? 出去junit和test相关的依赖项,mk需要添加以下内容
LOCAL_STATIC_ANDROID_LIBRARIES := \
androidx.appcompat_appcmpat \
com.google.android.material_material
? 依赖中的:用_替代
? 配置好项目相关配置之后在对应device.mk添加模块
? 接下来进行调试编译
mmm vendor/xxxcompany/3rdAPP/MyTest
mmm vendor/xxxcompany/3rdAPP/CodeApp
? 如果模块编译成功后,在进行全编
4.完整APP预置Android.mk示例
LOCAL_ PATH:= $(call my-dir)
include $(CLEAR_ VARS)
LOCAL_ MODULE_ TAGS := optional
LOCAL_ PACKAGE_ NAME := CodeApp
#签名使用平台签名
LOCAL_ CERTIFICATE:=platform
#引入系统资源文件
#LOCAL_USE_AAPT2 := true
# Java 文件(源代码文件)
LOCAL_SRC_FILES := $(ca1l all-java-files-under,src)
#资源文件,可选定义,推荐不定义
#LOCAL_RESOURCE_DIR = \
# $(LOCAL_ PATH)/res
#可以使用系统hide api
LOCAL_PRIVATE_PLATFORM_APIS := true
#释放开后,可能导致引入的三方库编译异常
#LOCAL_SDK_VERSION := current
#导入系统依赖
LOCAL_ TATICANDROID_LIBRARIES := \
androidx.appcompat_appcmpat \
com.google.android.material_material \
androidx_constraintlayout_constraintlayout
#引入jar包
LOCAL_ STATIC JAVA_ LIBRARIES := \
static-library
#打印日志
$(warning $(LOCAL_STATIC_JAVA_ LIBRARIES))
#引用三方so库的第一种方式
LOCAL_PREBUILT_JNI_LIBS := libs/armeabi/libcodeapp.so
#制定编译的工程,不要使用代码混淆的工具进行代码混淆
include $(BUILD_PACKAGE)
LOCAL_ PROGUARD_ ENABLED := disabled
#指定不需要混淆的native方法与变量的proguard. flags文件
LOCAL_ PROGUARD_ _FLAG_ FILES := proguard. flags
#截止到此处引入编译指令开始编译
include $(BUILD_ PACKAGE)
#########引用第三方jar包#########
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=
static-library:libs/activitymainbinding.jar
include $(BUILD_MULTI_PREBUILT)
#打印日志
$(warning“build multi prebuilt over")
|