###65536
Android 的 App 如果有包 Google play service ,
非常容易出現以下錯誤,
1 | Unable to execute dex: method ID not in [0, 0xffff]: 65536 |
官方目前只有提供 Gralde 解法,
但是仍然在使用 Ant build 的專案,
官方並沒有提供使用說明,
其實仍然是可以使用,
只是方法比較麻煩,
寫成教學提供大家參考。
###教學
將 android-support-multidex.jar 加入自己的專案中。(通常在這個目錄下
{sdk.dir}/extras/android/support/multidex/library/libs/android-support-multidex.jar
)繼承
MultiDexApplication
或1
2
3
4
5@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}將 3rd Party 或不會修改的 Lib 集合成一個 Jar ,到 SDK 目錄下的 build-tools 使用 Dx 來將這個 Jar 輸出成
classes2.dex
、classes3.dex
…等等,注意一定要照順序。把這些 Dex 檔案放入 Src 資料夾中。
把被打包的 Jar 加到依賴裡面,但是選擇不編譯,就像 android.jar 一樣。
完成,這樣就突破 65536 的限制了。
###後話
其實還有更簡單的方法,
去下載獨立的 Google play service 包,
這裡提供了 Gradle Build 的分離寫法,
Ant Build 也可以使用,
先用 Android Studio 下載你需要的 Library,
例如我需要 GCM ,就在 Gradle 加入這兩行,
1 | compile 'com.google.android.gms:play-services-base:7.5.0' |
注意play-services-base
是一定要引用的,
下載完以後,到你專案下的目錄找檔案,
/app/build/intermediates/exploded-aar/com.google.android.gms/play-services
把 play-services-base 當成 Library Project 依賴到 Ant Build 的專案中,
在把其他用到的 Jar 加入即可,
如果你的其他 Play Service Library 有 Resource ,
要注意 Resource Merge 的問題。
如此以來你就完成了自己精簡版的 Play Service 了,
不過最後還是建議早日換成 Gradle Build ,就不需要花費這麼多功夫在上面了。