【问题标题】:How to exclude files from aar with Gradle dynamically?如何使用 Gradle 从 aar 中动态排除文件?
【发布时间】:2018-03-14 13:44:50
【问题描述】:

我拥有包含(并在构建模块时构建)本机代码的 android 库 (aar):

apply plugin: 'com.android.library'

android {
  compileSdkVersion 16
  buildToolsVersion "25.0.0"

  defaultConfig {
    minSdkVersion 11
    targetSdkVersion 16
    versionCode 1
    versionName "1.0"

    ndk {
      abiFilters 'armeabi-v7a'
    }
  }

  externalNativeBuild {
    ndkBuild {
      path 'jni/Android.mk'
    }
  }

  sourceSets {
    main {
      manifest.srcFile 'AndroidManifest.xml'
      java.srcDirs = ['src']
      res.srcDirs = ['res']
      jni.srcDirs = ['jni']
    }
  }

  packagingOptions {
    exclude '/lib/armeabi-v7a/libv8.cr.so'
    exclude '/lib/armeabi-v7a/libv8_libbase.cr.so'
     // TODO : generate dynamically from `SHARED_V8_LIB_FILENAMES`
  }
}

我已修改 Android.mk 文件,使其具有依赖于 SHARED_V8_LIB_FILENAMES 环境变量的不同配置:

...
# Report configuration
ifeq ($(SHARED_V8_LIB_FILENAMES),)
# static
$(info [Configuration] Linking statically with built-in v8)
else
# dynamic

define info_define
    $(info [Configuration] Linking dynamically with shared v8 library ./libfoo-binaries/android_$(TARGET_ARCH_ABI)/$1)
endef
$(foreach item,$(SHARED_V8_LIB_FILENAMES),$(eval $(call info_define,$(item))))
endif
...

如何修改我的build.gradle 以根据环境变量SHARED_V8_LIB_FILENAMES 生成packageOptions 部分?我需要检查是否设置了变量,使用空格分隔符对其进行解析并添加要从最终 aar 文件中排除的文件列表。

【问题讨论】:

    标签: android gradle android-library aar


    【解决方案1】:

    其实我自己也能做到:

    apply plugin: 'com.android.library'
    
    android {
      compileSdkVersion 16
      buildToolsVersion "25.0.0"
    
      defaultConfig {
        minSdkVersion 11
        targetSdkVersion 16
        versionCode 1
        versionName "1.0"
    
        ndk {
          abiFilters 'armeabi-v7a'
        }
      }
    
      externalNativeBuild {
        ndkBuild {
          path 'jni/Android.mk'
        }
      }
    
      sourceSets {
        main {
          manifest.srcFile 'AndroidManifest.xml'
          java.srcDirs = ['src']
          res.srcDirs = ['res']
          jni.srcDirs = ['jni']
        }
      }
    
      def sharedV8LibFilesSet = []
      def sharedV8LibFiles = System.getenv('SHARED_V8_LIB_FILENAMES')
      if (sharedV8LibFiles != null) {
        def sharedV8LibFilesArray = sharedV8LibFiles.split(' ')
        sharedV8LibFilesArray.each { eachFileName ->
          sharedV8LibFilesSet.add("**/" + eachFileName)
          println "[Configuration] Excluding shared v8 library " + eachFileName + " from AAR"
        }
      } else {
        println "[Configuration] No shared v8 libraries excluded from AAR"
      }
    
      packagingOptions {
        excludes = sharedV8LibFilesSet
      }
    }
    

    感谢任何代码样式更改/改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-05
      • 2012-12-08
      • 1970-01-01
      • 2022-10-14
      • 2019-04-23
      • 1970-01-01
      • 2017-09-07
      • 2019-06-19
      相关资源
      最近更新 更多