我正在尝试使用Android Studio和gradle为库Android项目创建AAR文件.
我想从此存档中排除特定的文件夹和文件,但我找不到有效的解决方案.
该项目有两种口味.
app/
|--libs/
|--src/
|--flavour1/
| |--java/
| |--a1/
| | |--class_File1.java
|--flavour2/
| |--java/
| |--a1/
| | |--class_File1.java
|--main/
|--java/
| |--...
|--res/
| |--raw/
| | |--comments.txt
| |--...
|--AndroidManifest.xml
Run Code Online (Sandbox Code Playgroud)
我使用像这样的build.gradle文件
apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
minSdkVersion 10
targetSdkVersion 21
}
packagingOptions {
exclude 'assets'
exclude '**/comments.txt'
}
sourceSets {
flavour1 {
resources {
exclude '**/comments.txt'
}
}
flavour2 {
}
}
buildTypes {
release {
minifyEnabled true …Run Code Online (Sandbox Code Playgroud) 我遇到过这个问题,minifyEnabled和shrinkResources在某种意义上给出了次优的结果; 当我包括,
'com.google.android.gms:play-services-places:9.6.1'
Run Code Online (Sandbox Code Playgroud)
我还没有使用Google Sign In API,我收到大量登录图片.

如何从我的APK中删除它们?他们似乎添加了相当多的KB.
我正在使用proguard缩小和缩小资源,如上所述.
我有android library(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`
}
}
Run Code Online (Sandbox Code Playgroud)
我修改了Android.mk文件,使其具有依赖于SHARED_V8_LIB_FILENAMES环境变量的不同配置:
...
# Report configuration
ifeq ($(SHARED_V8_LIB_FILENAMES),) …Run Code Online (Sandbox Code Playgroud) 我有一个库项目,它依赖于cordova.jar,它从项目libs目录加载.
我将这个库项目部署为maven nexus.
在应用程序项目中,我依赖于库项目aar(编译...).但是应用程序项目与cordova.jar具有相同的依赖性.
因此,在构建应用程序项目时,我收到此错误:
:transformClassesWithDexForDebug
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lorg/apache/cordova/AuthenticationToken;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:579)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:535)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:517)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:164)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
at com.android.dx.command.dexer.Main.run(Main.java:277)
at com.android.dx.command.dexer.Main.main(Main.java:245)
at com.android.dx.command.Main.main(Main.java:106)
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我试图在我的应用程序项目中加载库时排除cordova.jar:
dependencies {
compile ('com.my.library:hybridstory:1.0'){
exclude (group: 'org.apache.cordova')
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.难道我做错了什么?
我的第二个问题是:
将库项目作为aar上传时,是否可以排除/libs/cordova.jar,而不是在应用程序中加载库时排除cordova.jar?我怎么能用这个gradle实现这个目标:
apply plugin: 'com.android.library'
apply plugin: 'maven'
archivesBaseName = 'hybridstory'
group = 'com....'
version = '16.3.0-SNAPSHOT'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
minSdkVersion 16
targetSdkVersion 22
versionCode 1
versionName version
} …Run Code Online (Sandbox Code Playgroud) Java Jarbuild.gradle模块:
apply plugin: 'java'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'junit:junit:4.12'
// rx
compile "io.reactivex.rxjava2:rxjava:2.0.4"
compile "io.reactivex.rxjava2:rxandroid:2.0.1"
}
sourceCompatibility = "1.8"
targetCompatibility = "1.8"
Run Code Online (Sandbox Code Playgroud)
这个 Jar 应该是一个库,用作单元测试 android 项目的实用程序库:
apply plugin: 'com.android.application'
android {
// ...
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// test
testCompile 'junit:junit:4.12'
testCompile project(':test-utils')
// ... other non-test dependencies here (including rx)
}
Run Code Online (Sandbox Code Playgroud)
这包括:
testCompile project(':test-utils')
Run Code Online (Sandbox Code Playgroud)
失败:
错误:模块 'my-android-app:test-utils:unspecified' 依赖于一个或多个 Android 库,但它是一个 jar
这是因为RxAndroid是一个 Android .aar 库。 …
我有一个包含在不同 android 应用程序中的内部库。这个库依赖于 ICU4J。这意味着我们向最终 APK 添加了约 10MB。
lib 使用 ICU4J 的一个子集,所以我想删除所有不必要的数据文件。
从ICU文档:
目前 ICU4J 没有提供任何工具来揭示数据文件之间的这些依赖关系,因此直接在 ICU4J 项目中修剪数据是一件难事。删除数据时的关键点是确保也删除对该数据的所有依赖项。
我想在构建应用程序时删除数据文件。
StackOverflow 上的一个问题是相关的:Exclude specific resources from a aar dep。不幸的是,该exploded-aar目录不再存在。
您知道我可以在哪一步从 ICU4J 依赖项中删除文件吗?这是我尝试删除cjdict.dict文件的内容:
tasks.create("excludeTask") << {
["java/com/ibm/icu/impl/data/icudt60b/brkitr/cjdict.dict"]
.collect { "${getGroup()}/${getName()}/${getVersion()}/${it}"}
.each {
// Question 2. From which dir should I remove the files?
File file = file("${buildDir}/intermediates/exploded-aar/${it}")
println("Excluding file " + file)
if (file.exists()) {
file.delete();
}
}
}
tasks.whenTaskAdded({
// Question 1. Before which task …Run Code Online (Sandbox Code Playgroud)