安卓:65k问题无法解决

7
我已经做了两天了。我尝试了所有与multi-dexing相关的解决方案,但都没有用。我删除了所有内容,以便可以重新开始。
应用程序gradle:
apply plugin: 'com.android.application'
android {
          compileSdkVersion 21
          buildToolsVersion "21.1.2"
          defaultConfig {
          applicationId "com.bilboldev.joestrategy"
          minSdkVersion 15
          targetSdkVersion 21
          versionCode 1
          versionName "1.0"
          multiDexEnabled true
      }
buildTypes {
    release {
        minifyEnabled false

        proguardFiles getDefaultProguardFile('proguard-android.txt'),     'proguard-rules.pro'
      }
   }
}

dependencies {
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.google.android.gms:play-services-ads:9.0.0'
}

apply plugin: 'com.google.gms.google-services'

项目 gradle:
buildscript {
repositories {
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:1.1.0'
    classpath 'com.google.gms:google-services:3.0.0'

}
}



allprojects {
repositories {
    jcenter()
}
}

内部清单:

 <meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />
 <application
    android:name="android.support.multidex.MultiDexApplication" ...

我读到的最常见的解决方案是不包括所有谷歌服务,只包括你需要的部分。因此我只编译了广告部分。但是它仍然不起作用。
一些类找不到:

E/dalvikvm﹕无法找到类'android.os.UserManager',引用自方法com.google.android.gms.common.zze.zzan

E/dalvikvm﹕无法找到类'android.app.AppOpsManager',引用自方法com.google.android.gms.internal.zzpv.zzg

E/dalvikvm﹕无法找到类'com.google.android.gms.internal.zzamq',引用自方法com.google.android.gms.internal.zzdi.zze

等等...

我尝试了所有我找到的方法,其中之一是this。 我还使用了在结尾提到的 dexcount 插件来计算我的应用程序中的方法数。我不知道如何将文件附加到问题上,所以你可以从here下载 debug.txt。
注意:我认为这是一个65k的限制问题,因为在4.4的Android手机上,广告显示正常,logcat中没有错误。但是,在两个4.2的Android手机上,广告不显示且出现错误。然而,如果您查看debug.txt文件: 方法数15236,字段数5010,包/类名android 14282,字段数9575,com其余小于3k。 我只看到了65k...除非Android及其下面的内容(android.something)堆栈。 我在这里错过了什么?

我不确定理解“找不到类”如何意味着您达到了65k限制。而且,您的minifyEnabled为false,因此不应该混淆这些类。 - OneCricketeer
感谢您的评论。我认为问题是65k限制,是因为在搜索时我一直达到了这个限制。人们添加gms后也经常遇到这个问题。这个链接是我得出这个结论的一个例子。共同点:D / dalvikvm,VFY:在0x0000处替换操作码0x71等。 https://dev59.com/oJTfa4cB1Zd3GeqPU7tJ#35830652 - Moussa Khalil
1
当然可以。您还可以阅读此页面上的第二个蓝色框,但是您已经很好地处理了,只包括广告即可。 https://developers.google.com/android/guides/setup#add_google_play_services_to_your_project - OneCricketeer
这不是一个论坛。请不要编辑您的问题以包含答案。要标记问题已解决,只需单击投票箭头下方的灰色复选标记接受答案即可。 - anon
@QPaysTaxes 我已经做了那个...我很久以前就添加了一个答案并接受了它。 - Moussa Khalil
抱歉,Ryan。我本来以为答案会在顶部,但我忘记了自己的回答不会被固定在那里。 - anon
3个回答

1

添加GMS后,您应该轻松达到了64K限制。

那么让我们来看看这里的情况:

  • 当您可能应该高于64K方法时,您的方法数量低于64K。
  • 您缺少类。

没有完整的Gradle文件集,我猜测问题与Proguard切掉您想要保留的内容有关。我建议首先完全关闭Proguard混淆并测试是否解决了该问题。


更新了带有项目和应用 gradle 的问题。此外,与清单相关的部分也有所改动。我认为在你给我的链接中没有 pro guard 目录。将 minifyEnabled 设为 false 是否能有效关闭 proguard。我对这方面还不是很熟悉 : ) 即使我删除了这一行 "proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'",但仍然没有成功。 - Moussa Khalil
非常感谢您指引我正确的方向,先生。这些类缺失是由于与Android版本相关的过时API,而不是Proguard将它们消除。附注:只有在添加全部GMS时才会超过65k :) - Moussa Khalil

0

看起来这些类没有显示的原因是它们与我的某些手机上的谷歌游戏服务不兼容。起初,我以为我已经更新到最新版本,因为我无法再更新谷歌播放服务。但我错了,因为“最新版本”是基于您的手机可以处理的最大版本(这是我能想到的最好的解释)。

解决方案是更新与相关版本(Android 4.1.2 Google APIs等)有关的sdk API。

导致 dexing 解决方案无效的原因是,虽然具有类似于 65k 方法限制的症状,但它与过时的 API 相关。

如果您遇到需要 Dexing 但仍面临缺少类的情况,则可能是您的问题 :)

android W/GooglePlayServicesUtil 谷歌播放服务已过期。即使您的移动 gms“最新”,如果在 logcat 中看到这一点,则说明您有此问题

编辑:Stackoverflow 不会让我接受自己的答案,但这就是答案。除非管理员可以将其设置为已接受,否则我将在两天内更新


0

ads 依赖于其他的依赖项,不能单独运行。首先,请尝试包含此依赖项:

compile "com.google.android.gms:play-services-base:9.0.0"

没有运气。我的代码在4.4安卓手机上可以运行 :)。 - Moussa Khalil
base 不是一个传递依赖吗? - OneCricketeer
@cricket_007,你是对的,POM文件中使用了“compile”作用域,因此应该被包含在内。 - Egor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接