首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用bazel将额外的本地库打包到APK中

使用bazel将额外的本地库打包到APK中
EN

Stack Overflow用户
提问于 2020-09-02 14:26:17
回答 1查看 178关注 0票数 1

我正在使用bazel函数android_library()和android_binary()来构建一个APK。我的android_library依赖于使用cc_library()构建的本地库。本地库被打包到APK中,但我想将额外的本地库打包到APK中。

我曾尝试将额外的库作为依赖项添加到android_library()中,但没有成功。它可以构建,但不会打包到APK中。

在我开始迁移到bazel之前使用的build.gradle中,这是通过使用"sourceSets“部分实现的:

代码语言:javascript
复制
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函数来实现这一点?

EN

回答 1

Stack Overflow用户

发布于 2020-09-09 05:36:36

实现此目的的方法是使用cc_importhttps://docs.bazel.build/versions/master/be/c-cpp.html#cc_import

然后让您的android_binary依赖于该cc_import

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

代码语言:javascript
复制
$ tree libs
libs
├── arm64-v8a
│   └── libsomething.so
├── armeabi-v7a
│   └── libsomething.so
├── x86
│   └── libsomething.so
└── x86_64
    └── libsomething.so

然后,您可以在libs中创建构建文件,如下所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
$ 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63699832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档