Android.bp语法和使用,源码编译比平台低版本的sdk编译apk

一、 Android.bp 文件是什么?

Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk
文件的。在 Android7.0 以前,Android 都是使用 make 来组织各模块的编译,对应的编译
配置文件就是 Android.mk。

在 Android7.0 开始,Google 引入了 ninja 和 kati 来编译,为啥引入 ninja?因为随着 Android 越来越庞大,module 越来越多,编译时间也越来越久,而使用 ninja 在编译的并发处理上较 make 有很大的提升。Ninja 的配置文件就是Android.bp,Android 系统使用 Blueprint 和 Soong 工具来解析 Android.bp 转换生成 ninja文件。为了兼容老的 mk 配置文件,Android 当初也开发了 Kati 工具来转换 mk 文件生成ninja,目前 Android Q 里边,还是支持 Android.mk 方式的。相信在将来的版本中,会彻底让 mk 文件废弃,同时 Kati 也就淘汰了,只保留 bp 配置方式,所以我们要提前学习
bp。

这里涉及到Ninja, kati, Soong, bp概念,接下来分别简单介绍一下。

1.1 Ninja

ninja是一个编译框架,会根据相应的ninja格式的配置文件进行编译,但是ninja文件一般不会手动修改,而是通过将Android.bp文件转换成ninja格文件来编译。

1.2 Android.bp

Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。

1.3 Soong

Soong类似于之前的Makefile编译系统的核心,负责提供Android.bp语义解析,并将之转换成Ninja文件。Soong还会编译生成一个androidmk命令,用于将Android.mk文件转换为Android.bp文件,不过这个转换功能仅限于没有分支、循环等流程控制的Android.mk才有效。

1.4 Blueprint

Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong负责Android编译而设计的工具,而Blueprint只是解析文件格式,Soong解析内容的具体含义。Blueprint和Soong都是由Golang写的项目,从Android 7.0,prebuilts/go/目录下新增Golang所需的运行环境,在编译时使用。

1.5 Kati

kati是专为Android开发的一个基于Golang和C++的工具,主要功能是把Android中的Android.mk文件转换成Ninja文件。代码路径是build/kati/,编译后的产物是ckati。

在这里插入图片描述

二、 语法对应规则

我们可能已经习惯了Android.mk 中的语法,现在要变更为 Android.bp, 为了便于理解,可以找到源码,查看Android.mk 与 Android.bp 语法对应规则:

源码位置: /build/soong/androidmk/cmd/androidmk/android.go 中, 这里我只粘贴一部分,完整代码请查看源文件。

var moduleTypes = map[string]string{
	"BUILD_JAVA_LIBRARY":             "java_library_installable", // will be rewritten to java_library by bpfix
	"BUILD_STATIC_JAVA_LIBRARY":      "java_library",
	"BUILD_HOST_JAVA_LIBRARY":        "java_library_host",
	"BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik",
	"BUILD_PACKAGE":                  "android_app",
}
 
var prebuiltTypes = map[string]string{
	"SHARED_LIBRARIES": "cc_prebuilt_library_shared",
	"STATIC_LIBRARIES": "cc_prebuilt_library_static",
	"EXECUTABLES":      "cc_prebuilt_binary",
	"JAVA_LIBRARIES":   "java_import",
	"ETC":              "prebuilt_etc",
}

三、如何把Android.mk 文件转换成 Android.bp

  1. 在工程源码中:

      1.   source build/envsetup.sh
    
      2.   lunch  xxx 
    
      3.   make  androidmk 
    
      生成androidmk转换工具,路径为:/out/soong/host/linux-x86/bin/androidmk
    
  2. 直接把你要转换的Android.mk 文件放置到此目录下,然后执行命令:

    androidmk Android.mk > Android.bp

四、 语法讲解

为了便于理解,把Android.mk 和 Android.bp 的语法放在一起说明,更容易理解一点:
4.1 编译成java库

Android.mk
include $(BUILD_JAVA_LIBRARY)

Android.bp
java_library {
......
}

4.2 编译成 Java 静态库

Android.mk
include $(BUILD_STATIC_JAVA_LIBRARY)
 
Android.bp
java_library_static {
......
}

4.3 编译成 App 应用

Android.mk
include $(BUILD_PACKAGE)
 
Android.bp
android_app {
......
}

4.4 编译成 Native 动态库

Android.mk
include $(BUILD_SHARED_LIBRARY)
 
Android.bp
cc_library_shared {
......
}

4.5 编译成 Native 静态库

Android.mk
include $(BUILD_STATIC_LIBRARY)
 
Android.bp
cc_library_static {
......
}

4.6 编译成 Native 执行程序

Android.mk
include $(BUILD_EXECUTABLE)

Android.bp
cc_binary {
......
}

4.7资源文件路径

Android.mk
LOCAL_RESOURCE_DIR := 
  
Android.bp
resource_dirs: ["xxx", ...]

4.8依赖的静态库

Android.mk
LOCAL_STATIC_LIBRARIES := 

Android.bp
static_libs: ["xxx", "xxx", ...]

4.9依赖的动态库

Android.mk
LOCAL_SHARED_LIBRARIES := 
 
Android.bp
shared_libs: ["xxx", "xxx", ...]

4.10依赖的java库

Android.mk
LOCAL_STATIC_JAVA_LIBRARIES := 
 
Android.bp
static_libs: ["xxx", "xxx", ...]

4.11 安装到product分区

Android.mk
LOCAL_PRODUCT_MODULE := true
 
Android.bp
product_specific: true

4.12例子

175 android_app {
176     name: "AppUpgrade",
177     manifest: "AndroidManifest.xml",
178     resource_dirs: ["res"],
179     srcs: ["**/*.java"],
180     platform_apis: false,   //不使用平台api编译,需要自己配置sdk
181     certificate: "platform",  //平台签名
182
183     static_libs: [
184         "update_static_libs",
185
186         "androidx.annotation_annotation",
194         "androidx.work_work-runtime",
196         "gson-prebuilt-jar",
197         "androidx.appcompat_appcompat",
198         "androidx.room_room-common",
199         "androidx.room_room-runtime",
201     ],
202		
		libs: [
			"framework-jar"
		],
		
203     plugins: [ "androidx.room_room-compiler-plugin"],
204
205     optimize: {
206         enabled: false,   //是否优化压缩
207     },
		
		min_sdk_version: "26",
		sdk_version: 28,
			
213 java_import {
214     name: "update_static_libs",
215     jars: [
216         "jackson-annotations-2.9.0.jar",
217         "jackson-core-2.9.6.jar",
218         "jackson-databind-2.9.6.jar",
226         "okhttp-4.5.0.jar",
227         "okio-jvm-2.5.0.jar",
			.......
235         "annotations-13.0.jar"
236     ],
237 }


213 java_import {
214     name: "framework-jar",
215     jars: [
216         "framework.jar",
236     ],
		sdk_version: "28",
237 }

4.13 源码编译时遇到问题

1.work-runtime

Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the
PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.

在2.7.0或2.7.1这个版本能解决这个问题
在你的build.gradle文件中添加或修改成以下代码

  1. 如果你是Java的项目添加下或修改成面的代码
    dependencies {
    implementation ‘androidx.work:work-runtime:2.7.1’
    }

  2. 如果你是Kotlin的项目则添加或修改成下面这个
    dependencies {
    implementation ‘androidx.work:work-runtime-ktx:2.7.1’
    }
    二选其一即可

但是我在源码编译中使用的是"androidx.work_work-runtime",不知道版本呀???
于是我又查阅,找到prebuilts/sdk/current/androidx/m2repository/androidx 目录可以看到androidx引入的包版本,发现版本太低,所以编译apk就不能用currentsdk了,我需要降低apk的编译版本

2. 无法识别 @Subscribe annotation

and its super classes have no public methods with the @Subscribe annotation
出现此错误的原因之一:代码混淆后,无法识别 @Subscribe annotation。

解决方法:proguard config file文件添加如下配置:

-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

实际是因为配置了optimize,enable=true导致,表示压缩apk的体积,我改为false就好了,但是体积会变大。如果要配置混淆需要写混肴文件。

android_app {
    name: "Music",
    srcs: [
        "src/**/*.java",
        "src/com/android/music/IMediaPlaybackService.aidl",
    ],
    sdk_version: "current",
    product_specific: true, //安装到product分区
    optimize: {
        proguard_flags_files: ["proguard.flags"],
    },
    certificate: "platform",
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值