1.简介
早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp。很明显Android.bp的出现就是为了替换掉Android.mk。
- Android 7.0引入ninja和kati
- Android 8.0使用Android.bp来替换Android.mk,引入Soong
- Android 9.0强制使用Android.bp
2.使用条件
Android.bp不支持条件语句!没有分支、循环等流程控制,不能做算数逻辑运算。在实际项目中,如果构建的脚本必须包含条件语句,建议使用Android.mk或使用Go语言
3.模块实例
以模块类型开头,以键值对的形式进行编写。例子如下:
// 构建可执行程序
android_app {
// 设定可执行的程序的名称,编译后会生成一个 CarNotification.apk
name: "CarNotification",
// 指定java源码的位置
srcs: ["src/**/*.java"],
// 指定资源文件的位置
resource_dirs: ["res"],
// 允许使用系统hide api
platform_apis: true,
// 设定apk签名为 platform
certificate: "platform",
// 设定apk安装路径为priv-app
privileged: true,
// 是否启用代码优化,android_app中默认为true,java_library中默认为false
optimize: {
enabled: false,
},
// 是否预先生成dex文件,默认为true。该属性会影响应用的首次启动速度以及Android系统的启动速度
dex_preopt: {
enabled: false,
},
// 引入java静态库
static_libs: [
"androidx.cardview_cardview",
"androidx.recyclerview_recyclerview",
"androidx.palette_palette",
"car-assist-client-lib",
"android.car.userlib",
"androidx-constraintlayout_constraintlayout"
],
// 引入java库
libs: ["android.car"],
product_variables: {
pdk: {
enabled: false,
},
},
// 设定依赖模块。如果安装了此模块,则要还需要安装的其他模块的名称
required: ["privapp_whitelist_com.android.car.notification"]
}
// As Lib
android_library {
name: "CarNotificationLib",
srcs: ["src/**/*.java"],
resource_dirs: ["res"],
manifest: "AndroidManifest-withoutActivity.xml",
platform_apis: true,
optimize: {
enabled: false,
},
dex_preopt: {
enabled: false,
},
static_libs: [
"androidx.cardview_cardview",
"androidx.recyclerview_recyclerview",
"androidx.palette_palette",
"car-assist-client-lib",
"android.car.userlib",
"androidx-constraintlayout_constraintlayout"
],
libs: ["android.car"],
product_variables: {
pdk: {
enabled: false,
},
},
}
其中:
name: “CarNotification” - 表示构建一个app,生成的apk与模块名称相同,并带有.apk后缀。
srcs: ["/*.java"]** - srcs用于指定当前的模块编译的源码位置,*表示通配符。
static_libs - 引入静态库
platform_apis: true - 设置该标记后会使用sdk的hide的api来编译。编译的APK中使用了系统级API,必须设定该值。和Android.mk中的LOCAL_PRIVATE_PLATFORM_APIS的作用相同
certificate: “platform” - certificate 用于指定APK的签名方式。如果不指定,默认使用testkey签名。与LOCAL_CERTIFICATE作用相同。
Android中共有四中签名方式:
testkey:普通APK,默认使用该签名。
platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
shared:该APK需要和home/contacts进程共享数据。
media:该APK是media/download系统中的一环。
product_specific: true - 生成的apk会被安装在Android系统的product分区,和Android.mk中LOCAL_PRODUCT_MODULE作用相同
4.常见模块类型
-
android_app
用于构建Android 应用程序安装包,是Android系统应用开发中常用的模块类型,与Android.mk中的BUILD_PACKAGE作用相同。 -
android_app_certificate
android_app_certificate模块可由android_app模块的证书属性certificate引用以选择签名密钥。 -
java_library
java_library用于将源代码构建并链接到设备的.jar文件中。默认情况下,java_library只有一个变量,它生成一个包含根据设备引导类路径编译的.class文件的.jar包。生成的jar不适合直接安装在设备上,通过会用作另一个模块的static_libs依赖项。
如果指定“installable:true”将生成一个包含“classes.dex”文件的“.jar”文件,适合在设备上安装。指定’host_supported:true’将产生两个变量,一个根据device的bootclasspath编译,另一个根据host的bootclasspath编译。 -
java_library_static
java_library_static作用等同于java_library,但是java_library_static已经过时,不推荐使用 -
android_library
android_library将源代码与android资源文件一起构建并链接到设备的“.jar”文件中。android_library有一个单独的变体,它生成一个包含根据device的bootclasspath编译的.class文件的.jar文件,以及一个包含使用aapt2编译的android资源的.package-res.apk文件。生成的apk文件不能直接安装在设备上,但可以用作android_app模块的static_libs依赖项。 -
cc_library
cc_library为device或host创建静态库或共享库。默认情况下,cc_library具有针对设备的单一变体。指定’host_supported:true’还会创建一个以主机为目标的库。与cc_library相关的模块类型还有cc_library_shared、cc_library_headers、cc_library_static等。
5.编译apk
编译环境配置命令
source build/envsetup.sh
lunch “xxxxx”
export SKIP_KEYGUARD_SERVICE=true
export WIDESCREEN_DISPLAY=true
export ENABLE_DLT=true
编译apk
make CarNotification ALLOW_MISSING_DEPENDENCIES=true -j8 2>&1 | tee log.txt