gpt4 book ai didi

android - Android 中每个 dex 文件的方法限制为 64K

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:05:14 34 4
gpt4 key购买 nike

我遇到了这个问题 java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536 我决定从 dex 文件中排除一些方法。我的 gradle.build:

compile ('com.google.android.gms:play-services:+') {
exclude group: "com.google.android.gms.analytics"
exclude group: "com.google.android.gms.games"
exclude group: "com.google.android.gms.plus"
exclude group: "com.google.android.gms.drive"
exclude group: "com.google.android.gms.ads"
}

我认为这段代码是错误的,因为有错误 method ID not in [0, 0xffff]...。如何排除 Google Play 服务中不需要的部分?我只使用 map 和 GCM。

已更新。

谢谢反转。这是非常有用的代码。有一个用于获取方法计数的脚本(也可以查看现有包的名称)https://gist.github.com/JakeWharton/6002797 (source ./dex.sh; dex-method-count-by-package test.apk)

在使用 reVerse 的答案中的代码 fragment 之前

Count of methods / Package
...
22484 com.google.android.gms
2 com.google.android.gms.actions
578 com.google.android.gms.ads
152 com.google.android.gms.ads.doubleclick
25 com.google.android.gms.ads.identifier
86 com.google.android.gms.ads.internal
86 com.google.android.gms.ads.internal.rawhtmlad
86 com.google.android.gms.ads.internal.rawhtmlad.client
88 com.google.android.gms.ads.mediation
4 com.google.android.gms.ads.mediation.admob
73 com.google.android.gms.ads.mediation.customevent
26 com.google.android.gms.ads.purchase
118 com.google.android.gms.ads.search
...
858 com.google.android.gms.games.internal.api
43 com.google.android.gms.games.internal.constants
8 com.google.android.gms.games.internal.data
31 com.google.android.gms.games.internal.events
9 com.google.android.gms.games.internal.experience
215 com.google.android.gms.games.internal.game
56 com.google.android.gms.games.internal.multiplayer
23 com.google.android.gms.games.internal.notification
80 com.google.android.gms.games.internal.player
86 com.google.android.gms.games.internal.request
...

在使用 reVerse 的答案中的代码 fragment 后,包:广告、游戏等被删除。

最佳答案

更新 - Google Play 服务 6.5 (12-08-14)

在 6.5 版中,Google 终于取消了与 Google Play 服务的 bundle 。因此,从现在开始,可以有选择地将 API 编译到您的可执行文件中。

示例(仅使用 AdMob 和 Android Wear API)

compile 'com.google.android.gms:play-services-wearable:6.5.+'
compile 'com.google.android.gms:play-services-ads:6.5.+'

对于所有其他单独的 Google Play 服务 API,请检查 this page on d.android.com .

注意通常不鼓励使用+。截至目前,当前的正确版本为 6.5.87。有关详细信息,请参阅 official Blog-Post (click) .


前段时间 Medium.com 上有一篇文章 "[DEX] Sky’s the limit? No, 65K methods is" (绝对值得一读),它描述了一种使用 shell 脚本剥离 Google Play 服务 的方法,您可以找到 here (google-play-services-strip-script) .
虽然这是一个选项,但还有一个 gradle task 可以为您执行此操作:

def toCamelCase(String string) {
String result = ""
string.findAll("[^\\W]+") { String word ->
result += word.capitalize()
}
return result
}

afterEvaluate { project ->
Configuration runtimeConfiguration = project.configurations.getByName('compile')
ResolutionResult resolution = runtimeConfiguration.incoming.resolutionResult
// Forces resolve of configuration
ModuleVersionIdentifier module = resolution.getAllComponents().find { it.moduleVersion.name.equals("play-services") }.moduleVersion

String prepareTaskName = "prepare${toCamelCase("${module.group} ${module.name} ${module.version}")}Library"
File playServiceRootFolder = project.tasks.find { it.name.equals(prepareTaskName) }.explodedDir

Task stripPlayServices = project.tasks.create(name: 'stripPlayServices', group: "Strip") {
inputs.files new File(playServiceRootFolder, "classes.jar")
outputs.dir playServiceRootFolder
description 'Strip useless packages from Google Play Services library to avoid reaching dex limit'

doLast {
copy {
from(file(new File(playServiceRootFolder, "classes.jar")))
into(file(playServiceRootFolder))
rename { fileName ->
fileName = "classes_orig.jar"
}
}
tasks.create(name: "stripPlayServices" + module.version, type: Jar) {
destinationDir = playServiceRootFolder
archiveName = "classes.jar"
from(zipTree(new File(playServiceRootFolder, "classes_orig.jar"))) {
-----> // Specify what should be removed
}
}.execute()
delete {
delete (file(new File(playServiceRootFolder, "classes_orig.jar")))
}
}
}

project.tasks.findAll { it.name.startsWith('prepare') && it.name.endsWith('Dependencies') }.each { Task task ->
task.dependsOn stripPlayServices
}
}

注意:这取自Gradle task to strip unused packages on Google Play Services library @GitHubGist

与您相关的部分是箭头在 task.create(...) 中的位置。在那里您需要指定应删除哪些部分。所以在你的情况下,只需在其中写下这样的东西:

exclude "com/google/ads/**"
exclude "com/google/android/gms/analytics/**"
exclude "com/google/android/gms/games/**"
exclude "com/google/android/gms/panorama/**"
exclude "com/google/android/gms/plus/**"
exclude "com/google/android/gms/drive/**"
exclude "com/google/android/gms/ads/**"
exclude "com/google/android/gms/wallet/**"
exclude "com/google/android/gms/wearable/**"

这将删除除 Maps- 和 GCM-Part 之外的所有内容。

注意:为了使用它,只需将 gradle-task 的内容复制到应用模块的 build.gradle 文件的底部。

关于android - Android 中每个 dex 文件的方法限制为 64K,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25607908/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com