我正在使用bazel函数android_library()和android_binary()来构建一个APK。我的android_library依赖于使用cc_library()构建的本地库。本地库被打包到APK中,但我想将额外的本地库打包到APK中。
我曾尝试将额外的库作为依赖项添加到android_library()中,但没有成功。它可以构建,但不会打包到APK中。
在我开始迁移到bazel之前使用的build.gradle中,这是通过使用"sourceSets“部分实现的:
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId = 'com.my.runtime'
minSdkVersion 14
targetSdkVersion 26
versionCode = 1
versionName = '1.0'
externalNativeBuild {
cmake {
arguments '-DANDROID_STL=c++_static'
}
}
}
splits {
abi {
reset()
enable true
universalApk false // If true, also generate a universal APK
include "arm64-v8a"
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
sourceSets {
main {
// let gradle pack the additional shared library into apk
jniLibs.srcDirs = ['../additional_lib']
}
}
externalNativeBuild {
cmake {
version '3.15.5'
path 'src/main/jni/CMakeLists.txt'
}
}
}
dependencies {
implementation 'com.android.support:appcompat-v7:26.0.0'
}我如何使用bazel函数来实现这一点?
发布于 2020-09-09 05:36:36
实现此目的的方法是使用cc_import:https://docs.bazel.build/versions/master/be/c-cpp.html#cc_import
然后让您的android_binary依赖于该cc_import。
如果您想要支持的每个体系结构都有一个.so,那么可以使用cc_import、select()和config_setting将它们全部导入。例如,如果您有一个名为libs的目录,其结构如下:
$ tree libs
libs
├── arm64-v8a
│ └── libsomething.so
├── armeabi-v7a
│ └── libsomething.so
├── x86
│ └── libsomething.so
└── x86_64
└── libsomething.so然后,您可以在libs中创建构建文件,如下所示:
config_setting(
name = "x86",
values = {
"cpu": "x86",
}
)
config_setting(
name = "x86_64",
values = {
"cpu": "x86_64",
}
)
config_setting(
name = "armeabi-v7a",
values = {
"cpu": "armeabi-v7a",
}
)
config_setting(
name = "arm64-v8a",
values = {
"cpu": "arm64-v8a",
}
)
cc_import(
name = "lib",
shared_library = select({
":x86": "x86/libsomething.so",
":x86_64": "x86_64/libsomething.so",
":armeabi-v7a": "armeabi-v7a/libsomething.so",
":arm64-v8a": "arm64-v8a/libsomething.so",
}),
visibility = ["//visibility:public"],
)然后让你的android_binary依赖于lib。然后,当您使用--fat_apk_cpu构建时,每个.so都将针对其各自的体系结构进行打包,例如:
bazel build java/com/app --fat_apk_cpu=x86,x86_64,armeabi-v7a,arm64-v8a
$ unzip -l bazel-bin/java/com/app/app.apk
Archive: bazel-bin/java/com/app/app.apk
Length Date Time Name
--------- ---------- ----- ----
9 2010-01-01 00:00 nativedeps
274288 2010-01-01 00:00 lib/arm64-v8a/libapp.so
18770760 2010-01-01 00:00 lib/arm64-v8a/libsomething.so
189796 2010-01-01 00:00 lib/armeabi-v7a/libapp.so
10076740 2010-01-01 00:00 lib/armeabi-v7a/libsomething.so
239312 2010-01-01 00:00 lib/x86/libapp.so
38612828 2010-01-01 00:00 lib/x86/libsomething.so
247784 2010-01-01 00:00 lib/x86_64/libapp.so
53690632 2010-01-01 00:00 lib/x86_64/libsomething.so
2760 2010-01-01 00:00 classes.dex
1832 2010-01-01 00:00 AndroidManifest.xml
728 2010-01-01 00:00 res/layout/main_layout.xml
768 2010-01-01 00:00 resources.arsc
1374 2010-01-01 00:00 META-INF/CERT.SF
1211 2010-01-01 00:00 META-INF/CERT.RSA
1270 2010-01-01 00:00 META-INF/MANIFEST.MF
--------- -------
122112092 16 fileshttps://stackoverflow.com/questions/63699832
复制相似问题