如何正确减少应用程序方法数(低于 dex 限制)
How to properly reduce an app method count (below dex-limit)
我开始使用大量使用 firebase 功能和支持库的新应用。我很快就达到了 65k dex 的限制,尽管考虑到应用程序的简单性,我没有理由应该在那里。我知道我需要排除某些我没有用的依赖项,所以我一直在使用 gradlew app:dependencies
来分析依赖项并拉出不止一次拉入的东西或我不需要的东西。
尽管有很多 exclude
s,但我无法显着减少方法计数(仅 3%)。我只是坚持使用 multi-dex 吗?如果不是,我如何有效地减少方法计数?
更多信息:
- minSdk 19
这是 build.gradle 依赖块的 before/after 和 gradlew app:dependencies output
。我很高兴 post dexcount 文本输出每个库有多少方法,如果这有帮助的话。我可以说,方法计数的最大贡献者是支持库和 com.google.common.* 和 com.google.android.gms.*
瘦身前
- 应用中的方法总数-debug.apk:67707(已使用 103.31%)
瘦身后
- 应用中的方法总数-debug.apk:65852(已使用 100.48%)
之前:build.gradle 依赖块(不排除)
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:multidex:1.0.2'
implementation "com.android.support:appcompat-v7:$supportLibraryVersion"
implementation "com.android.support:recyclerview-v7:$supportLibraryVersion"
implementation "com.android.support:design:$supportLibraryVersion"
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation "com.android.support:cardview-v7:$supportLibraryVersion"
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.5'
implementation('com.oakwoodsc.rxfirestore:rxfirestore-debug:1.0@aar') {
exclude group: 'io.reactivex.rxjava2', module: 'rxandroid'
exclude group: 'io.reactivex.rxjava2', module: 'rxjava'
}
implementation 'com.firebaseui:firebase-ui-auth:3.1.0' // Remove once custom version
implementation "com.google.android.gms:play-services-location:$firebaseVersion"
implementation "com.google.firebase:firebase-firestore:$firebaseVersion"
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
之前:gradlew app:dependencies
输出
大量重复!
+--- com.google.firebase:firebase-core:11.4.2
| \--- com.google.firebase:firebase-analytics:11.4.2
| +--- com.google.android.gms:play-services-basement:11.4.2
| | +--- com.android.support:support-v4:25.2.0 -> 26.1.0
| | | +--- com.android.support:support-compat:26.1.0
| | | | +--- com.android.support:support-annotations:26.1.0
| | | | \--- android.arch.lifecycle:runtime:1.0.0
| | | | +--- android.arch.lifecycle:common:1.0.0
| | | | \--- android.arch.core:common:1.0.0
| | | +--- com.android.support:support-media-compat:26.1.0
| | | | +--- com.android.support:support-annotations:26.1.0
| | | | \--- com.android.support:support-compat:26.1.0 (*)
| | | +--- com.android.support:support-core-utils:26.1.0
| | | | +--- com.android.support:support-annotations:26.1.0
| | | | \--- com.android.support:support-compat:26.1.0 (*)
| | | +--- com.android.support:support-core-ui:26.1.0
| | | | +--- com.android.support:support-annotations:26.1.0
| | | | \--- com.android.support:support-compat:26.1.0 (*)
| | | \--- com.android.support:support-fragment:26.1.0
| | | +--- com.android.support:support-compat:26.1.0 (*)
| | | +--- com.android.support:support-core-ui:26.1.0 (*)
| | | \--- com.android.support:support-core-utils:26.1.0 (*)
| | \--- com.google.android.gms:play-services-basement-license:11.4.2
| +--- com.google.firebase:firebase-common:11.4.2
| | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | +--- com.google.android.gms:play-services-tasks:11.4.2
| | | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | | \--- com.google.android.gms:play-services-tasks-license:11.4.2
| | \--- com.google.firebase:firebase-common-license:11.4.2
| +--- com.google.firebase:firebase-analytics-impl:11.4.2
| | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | +--- com.google.firebase:firebase-iid:11.4.2
| | | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | | +--- com.google.firebase:firebase-common:11.4.2 (*)
| | | \--- com.google.firebase:firebase-iid-license:11.4.2
| | +--- com.google.firebase:firebase-common:11.4.2 (*)
| | +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| | \--- com.google.firebase:firebase-analytics-impl-license:11.4.2
| \--- com.google.firebase:firebase-analytics-license:11.4.2
+--- com.android.support:multidex:1.0.2
+--- com.android.support:appcompat-v7:26.1.0
| +--- com.android.support:support-annotations:26.1.0
| +--- com.android.support:support-v4:26.1.0 (*)
| +--- com.android.support:support-vector-drawable:26.1.0
| | +--- com.android.support:support-annotations:26.1.0
| | \--- com.android.support:support-compat:26.1.0 (*)
| \--- com.android.support:animated-vector-drawable:26.1.0
| +--- com.android.support:support-vector-drawable:26.1.0 (*)
| \--- com.android.support:support-core-ui:26.1.0 (*)
+--- com.android.support:recyclerview-v7:26.1.0
| +--- com.android.support:support-annotations:26.1.0
| +--- com.android.support:support-compat:26.1.0 (*)
| \--- com.android.support:support-core-ui:26.1.0 (*)
+--- com.android.support:design:26.1.0
| +--- com.android.support:support-v4:26.1.0 (*)
| +--- com.android.support:appcompat-v7:26.1.0 (*)
| +--- com.android.support:recyclerview-v7:26.1.0 (*)
| \--- com.android.support:transition:26.1.0
| +--- com.android.support:support-annotations:26.1.0
| \--- com.android.support:support-v4:26.1.0 (*)
+--- com.android.support.constraint:constraint-layout:1.0.2 -> 1.1.0-beta1
| \--- com.android.support.constraint:constraint-layout-solver:1.1.0-beta1
+--- com.android.support:cardview-v7:26.1.0
| \--- com.android.support:support-annotations:26.1.0
+--- io.reactivex.rxjava2:rxandroid:2.0.1
| \--- io.reactivex.rxjava2:rxjava:2.0.1 -> 2.1.5
| \--- org.reactivestreams:reactive-streams:1.0.1
+--- io.reactivex.rxjava2:rxjava:2.1.5 (*)
+--- com.oakwoodsc.rxfirestore:rxfirestore-debug:1.0
+--- com.firebaseui:firebase-ui-auth:3.1.0
| +--- com.android.support:design:26.1.0 (*)
| +--- com.android.support:customtabs:26.1.0
| | +--- com.android.support:support-compat:26.1.0 (*)
| | \--- com.android.support:support-annotations:26.1.0
| +--- com.android.support.constraint:constraint-layout:1.1.0-beta1 (*)
| +--- com.google.firebase:firebase-auth:11.4.2
| | +--- com.google.android.gms:play-services-base:11.4.2
| | | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | | +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| | | \--- com.google.android.gms:play-services-base-license:11.4.2
| | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | +--- com.google.firebase:firebase-common:11.4.2 (*)
| | +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| | \--- com.google.firebase:firebase-auth-license:11.4.2
| +--- com.google.android.gms:play-services-auth:11.4.2
| | +--- com.google.android.gms:play-services-auth-api-phone:11.4.2
| | | +--- com.google.android.gms:play-services-base:11.4.2 (*)
| | | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | | +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| | | \--- com.google.android.gms:play-services-auth-api-phone-license:11.4.2
| | +--- com.google.android.gms:play-services-auth-base:11.4.2
| | | +--- com.google.android.gms:play-services-base:11.4.2 (*)
| | | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | | +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| | | \--- com.google.android.gms:play-services-auth-base-license:11.4.2
| | +--- com.google.android.gms:play-services-base:11.4.2 (*)
| | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| | \--- com.google.android.gms:play-services-auth-license:11.4.2
| \--- com.android.support:cardview-v7:26.1.0 (*)
+--- com.google.android.gms:play-services-location:11.4.2
| +--- com.google.android.gms:play-services-base:11.4.2 (*)
| +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| \--- com.google.android.gms:play-services-location-license:11.4.2
\--- com.google.firebase:firebase-firestore:11.4.2
+--- com.google.android.gms:play-services-basement:11.4.2 (*)
+--- com.google.firebase:firebase-common:11.4.2 (*)
+--- com.google.android.gms:play-services-tasks:11.4.2 (*)
+--- com.squareup.okhttp:okhttp:2.7.2
| \--- com.squareup.okio:okio:1.6.0
\--- com.google.guava:guava:20.0
之后:build.gradle 依赖块(完全排除)
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation("com.google.android.gms:play-services-base:$playServicesVersion") {
exclude group: "com.android.support", module: "support-v4"
}
implementation 'com.android.support:multidex:1.0.2'
implementation "com.android.support:design:$supportLibraryVersion"
implementation("com.firebaseui:firebase-ui-auth:3.1.0") { // Remove once custom version
exclude group: "com.google.android.gms", module: "play-services-base"
exclude group: "com.google.android.gms", module: "play-services-basement"
exclude group: "com.google.android.gms", module: "play-services-tasks"
exclude group: "com.android.support", module: "design"
exclude group: "com.android.support", module: "support-compat"
exclude group: "com.android.support", module: "support-annotations"
exclude group: "com.android.support", module: "cardview-v7"
}
implementation("com.android.support:cardview-v7:$supportLibraryVersion") {
exclude group: "com.android.support", module: "support-annotations"
}
implementation('com.oakwoodsc.rxfirestore:rxfirestore-debug:1.0@aar') {
exclude group: 'io.reactivex.rxjava2', module: 'rxandroid'
exclude group: 'io.reactivex.rxjava2', module: 'rxjava'
}
implementation("com.google.android.gms:play-services-location:$playServicesVersion") {
exclude group: "com.google.android.gms", module: "play-services-base"
exclude group: "com.google.android.gms", module: "play-services-tasks"
exclude group: "com.google.android.gms", module: "play-services-basement"
}
implementation("com.google.firebase:firebase-firestore:$playServicesVersion") {
exclude group: "com.google.android.gms", module: "play-services-basement"
exclude group: "com.google.android.gms", module: "play-services-tasks"
}
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.5'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
之后:gradlew app:dependencies
输出:
减少重复...
+--- com.google.android.gms:play-services-base:11.4.2
| +--- com.google.android.gms:play-services-basement:11.4.2
| | \--- com.google.android.gms:play-services-basement-license:11.4.2
| +--- com.google.android.gms:play-services-tasks:11.4.2
| | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | \--- com.google.android.gms:play-services-tasks-license:11.4.2
| \--- com.google.android.gms:play-services-base-license:11.4.2
+--- com.android.support:multidex:1.0.2
+--- com.android.support:design:26.1.0
| +--- com.android.support:support-v4:26.1.0
| | +--- com.android.support:support-compat:26.1.0
| | | +--- com.android.support:support-annotations:26.1.0
| | | \--- android.arch.lifecycle:runtime:1.0.0
| | | +--- android.arch.lifecycle:common:1.0.0
| | | \--- android.arch.core:common:1.0.0
| | +--- com.android.support:support-media-compat:26.1.0
| | | +--- com.android.support:support-annotations:26.1.0
| | | \--- com.android.support:support-compat:26.1.0 (*)
| | +--- com.android.support:support-core-utils:26.1.0
| | | +--- com.android.support:support-annotations:26.1.0
| | | \--- com.android.support:support-compat:26.1.0 (*)
| | +--- com.android.support:support-core-ui:26.1.0
| | | +--- com.android.support:support-annotations:26.1.0
| | | \--- com.android.support:support-compat:26.1.0 (*)
| | \--- com.android.support:support-fragment:26.1.0
| | +--- com.android.support:support-compat:26.1.0 (*)
| | +--- com.android.support:support-core-ui:26.1.0 (*)
| | \--- com.android.support:support-core-utils:26.1.0 (*)
| +--- com.android.support:appcompat-v7:26.1.0
| | +--- com.android.support:support-annotations:26.1.0
| | +--- com.android.support:support-v4:26.1.0 (*)
| | +--- com.android.support:support-vector-drawable:26.1.0
| | | +--- com.android.support:support-annotations:26.1.0
| | | \--- com.android.support:support-compat:26.1.0 (*)
| | \--- com.android.support:animated-vector-drawable:26.1.0
| | +--- com.android.support:support-vector-drawable:26.1.0 (*)
| | \--- com.android.support:support-core-ui:26.1.0 (*)
| +--- com.android.support:recyclerview-v7:26.1.0
| | +--- com.android.support:support-annotations:26.1.0
| | +--- com.android.support:support-compat:26.1.0 (*)
| | \--- com.android.support:support-core-ui:26.1.0 (*)
| \--- com.android.support:transition:26.1.0
| +--- com.android.support:support-annotations:26.1.0
| \--- com.android.support:support-v4:26.1.0 (*)
+--- com.firebaseui:firebase-ui-auth:3.1.0
| +--- com.android.support:customtabs:26.1.0
| +--- com.android.support.constraint:constraint-layout:1.1.0-beta1
| | \--- com.android.support.constraint:constraint-layout-solver:1.1.0-beta1
| +--- com.google.firebase:firebase-auth:11.4.2
| | +--- com.google.firebase:firebase-common:11.4.2
| | | \--- com.google.firebase:firebase-common-license:11.4.2
| | \--- com.google.firebase:firebase-auth-license:11.4.2
| \--- com.google.android.gms:play-services-auth:11.4.2
| +--- com.google.android.gms:play-services-auth-api-phone:11.4.2
| | \--- com.google.android.gms:play-services-auth-api-phone-license:11.4.2
| +--- com.google.android.gms:play-services-auth-base:11.4.2
| | \--- com.google.android.gms:play-services-auth-base-license:11.4.2
| \--- com.google.android.gms:play-services-auth-license:11.4.2
+--- com.android.support:cardview-v7:26.1.0
+--- com.oakwoodsc.rxfirestore:rxfirestore-debug:1.0
+--- com.google.android.gms:play-services-location:11.4.2
| \--- com.google.android.gms:play-services-location-license:11.4.2
+--- com.google.firebase:firebase-firestore:11.4.2
| +--- com.google.firebase:firebase-common:11.4.2 (*)
| +--- com.squareup.okhttp:okhttp:2.7.2
| | \--- com.squareup.okio:okio:1.6.0
| \--- com.google.guava:guava:20.0
+--- io.reactivex.rxjava2:rxandroid:2.0.1
| \--- io.reactivex.rxjava2:rxjava:2.0.1 -> 2.1.5
| \--- org.reactivestreams:reactive-streams:1.0.1
\--- io.reactivex.rxjava2:rxjava:2.1.5 (*)
首先,您不需要所有这些 exclude
。如果两个依赖使用com.android.support:support-v4:26.1.0
,它只包含一次。它被列出两次,所以你可以看到谁依赖它。
您可能要考虑的一个选项是 turning on ProGuard。这将删除所有未使用的代码,包括库代码。在你的情况下,它可能会让你低于 65k 限制。
要使用它,请在 build.gradle 中进行设置:
发布 {
minifyEnabled 真
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
您需要创建 proguard-rules.pro
并使用特定于您的应用程序的一些指令填充它。请务必查看完整文档,了解您可能需要在其中包含的内容。
虽然在没有 ProGuard 的情况下保持在 65k 限制以下是可能的,但大多数中等复杂度的应用程序会很快超过它,而且我发现避免像 AppCompat 这样的库以努力保持在 65k 限制以下是通常比它值得的工作更多。
即使使用 ProGuard,一些应用程序也会遇到 65k 的限制。其他应用程序可能出于某种原因不想使用 ProGuard。在这些情况下,您最好的选择是 enable multidex,这样您就可以超过 65k 的限制。
Proguard 是解决您问题的关键。确保您应用的 build.gradle
文件在 buildtypes
下有以下内容
buildTypes {
//debug
//staging
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
在我的例子中,我的发布版本缩小了代码,缩减了资源,最重要的是使用混淆器来减少其他库带来的代码膨胀。可以复制代码proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
观看 David East 精彩的 short video 关于 Proguard 的好处。
此外,如果您还没有查看 Proguard 文档
我开始使用大量使用 firebase 功能和支持库的新应用。我很快就达到了 65k dex 的限制,尽管考虑到应用程序的简单性,我没有理由应该在那里。我知道我需要排除某些我没有用的依赖项,所以我一直在使用 gradlew app:dependencies
来分析依赖项并拉出不止一次拉入的东西或我不需要的东西。
尽管有很多 exclude
s,但我无法显着减少方法计数(仅 3%)。我只是坚持使用 multi-dex 吗?如果不是,我如何有效地减少方法计数?
更多信息:
- minSdk 19
这是 build.gradle 依赖块的 before/after 和 gradlew app:dependencies output
。我很高兴 post dexcount 文本输出每个库有多少方法,如果这有帮助的话。我可以说,方法计数的最大贡献者是支持库和 com.google.common.* 和 com.google.android.gms.*
瘦身前
- 应用中的方法总数-debug.apk:67707(已使用 103.31%)
瘦身后
- 应用中的方法总数-debug.apk:65852(已使用 100.48%)
之前:build.gradle 依赖块(不排除)
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:multidex:1.0.2'
implementation "com.android.support:appcompat-v7:$supportLibraryVersion"
implementation "com.android.support:recyclerview-v7:$supportLibraryVersion"
implementation "com.android.support:design:$supportLibraryVersion"
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation "com.android.support:cardview-v7:$supportLibraryVersion"
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.5'
implementation('com.oakwoodsc.rxfirestore:rxfirestore-debug:1.0@aar') {
exclude group: 'io.reactivex.rxjava2', module: 'rxandroid'
exclude group: 'io.reactivex.rxjava2', module: 'rxjava'
}
implementation 'com.firebaseui:firebase-ui-auth:3.1.0' // Remove once custom version
implementation "com.google.android.gms:play-services-location:$firebaseVersion"
implementation "com.google.firebase:firebase-firestore:$firebaseVersion"
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
之前:gradlew app:dependencies
输出
大量重复!
+--- com.google.firebase:firebase-core:11.4.2
| \--- com.google.firebase:firebase-analytics:11.4.2
| +--- com.google.android.gms:play-services-basement:11.4.2
| | +--- com.android.support:support-v4:25.2.0 -> 26.1.0
| | | +--- com.android.support:support-compat:26.1.0
| | | | +--- com.android.support:support-annotations:26.1.0
| | | | \--- android.arch.lifecycle:runtime:1.0.0
| | | | +--- android.arch.lifecycle:common:1.0.0
| | | | \--- android.arch.core:common:1.0.0
| | | +--- com.android.support:support-media-compat:26.1.0
| | | | +--- com.android.support:support-annotations:26.1.0
| | | | \--- com.android.support:support-compat:26.1.0 (*)
| | | +--- com.android.support:support-core-utils:26.1.0
| | | | +--- com.android.support:support-annotations:26.1.0
| | | | \--- com.android.support:support-compat:26.1.0 (*)
| | | +--- com.android.support:support-core-ui:26.1.0
| | | | +--- com.android.support:support-annotations:26.1.0
| | | | \--- com.android.support:support-compat:26.1.0 (*)
| | | \--- com.android.support:support-fragment:26.1.0
| | | +--- com.android.support:support-compat:26.1.0 (*)
| | | +--- com.android.support:support-core-ui:26.1.0 (*)
| | | \--- com.android.support:support-core-utils:26.1.0 (*)
| | \--- com.google.android.gms:play-services-basement-license:11.4.2
| +--- com.google.firebase:firebase-common:11.4.2
| | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | +--- com.google.android.gms:play-services-tasks:11.4.2
| | | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | | \--- com.google.android.gms:play-services-tasks-license:11.4.2
| | \--- com.google.firebase:firebase-common-license:11.4.2
| +--- com.google.firebase:firebase-analytics-impl:11.4.2
| | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | +--- com.google.firebase:firebase-iid:11.4.2
| | | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | | +--- com.google.firebase:firebase-common:11.4.2 (*)
| | | \--- com.google.firebase:firebase-iid-license:11.4.2
| | +--- com.google.firebase:firebase-common:11.4.2 (*)
| | +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| | \--- com.google.firebase:firebase-analytics-impl-license:11.4.2
| \--- com.google.firebase:firebase-analytics-license:11.4.2
+--- com.android.support:multidex:1.0.2
+--- com.android.support:appcompat-v7:26.1.0
| +--- com.android.support:support-annotations:26.1.0
| +--- com.android.support:support-v4:26.1.0 (*)
| +--- com.android.support:support-vector-drawable:26.1.0
| | +--- com.android.support:support-annotations:26.1.0
| | \--- com.android.support:support-compat:26.1.0 (*)
| \--- com.android.support:animated-vector-drawable:26.1.0
| +--- com.android.support:support-vector-drawable:26.1.0 (*)
| \--- com.android.support:support-core-ui:26.1.0 (*)
+--- com.android.support:recyclerview-v7:26.1.0
| +--- com.android.support:support-annotations:26.1.0
| +--- com.android.support:support-compat:26.1.0 (*)
| \--- com.android.support:support-core-ui:26.1.0 (*)
+--- com.android.support:design:26.1.0
| +--- com.android.support:support-v4:26.1.0 (*)
| +--- com.android.support:appcompat-v7:26.1.0 (*)
| +--- com.android.support:recyclerview-v7:26.1.0 (*)
| \--- com.android.support:transition:26.1.0
| +--- com.android.support:support-annotations:26.1.0
| \--- com.android.support:support-v4:26.1.0 (*)
+--- com.android.support.constraint:constraint-layout:1.0.2 -> 1.1.0-beta1
| \--- com.android.support.constraint:constraint-layout-solver:1.1.0-beta1
+--- com.android.support:cardview-v7:26.1.0
| \--- com.android.support:support-annotations:26.1.0
+--- io.reactivex.rxjava2:rxandroid:2.0.1
| \--- io.reactivex.rxjava2:rxjava:2.0.1 -> 2.1.5
| \--- org.reactivestreams:reactive-streams:1.0.1
+--- io.reactivex.rxjava2:rxjava:2.1.5 (*)
+--- com.oakwoodsc.rxfirestore:rxfirestore-debug:1.0
+--- com.firebaseui:firebase-ui-auth:3.1.0
| +--- com.android.support:design:26.1.0 (*)
| +--- com.android.support:customtabs:26.1.0
| | +--- com.android.support:support-compat:26.1.0 (*)
| | \--- com.android.support:support-annotations:26.1.0
| +--- com.android.support.constraint:constraint-layout:1.1.0-beta1 (*)
| +--- com.google.firebase:firebase-auth:11.4.2
| | +--- com.google.android.gms:play-services-base:11.4.2
| | | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | | +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| | | \--- com.google.android.gms:play-services-base-license:11.4.2
| | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | +--- com.google.firebase:firebase-common:11.4.2 (*)
| | +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| | \--- com.google.firebase:firebase-auth-license:11.4.2
| +--- com.google.android.gms:play-services-auth:11.4.2
| | +--- com.google.android.gms:play-services-auth-api-phone:11.4.2
| | | +--- com.google.android.gms:play-services-base:11.4.2 (*)
| | | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | | +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| | | \--- com.google.android.gms:play-services-auth-api-phone-license:11.4.2
| | +--- com.google.android.gms:play-services-auth-base:11.4.2
| | | +--- com.google.android.gms:play-services-base:11.4.2 (*)
| | | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | | +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| | | \--- com.google.android.gms:play-services-auth-base-license:11.4.2
| | +--- com.google.android.gms:play-services-base:11.4.2 (*)
| | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| | \--- com.google.android.gms:play-services-auth-license:11.4.2
| \--- com.android.support:cardview-v7:26.1.0 (*)
+--- com.google.android.gms:play-services-location:11.4.2
| +--- com.google.android.gms:play-services-base:11.4.2 (*)
| +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| +--- com.google.android.gms:play-services-tasks:11.4.2 (*)
| \--- com.google.android.gms:play-services-location-license:11.4.2
\--- com.google.firebase:firebase-firestore:11.4.2
+--- com.google.android.gms:play-services-basement:11.4.2 (*)
+--- com.google.firebase:firebase-common:11.4.2 (*)
+--- com.google.android.gms:play-services-tasks:11.4.2 (*)
+--- com.squareup.okhttp:okhttp:2.7.2
| \--- com.squareup.okio:okio:1.6.0
\--- com.google.guava:guava:20.0
之后:build.gradle 依赖块(完全排除)
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation("com.google.android.gms:play-services-base:$playServicesVersion") {
exclude group: "com.android.support", module: "support-v4"
}
implementation 'com.android.support:multidex:1.0.2'
implementation "com.android.support:design:$supportLibraryVersion"
implementation("com.firebaseui:firebase-ui-auth:3.1.0") { // Remove once custom version
exclude group: "com.google.android.gms", module: "play-services-base"
exclude group: "com.google.android.gms", module: "play-services-basement"
exclude group: "com.google.android.gms", module: "play-services-tasks"
exclude group: "com.android.support", module: "design"
exclude group: "com.android.support", module: "support-compat"
exclude group: "com.android.support", module: "support-annotations"
exclude group: "com.android.support", module: "cardview-v7"
}
implementation("com.android.support:cardview-v7:$supportLibraryVersion") {
exclude group: "com.android.support", module: "support-annotations"
}
implementation('com.oakwoodsc.rxfirestore:rxfirestore-debug:1.0@aar') {
exclude group: 'io.reactivex.rxjava2', module: 'rxandroid'
exclude group: 'io.reactivex.rxjava2', module: 'rxjava'
}
implementation("com.google.android.gms:play-services-location:$playServicesVersion") {
exclude group: "com.google.android.gms", module: "play-services-base"
exclude group: "com.google.android.gms", module: "play-services-tasks"
exclude group: "com.google.android.gms", module: "play-services-basement"
}
implementation("com.google.firebase:firebase-firestore:$playServicesVersion") {
exclude group: "com.google.android.gms", module: "play-services-basement"
exclude group: "com.google.android.gms", module: "play-services-tasks"
}
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.5'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
之后:gradlew app:dependencies
输出:
减少重复...
+--- com.google.android.gms:play-services-base:11.4.2
| +--- com.google.android.gms:play-services-basement:11.4.2
| | \--- com.google.android.gms:play-services-basement-license:11.4.2
| +--- com.google.android.gms:play-services-tasks:11.4.2
| | +--- com.google.android.gms:play-services-basement:11.4.2 (*)
| | \--- com.google.android.gms:play-services-tasks-license:11.4.2
| \--- com.google.android.gms:play-services-base-license:11.4.2
+--- com.android.support:multidex:1.0.2
+--- com.android.support:design:26.1.0
| +--- com.android.support:support-v4:26.1.0
| | +--- com.android.support:support-compat:26.1.0
| | | +--- com.android.support:support-annotations:26.1.0
| | | \--- android.arch.lifecycle:runtime:1.0.0
| | | +--- android.arch.lifecycle:common:1.0.0
| | | \--- android.arch.core:common:1.0.0
| | +--- com.android.support:support-media-compat:26.1.0
| | | +--- com.android.support:support-annotations:26.1.0
| | | \--- com.android.support:support-compat:26.1.0 (*)
| | +--- com.android.support:support-core-utils:26.1.0
| | | +--- com.android.support:support-annotations:26.1.0
| | | \--- com.android.support:support-compat:26.1.0 (*)
| | +--- com.android.support:support-core-ui:26.1.0
| | | +--- com.android.support:support-annotations:26.1.0
| | | \--- com.android.support:support-compat:26.1.0 (*)
| | \--- com.android.support:support-fragment:26.1.0
| | +--- com.android.support:support-compat:26.1.0 (*)
| | +--- com.android.support:support-core-ui:26.1.0 (*)
| | \--- com.android.support:support-core-utils:26.1.0 (*)
| +--- com.android.support:appcompat-v7:26.1.0
| | +--- com.android.support:support-annotations:26.1.0
| | +--- com.android.support:support-v4:26.1.0 (*)
| | +--- com.android.support:support-vector-drawable:26.1.0
| | | +--- com.android.support:support-annotations:26.1.0
| | | \--- com.android.support:support-compat:26.1.0 (*)
| | \--- com.android.support:animated-vector-drawable:26.1.0
| | +--- com.android.support:support-vector-drawable:26.1.0 (*)
| | \--- com.android.support:support-core-ui:26.1.0 (*)
| +--- com.android.support:recyclerview-v7:26.1.0
| | +--- com.android.support:support-annotations:26.1.0
| | +--- com.android.support:support-compat:26.1.0 (*)
| | \--- com.android.support:support-core-ui:26.1.0 (*)
| \--- com.android.support:transition:26.1.0
| +--- com.android.support:support-annotations:26.1.0
| \--- com.android.support:support-v4:26.1.0 (*)
+--- com.firebaseui:firebase-ui-auth:3.1.0
| +--- com.android.support:customtabs:26.1.0
| +--- com.android.support.constraint:constraint-layout:1.1.0-beta1
| | \--- com.android.support.constraint:constraint-layout-solver:1.1.0-beta1
| +--- com.google.firebase:firebase-auth:11.4.2
| | +--- com.google.firebase:firebase-common:11.4.2
| | | \--- com.google.firebase:firebase-common-license:11.4.2
| | \--- com.google.firebase:firebase-auth-license:11.4.2
| \--- com.google.android.gms:play-services-auth:11.4.2
| +--- com.google.android.gms:play-services-auth-api-phone:11.4.2
| | \--- com.google.android.gms:play-services-auth-api-phone-license:11.4.2
| +--- com.google.android.gms:play-services-auth-base:11.4.2
| | \--- com.google.android.gms:play-services-auth-base-license:11.4.2
| \--- com.google.android.gms:play-services-auth-license:11.4.2
+--- com.android.support:cardview-v7:26.1.0
+--- com.oakwoodsc.rxfirestore:rxfirestore-debug:1.0
+--- com.google.android.gms:play-services-location:11.4.2
| \--- com.google.android.gms:play-services-location-license:11.4.2
+--- com.google.firebase:firebase-firestore:11.4.2
| +--- com.google.firebase:firebase-common:11.4.2 (*)
| +--- com.squareup.okhttp:okhttp:2.7.2
| | \--- com.squareup.okio:okio:1.6.0
| \--- com.google.guava:guava:20.0
+--- io.reactivex.rxjava2:rxandroid:2.0.1
| \--- io.reactivex.rxjava2:rxjava:2.0.1 -> 2.1.5
| \--- org.reactivestreams:reactive-streams:1.0.1
\--- io.reactivex.rxjava2:rxjava:2.1.5 (*)
首先,您不需要所有这些 exclude
。如果两个依赖使用com.android.support:support-v4:26.1.0
,它只包含一次。它被列出两次,所以你可以看到谁依赖它。
您可能要考虑的一个选项是 turning on ProGuard。这将删除所有未使用的代码,包括库代码。在你的情况下,它可能会让你低于 65k 限制。
要使用它,请在 build.gradle 中进行设置: 发布 { minifyEnabled 真 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }
您需要创建 proguard-rules.pro
并使用特定于您的应用程序的一些指令填充它。请务必查看完整文档,了解您可能需要在其中包含的内容。
虽然在没有 ProGuard 的情况下保持在 65k 限制以下是可能的,但大多数中等复杂度的应用程序会很快超过它,而且我发现避免像 AppCompat 这样的库以努力保持在 65k 限制以下是通常比它值得的工作更多。
即使使用 ProGuard,一些应用程序也会遇到 65k 的限制。其他应用程序可能出于某种原因不想使用 ProGuard。在这些情况下,您最好的选择是 enable multidex,这样您就可以超过 65k 的限制。
Proguard 是解决您问题的关键。确保您应用的 build.gradle
文件在 buildtypes
buildTypes {
//debug
//staging
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
在我的例子中,我的发布版本缩小了代码,缩减了资源,最重要的是使用混淆器来减少其他库带来的代码膨胀。可以复制代码proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
观看 David East 精彩的 short video 关于 Proguard 的好处。
此外,如果您还没有查看 Proguard 文档