有一个问题,我们的Gradle构建生成的apk在test/resources
目录中包含一堆不必要的文件
我们的应用程序构建gradle包含几个本地模块依赖项,这些依赖项构建为android库。
我知道Gradle中有packagingOptions
字段,但据我所知,您无法排除目录。排除每个文件不是一个选项。无论如何,我想知道这个的根本原因。
应用程序gradle build:
apply from: "${rootDir}/android_application.gradle"
dependencies {
compile project(':local-lib1')
//... etc
compile project(':local-libN')
testCompile libraries['junit']
}
android {
defaultConfig {
versionCode 1
versionName "1.0"
multiDexEnabled true
}
}
和android_application.gradle:
apply plugin: 'com.android.application'
android {
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
resources.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
compileSdkVersion android_sdk_version
buildToolsVersion android_build_tools_version
defaultConfig {
minSdkVersion android_min_sdk_version
targetSdkVersion android_target_sdk_version
}
buildTypes {
}
}
所有模块的结构如下:
module
|
--AndroidManifest.xml
--build.gradle
--assets/
--res/
--src
|
-- main/
| |
| --java/
| --resources/
|
-- test/
|
--java/
--resources/
为什么test/resources
被包含在apk中?我该如何排除它们?
编辑(显示lib gradle):
lib gradle示例:
apply from: "${rootDir}/android_library.gradle"
dependencies {
compile 'com.android.support:multidex:1.0.0'
// ...etc external deps
// test deps
testCompile libraries['logback-classic']
testCompile libraries['junit']
testCompile libraries['mockito-core']
// etc...
}
android {
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/ASL2.0'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
}
}
android_library gradle:
apply plugin: 'android-library'
android {
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
resources.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
compileSdkVersion android_sdk_version
buildToolsVersion android_build_tools_version
defaultConfig {
minSdkVersion android_min_sdk_version
targetSdkVersion android_target_sdk_version
}
buildTypes {
release {
}
}
}
我正在使用gradlew.bat -x test build
apk中包含的test/resources
包含每个lib的相应test/resources
中的所有文件。目录(未压缩)的大小是10mb,因此增加了不合理的数量到整个apk的大小。
答案 0 :(得分:2)
试试resource shrinking。根据Google文档:“适用于Android的Gradle构建系统支持
资源缩减“:自动删除资源 在打包的应用程序中,在构建时未使用。除了删除 项目中运行时实际上不需要的资源, 如果应用程序实际上不需要,这也会从您依赖的库中删除资源
android {
...
buildTypes {
test {
minifyEnabled true
shrinkResources true
...
}
}
}
答案 1 :(得分:0)
想想我已经解决了这个问题。
我在app build.gradle和每个库build.gradle:
android {
sourceSets {
main {
resources.srcDirs = ['src']
}
}
}
已更改为
android {
sourceSets {
main {
resources.srcDirs = ['src/main']
}
}
}
我猜gradle正在将src/
下的所有资源目录合并为一个 - http://tools.android.com/tech-docs/new-build-system/resource-merging