- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我启动了一个新的应用程序,它大量使用了 firebase 功能以及支持库。我很快就达到了 65k dex 的限制,尽管考虑到应用程序的简单性,我没有理由应该在那里。我知道我需要排除某些我没有用的依赖项,所以我一直在使用 gradlew app:dependencies
来分析依赖项并提取不止一次提取的内容或我不提取的内容不需要。
尽管有大量的 exclude
,但我无法大幅减少方法计数(仅 3%)。我只是坚持使用 multi-dex 吗?如果不是,我该如何更有效地减少方法计数?
更多信息:
这是 build.gradle 依赖项 block 和 gradlew app:dependencies 输出的之前/之后
。如果有帮助的话,我很乐意发布每个库有多少方法的 dexcount 文本输出。我可以说,方法计数的最大贡献者是支持库和 com.google.common.* 和 com.google.android.gms.*
瘦身前
瘦身后
之前:build.gradle 依赖 block (不排除)
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 依赖 block (全部排除)
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 限制以下通常更有效工作超过它的值(value)。
即使使用 ProGuard,一些应用程序也会遇到 65k 的限制。其他应用程序可能出于某种原因不想使用 ProGuard。在这些情况下,您最好的选择是 enable multidex ,这使您可以超过 65k 的限制。
关于android - 如何正确减少应用程序方法数(低于 dex 限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47817801/
我有 5 个对象,a、b、c。d 和 e。 5个对象的hashcode如下: a => 72444 b => 110327396 c => 107151 d => 2017793190 e => 68
我目前正在为我当前的元素创建媒体查询,我目前面临的问题是某些东西导致我的导航栏在宽度低于 600 像素时无法响应。所发生的情况如附图所示。 这个问题其实我在之前的元素中曾经解决过一次,但是我对比了代码
我正在为网页编写媒体查询,并设法为 768 及以下版本编写媒体查询。但它不能正常工作。我想捕捉大多数 320 像素的手机(iphone4、iphone5、iphone3、asus galaxy 7、s
我开发了一个android应用,我所有android低于api 23的用户都无法连接到服务器,其余的都正常工作,从今天(2020-05-30)开始,在这一天之前多年来一直正常工作。 任何想法是什么原因
我正在上一门加密课,主要是作为学术练习,我一直在尝试获得尽可能高的速度。我发现了一些奇怪的事情,即异或字节数组的成本非常低,但在相同大小的字节数组上使用 arraycopy 的成本更高。我想这一定是一
我启动了一个新的应用程序,它大量使用了 firebase 功能以及支持库。我很快就达到了 65k dex 的限制,尽管考虑到应用程序的简单性,我没有理由应该在那里。我知道我需要排除某些我没有用的依赖项
我在 Lollipop 及以下发生了奇怪的崩溃。尝试从服务器下载文件时出现安全异常,但在运行 Marshmallow 及以上版本的设备中,应用程序不会崩溃。 Logcat: Caused by: ja
我正在构建一个相当简单的网站,我需要它具有一定的响应能力。 现在,当我调整浏览器大小时,导航菜单与 Logo 标题重叠,变得非常困惑。 HTML: Prince Innoce
如演示中所示,maxValue 设置为 2017 年,但图表一直到 2020 年。 如何让图表真正停在 2017 年?它在我的页面上占用了太多空间,因此我想对其进行优化 See demo fiddle
我正在用 python 尝试第二个 Project Euler 问题,想了解为什么我的代码不起作用。 此代码查找低于 400 万的偶数斐波那契数的总和 counter = 2 total = 0 wh
我想回答其中一个问题,这些问题有时是由销售人员试图在预算内进行销售而交给我们开发人员的。 我们有一个客户需要以下内容: 支持 AD 身份验证的文档管理系统(即使服务器可能位于其他位置 - 可能位于 V
我有一系列值(Pandas DF 或 Numpy Arr): vals = [0,1,3,4,5,5,4,2,1,0,-1,-2,-3,-2,3,5,8,4,2,0,-1,-3,-8,-20,-10,
当我创建使用 Google map API v2 的项目时,这条线有问题。 GoogleMap map = ((MapFragment) getFragmentManager().findFragme
如何在 UITableView 下方但在 TabBar 上方放置一个按钮,以便 UIButton 保持静止(不随 tableview 滚动)? 这是一张我想要帮凶的照片:http://i.imgur.
我正在使用 MockMvcResultMatchers 来测试我的 Controller 类。 这是一个示例代码 RequestBuilder request = get("/empl
function randomise(){ var ran_number=Math.floor(Math.random() * 100); return ran_number;
我正在尝试为 iOS9 以下的 NSManagedObjects init(context:) 方法“polyfill”。有没有办法为 iOS10 进行预处理器可用性检查? 这是否有意义,或者是否会出
我对 Web 开发的冒险还很陌生。我在使用的网站上遇到问题。在我达到大约 640px 之前,我的响应式设计没有问题。一旦我达到 640px 或将我的 html 全部压缩到左侧,除了我的主页英雄和导航栏
所以,我遇到的问题真的很难解释,但是,当页面宽度小于 600 像素时,我试图让我的导航行为有所不同。我几乎按照我想要的方式工作,但是当我点击菜单按钮时,当它低于 600px 时,它会在它下面的内容顶部
我在一个多语言网站上工作,我想在它的图标下方放置一个固定语言的菜单 div。我正在使用 Bootstrap 3。
我是一名优秀的程序员,十分优秀!