【问题标题】:Pack additional native libs into the APK with bazel使用 bazel 将额外的原生库打包到 APK 中
【发布时间】:2020-12-21 06:52:31
【问题描述】:

我正在使用 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 函数来实现这一点?

【问题讨论】:

  • android_binary 会将其部门中的所有 cc_library 目标链接到单个 .so 并将其打包到 apk 中。你的意思是你在.so 中没有看到其他cc_library 目标,还是你的意思是你有一个预编译的.so 想要包含在apk 中?
  • 我有一个预编译的 .so,我想与从 cc_library 目标生成的 .so 一起打包到 APK 中。

标签: android android-ndk bazel


【解决方案1】:

这样做的方法是使用cc_import:https://docs.bazel.build/versions/master/be/c-cpp.html#cc_import

然后让您的 android_binary 依赖于 cc_import

如果您想要支持的每个架构都有一个.so,那么您可以使用cc_importselect()config_setting 将它们全部导入。例如,如果您有一个名为 libs 的目录,其结构如下:

$ tree libs
libs
├── arm64-v8a
│   └── libsomething.so
├── armeabi-v7a
│   └── libsomething.so
├── x86
│   └── libsomething.so
└── x86_64
    └── libsomething.so

然后你可以像这样在libs创建一个BUILD文件:


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 files

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2017-11-08
    • 2011-12-14
    相关资源
    最近更新 更多