【问题标题】:Error Building Android App构建 Android 应用程序时出错
【发布时间】:2016-02-21 18:33:23
【问题描述】:

我在尝试构建应用程序时遇到了一个奇怪的错误。我认为它与我的代码无关,需要一些帮助来解决它。当我按下运行时,logcat 给了我这个错误:

无法将签到的统计信息上传到 cyanogen 服务器

javax.net.ssl.SSLHandshakeException:连接被对等方关闭 在 com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(本机方法) 在 com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:318) 在 com.android.okhttp.Connection.upgradeToTls(Connection.java:201) 在 com.android.okhttp.Connection.connect(Connection.java:155) 在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276) 在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211) 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382) 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106) 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:217) 在 com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218) 在 com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:25) 在 com.android.settings.cmstats.StatsUploadJobService.uploadToCyanogen(StatsUploadJobService.java:223) 在 com.android.settings.cmstats.StatsUploadJobService.access$000(StatsUploadJobService.java:43) 在 com.android.settings.cmstats.StatsUploadJobService$StatsUploadTask.doInBackground(StatsUploadJobService.java:121) 在 com.android.settings.cmstats.StatsUploadJobService$StatsUploadTask.doInBackground(StatsUploadJobService.java:93) 在 android.os.AsyncTask$2.call(AsyncTask.java:292) 在 java.util.concurrent.FutureTask.run(FutureTask.java:237) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)

gradle 控制台然后说:

意外的顶级异常: com.android.dex.DexIndexOverflowException:方法 ID 不在 [0, 0xffff] 中:65536 在 com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:484) 在 com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:261) 在 com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:473) 在 com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:161) 在 com.android.dx.merge.DexMerger.merge(DexMerger.java:188) 在 com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504) 在 com.android.dx.command.dexer.Main.runMonoDex(Main.java:334) 在 com.android.dx.command.dexer.Main.run(Main.java:277) 在 com.android.dx.command.dexer.Main.main(Main.java:245) 在 com.android.dx.command.Main.main(Main.java:106)

我想知道这是否与我手机的硬件或在其上运行的 cyanogenmod 软件有关导致错误。

感谢您的帮助。

【问题讨论】:

  • 我建议你到处搜索DexIndexOverflowException
  • 您可以发布您的应用级 build.gradle 文件吗?
  • 检查thisthis

标签: android android-gradle-plugin cyanogenmod


【解决方案1】:

您达到了 DEX 64k 方法限制。

有几个解决方案可以帮助您解决这个问题:

  • 删除未使用的 gradle 依赖项
  • 用大量方法用较小的方法替换库,例如:

    compile 'com.google.android.gms:play-services-analytics:8.4.0'
    

    ->

    compile 'com.google.android.gms:play-services-base:8.4.0'
    compile 'com.google.android.gms:play-services-location:8.4.0'
    compile 'com.google.android.gms:play-services-maps:8.4.0'
    ...
    
  • 通过配置ProGuard删除未使用的代码

  • 启用Multidex:

    build.gradle

    android {
        ...
    
        defaultConfig {
            ...
            // Enabling multidex support.
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
        compile 'com.android.support:multidex:1.0.0'
    }
    

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.android.multidex.myapplication">
        <application
            ...
            android:name="android.support.multidex.MultiDexApplication">
            ...
        </application>
    </manifest>
    

参考:

Building Apps with Over 65K Methods.

【讨论】:

    【解决方案2】:

    com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 这一行表明您已超过编译器对每个 .dex 文件的 64k 方法限制。阅读它。解决方案包括使用Multidex 或更多解决方案https://www.contentful.com/blog/2014/10/30/android-and-the-dex-64k-methods-limit/。这可能是其他问题的重复。看着 How to solve the issue with Dalvik compiler limitation on 64K methods?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      相关资源
      最近更新 更多