如何动态地使用Gradle从aar排除文件? [英] How to exclude files from aar with Gradle dynamically?
问题描述
pre>
apply plugin:'com.android.library'
android {
compileSdkVersion 16
buildToolsVersion25.0.0
defaultConfig {
minSdkVersion 11
targetSdkVersion 16
versionCode 1
versionName1.0
ndk {
abiFilters'armeabi -v7a'
}
}
externalNativeBuild {
ndkBuild {
path'jni / Android.mk'
}
}
$ b $ sourceSets {
main {
manifest.srcFile'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
jni.srcDirs = ['jni']
}
}
packagingOptions {
exclude'/ lib / armeabi-v7a /libv8.cr.so'
排除'/lib/armeabi-v7a/libv8_libbase.cr.so'
// TODO:生成动态ly from`SHARED_V8_LIB_FILENAMES`
}
}
我修改了 Android.mk
文件具有不同的配置,取决于 SHARED_V8_LIB_FILENAMES
环境变量:
...
#报告配置
ifeq($(SHARED_V8_LIB_FILENAMES),)
#static
$(info [Configuration]静态链接到内置的v8)
else
#dynamic
定义info_define
$(info [Configuration]动态链接到共享v8库./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
文件。
apply plugin class =h2_lin>解决方案
:'com.android.library'
android {
compileSdkVersion 16
buildToolsVersion25.0.0
defaultConfig {
minSdkVersion 11
targetSdkVersion 16
versionCode 1
versionName1.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 sharedV8LibFile s = System.getenv('SHARED_V8_LIB_FILENAMES')
if(sharedV8LibFiles!= null){
def sharedV8LibFilesArray = sharedV8LibFiles.split('')
sharedV8LibFilesArray.each {eachFileName - >
sharedV8LibFilesSet.add(** /+ eachFileName)
println[配置]排除共享v8库+ eachFileName +from AAR
}
} else {
println[Configuration]没有从AAR中排除共享v8库
}
packagingOptions {
excludes = sharedV8LibFilesSet
}
}
任何代码样式的变化/改进都会得到满足。
I'm having android library (aar
) that contains (and builds while building module) native code:
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`
}
}
I've modified Android.mk
file to have different config dependent on SHARED_V8_LIB_FILENAMES
environment variable:
...
# 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
...
How can i modify my build.gradle
in order to generate packageOptions
section dependent on environment variable SHARED_V8_LIB_FILENAMES
? I need to check if the variable is set, parse it with space separator and add files list to be excluded from final aar
file.
Actually i was able to do it myself:
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
}
}
Any code style changes/improvements appreciated.
这篇关于如何动态地使用Gradle从aar排除文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!