2016-04-15 46 views
22

我一直在試圖爲我的應用程序構建apk文件,但是,我收到錯誤:方法引用的數量不能超過64K。無法構建apk:方法引用的數量不能超過64K

這裏有錯誤,

錯誤:方法引用的一個.DEX文件的數量不能超過64K。 瞭解如何解決此問題https://developer.android.com/tools/building/multidex.html

錯誤:執行任務':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 'C:\Program Files\Java\jdk1.7.0_15\bin\java.exe'' finished with non-zero exit value 2

這是我的gradle這個文件,

apply plugin: 'com.android.application' 

android { 
compileSdkVersion 23 
buildToolsVersion "23.0.3" 

defaultConfig { 
    applicationId "nikhilraghavendra.hopper" 
    minSdkVersion 21 
    targetSdkVersion 23 
    versionCode 1 
    versionName "1.0" 
} 
buildTypes { 
    release { 
     shrinkResources true 
     minifyEnabled true 
     useProguard true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 
       'proguard-rules.pro' 
    } 
} 
packagingOptions { 
    exclude 'META-INF/LICENSE' 
    exclude 'META-INF/LICENSE-FIREBASE.txt' 
    exclude 'META-INF/NOTICE' 
} 
} 

dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) 
testCompile 'junit:junit:4.12' 
compile 'com.android.support:appcompat-v7:23.2.1' 
compile 'com.android.support:design:23.2.1' 
compile 'com.google.android.gms:play-services-identity:8.4.0' 
compile 'com.firebase:firebase-client-android:2.3.1' 
compile 'com.android.support:cardview-v7:23.2.1' 
compile 'com.google.android.gms:play-services:8.4.0' 
} 

我想建立apk文件並部署它沒有任何問題,我該怎麼辦呢?

更新

我也試過以下

apply plugin: 'com.android.application' 

android { 
compileSdkVersion 23 
buildToolsVersion "23.0.3" 

dexOptions { 
    maxProcessCount = 4 // this is the default value 
} 

dataBinding{ 
    enabled = true 
} 

defaultConfig { 
    applicationId "nikhilraghavendra.hopper" 
    minSdkVersion 21 
    targetSdkVersion 23 
    resConfigs "en", "fr" 
    versionCode 1 
    versionName "1.0" 
} 
buildTypes { 
    release { 
     shrinkResources true 
     minifyEnabled true 
     useProguard true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 
       'proguard-rules.pro' 
    } 
    debug { 
     minifyEnabled true 
     useProguard false 
    } 
} 
packagingOptions { 
    exclude 'META-INF/LICENSE' 
    exclude 'META-INF/LICENSE-FIREBASE.txt' 
    exclude 'META-INF/NOTICE' 
} 
} 

dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) 
testCompile 'junit:junit:4.12' 
compile 'com.android.support:appcompat-v7:23.2.1' 
compile 'com.android.support:design:23.2.1' 
compile 'com.google.android.gms:play-services-identity:8.4.0' 
compile 'com.firebase:firebase-client-android:2.3.1' 
compile 'com.android.support:cardview-v7:23.2.1' 
compile 'com.google.android.gms:play-services:8.4.0' 
} 

這是生產的消息:

錯誤:執行失敗的任務 ':應用程序:transformClassesWithNewClassShrinkerForDebug'。

Warnings found during shrinking, please use -dontwarn or -ignorewarnings to suppress them.

我該如何處理這個問題並構建一個合適的apk?請幫忙。

+0

http://developer.android.com/tools/building/multidex.html – camelCaseCoder

+0

http://developer.android.com/tools/building/multidex .html 你必須啓用Multidex,請按照上面的鏈接 – Azahar

回答

57
android { 
    compileSdkVersion 26 
    buildToolsVersion "26.0.0" 

    defaultConfig { 
     applicationId "com.try.app" 
     minSdkVersion 21 
     targetSdkVersion 26 
     versionCode 1 
     versionName "1.0" 
     multiDexEnabled true 
    } 

這裏multiDexEnabled true應該做的遊戲

更新:支持最新的Android版本
1.如果您minSdkVersion設置到或更高,您需要做的就是將multiDexEnabled設置爲true r模塊級build.gradle文件,如上所示。
2.但是,如果你的minSdkVersion設置爲或更低,則必須按如下方式使用multidex支持庫與上面的修改一起:

dependencies { 
    compile 'com.android.support:multidex:1.0.1' 
} 
從上面除了支持庫的

除此之外,你需要對此應用程序類進行更改,如Link中所述。

最佳實踐:
1.使用proguard刪除任何未使用的代碼。
2.避免在項目中添加不必要的依賴項。
3.如果需要有限數量的方法或任何開源庫的類,那麼建議您只克隆項目中的那些方法或類,因爲它不僅可以讓您完全控制它們,還可以讓proguard對它們執行操作,你的代碼中沒有任何未使用的方法。

來源:Android Developers - Configure Apps with 64K Method count

+0

就是這樣嗎?這裏描述的其餘部分呢? https://developer.android.com/studio/build/multidex.html –

+0

嗨@AndrewS,感謝您指出這些東西。此答案自一段時間以來未更新,將盡快更新。謝謝 –

+0

你什麼時候更新你的答案?我們所有人都在等待你的更新 –

4

將這個裏面你defaultConfig

multiDexEnabled true 
29

無法建立APK:方法引用的不能超過當應用.DEX文件中有超過65,536的方法64K發生的次數。

超越65K方法,這意味着法計數超過65,536方法 有不同的方法來解決這個問題:需要哪些

1.減少依賴於你的項目 放依賴的gradle中

我從其他開發人員那裏找到的大多數問題都是在他們的項目中使用Google Play Services這樣的項目。

compile 'com.google.android.gms:play‐services: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' 
compile 'com.google.android.gms:play‐services‐ads:8.4.0' 

2.設定最低SDK版本21或更高

爲什麼它工作時,變更最短SDK到21?這是因爲Android 5.0或更高版本使用支持MultiDex而不是Dalvik的ART (Android Runtime)。所以ART可以支持超過65,536個 的方法。

3.使用Proguard的減少無用的方法

4.使用MultiDex

但這些都是MultiDex庫的限制

•月,而應用的啓動,如果發生.DEX ANR文件太大。

•應該定義最低SDK到14或更高版本。

•如果分配內存超出限制,MulitDex會佔用更多的內存,並可能在應用程序運行時崩潰。

•需要更多的建立時間,當你構建項目

+0

不要玩你的谷歌服務依賴關係的人根據這個解釋。如果你有一個工作系統,我的gradle現在正在運行..( – Sam

+0

Upvoted。對於所有這些與multidex有關的數學是什麼?還有一個縮小操作。https://developers.google.com/android/guides/設置這是一個分離服務列表,只需選擇要使用的內容即可。 – CodeToLife

相關問題