【Android】Automotive开发之BP文件

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.常见模块类型

  1. android_app
    用于构建Android 应用程序安装包,是Android系统应用开发中常用的模块类型,与Android.mk中的BUILD_PACKAGE作用相同。

  2. android_app_certificate
    android_app_certificate模块可由android_app模块的证书属性certificate引用以选择签名密钥。

  3. java_library
    java_library用于将源代码构建并链接到设备的.jar文件中。默认情况下,java_library只有一个变量,它生成一个包含根据设备引导类路径编译的.class文件的.jar包。生成的jar不适合直接安装在设备上,通过会用作另一个模块的static_libs依赖项。
    如果指定“installable:true”将生成一个包含“classes.dex”文件的“.jar”文件,适合在设备上安装。指定’host_supported:true’将产生两个变量,一个根据device的bootclasspath编译,另一个根据host的bootclasspath编译。

  4. java_library_static
    java_library_static作用等同于java_library,但是java_library_static已经过时,不推荐使用

  5. android_library
    android_library将源代码与android资源文件一起构建并链接到设备的“.jar”文件中。android_library有一个单独的变体,它生成一个包含根据device的bootclasspath编译的.class文件的.jar文件,以及一个包含使用aapt2编译的android资源的.package-res.apk文件。生成的apk文件不能直接安装在设备上,但可以用作android_app模块的static_libs依赖项。

  6. 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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值