首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >超过旧于棒棒糖的API的64k限制,但不是较新的API

超过旧于棒棒糖的API的64k限制,但不是较新的API
EN

Stack Overflow用户
提问于 2016-04-12 05:44:30
回答 4查看 24.6K关注 0票数 19

所以我想知道为什么当我尝试在早于棒棒糖的android版本上运行我的应用程序时遇到64k dex方法限制,而它在较新的版本上运行得很好。

会不会是这样,因为在旧版本上运行时,支持库实际上是被引用的?

这是我的gradle:

代码语言:javascript
复制
    apply plugin: 'com.android.application'

    android {
        compileSdkVersion 23
        buildToolsVersion '23.0.2'
    lintOptions {
        checkReleaseBuilds true
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }

    defaultConfig {
        applicationId "com.domain.myapp"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 27
        versionName "1.2"

        // Vector compat
        vectorDrawables.useSupportLibrary = true 
    }

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

dependencies {

    compile files('libs/commons-io-2.4.jar')
    compile files('libs/activation.jar')
    compile files('libs/additionnal.jar')
    compile files('libs/mail.jar')
    compile project(':libraries:preferencefragment')

    // Gmail API
    compile('com.google.api-client:google-api-client-android:1.20.0') {
        exclude group: 'org.apache.httpcomponents'
    }
    compile('com.google.apis:google-api-services-gmail:v1-rev29-1.20.0') {
        exclude group: 'org.apache.httpcomponents'
    }

    // Play Services
    compile 'com.google.android.gms:play-services-location:8.4.0'
    compile 'com.google.android.gms:play-services-maps:8.4.0'
    compile 'com.google.android.gms:play-services-ads:8.4.0'
    compile 'com.google.android.gms:play-services-analytics:8.4.0'
    compile 'com.google.android.gms:play-services-identity:8.4.0'

    // Support libraries
    compile 'com.android.support:support-v4:23.3.0'
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'com.android.support:cardview-v7:23.3.0'
    compile 'com.android.support:design:23.3.0'

    compile 'com.github.bumptech.glide:glide:3.6.1'
    compile 'com.anjlab.android.iab.v3:library:1.0.20'
    compile 'com.sothree.slidinguppanel:library:2.0.3'
    compile 'com.commit451:PhotoView:1.2.5'

    compile('com.github.afollestad.material-dialogs:core:0.8.5.7@aar') {
        transitive = true
    }
}

编辑:

需要说明的是:当我试图在运行KitKat API19的模拟器上运行应用程序时,就会出现这种情况

gradle控制台中的崩溃日志:

代码语言:javascript
复制
...
:App:generateDebugInstantRunAppInfo
:App:transformClassesWithDexForDebug
AGPBI: {"kind":"error","text":"The number of method references in a .dex file cannot exceed 64K.\nLearn how to resolve this issue at https://developer.android.com/tools/building/multidex.html","sources":[{}],"original":"UNEXPECTED TOP-LEVEL EXCEPTION:\ncom.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536\n\tat com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:484)\n\tat com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:261)\n\tat com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:473)\n\tat com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:161)\n\tat com.android.dx.merge.DexMerger.merge(DexMerger.java:188)\n\tat com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)\n\tat com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)\n\tat com.android.dx.command.dexer.Main.run(Main.java:277)\n\tat com.android.dx.command.dexer.Main.main(Main.java:245)\n\tat com.android.dx.command.Main.main(Main.java:106)\n","tool":"Dex"}

 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':App:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

来自消息窗口的崩溃消息:

代码语言:javascript
复制
:App:transformClassesWithDexForDebug
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
Error:Execution failed for task ':App:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-04-12 07:39:04

要回答您的特定问题,可以这样回答:

  • 此方法计数限制是针对DEX (Dalvik可执行文件)文件的。
  • 此限制的常见解决方法是具有多个DEX文件。
  • 旧版本的安卓系统本身不支持来自棒棒糖的多个DEX files.
  • Starting,系统本身就支持它。

这就是为什么它在旧设备上失败,但在新设备上有效的原因。它与支持库无关。

要在我的答案中添加更多有用的内容:

但也许有些人想知道的是如何在旧设备上解决这个问题,请注意,我在上面的要点中使用了natively这个词。这意味着,有一些变通方法可以让旧平台支持它,但你必须将这些变通方法编码到你的应用程序中。

这个解决方法(甚至这个问题本身)在这个谷歌指南上有详细的解释:http://developer.android.com/tools/building/multidex.html

它的基础是:

在android->default config multiDexEnabled true

  • on
  • 中的构建脚本中,将multidex添加到您的依赖项和multiDex中,使您的应用程序从MultidexApplication android:name="android.support.multidex.MultiDexApplication"扩展,或者,如果您需要为自己的应用程序创建Application子类,则使您的应用程序从它扩展。
票数 36
EN

Stack Overflow用户

发布于 2016-04-12 09:10:10

完全同意@Budius。您必须在清单中提到一个应用程序类。让你的应用程序类扩展MultiDexApplication。

还需要做一件事。在MultiDexApplication类中调用attach基上下文

代码语言:javascript
复制
public class MyApplicationClass extends MultiDexApplication... {
....

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(MyApplicationClass.this);
    }
   ...
}

这对我来说在之前和之后的棒棒糖设备上都工作得很好。

票数 2
EN

Stack Overflow用户

发布于 2016-08-02 21:33:08

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36559835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档