近日,公司需要改一個APP需求,此APP是上古代碼,15年Eclipse代碼,幾經易手,面目全非。。。因實在不想弄Eclipse的安卓環境,故而遷移到as上面(不是直接兼容的,是把lib,jnilib,asset,res,src,androidmanifest按照as的格式拷貝到個空的as目錄中),工程打開遇到各種編譯的坑,僅此做記錄。。。
參考
1、Some file crunching failed, see logs for details解決方案 以及.9patch點9圖片的報錯的詳細修改方法
2、gradle編譯異常記錄:finished with non-zero exit value 1-3
3、警告: 最後一個參數使用了不準確的變量類型的 varargs 方法的非 varargs 調用
異常
1、java.lang.RuntimeException: Some file crunching failed, see logs for details
1.1、錯誤原因:構建Gradle的時候,Gradle會去檢查一下是否修改過文件的後綴名。
1.2、常見現象:
......1)一般大多數是出現在圖片上,.jpg修改成了.png就會出現這個問題。
......2)命名圖片成了xxx.png.png這類問題
......3)“@layout/more_text ”,多了空格,Error: ' ' is not a valid resource name character
......4).9圖片不規範,必須加一個pix:AAPT err(Facade for 353666562): ERROR: 9-patch image 。。。\res\drawable-hdpi\result_bottom_left.9.png malformed.
1.3、修改方法:
1)在build.gradle文件中加上aaptOptions 這部分
android {
compileSdkVersion 25
//...
defaultConfig {
applicationId "com.hainanfishery.second.detector"
//...
}
//增加這個
//java.lang.RuntimeException: Some file crunching failed, see logs for details
aaptOptions {
cruncherEnabled = false
useNewCruncher = false
}
}
2).9圖片的修改(不贅述):https://blog.csdn.net/dashan618/article/details/71641396
1.4、問題查找的工具,as每次都提示,see logs,實際上logs體現不了,不如用看build過程找問題 --》 右側工具欄/Gradle/app工程/:app/build/build
2、被編譯的代碼或資源有問題: non-zero exit value 1
2.1、錯誤原因:資源問題,寫的不規範,遺漏啥的。以前的Eclipse工具不幫你找錯,有就行了,管你前面類型是啥
2.2、常見現象:
.....\layout\mediacontroller.xml:183: error: Error: No resource found that matches the given name (at 'background' with value '@color/mediacontroller_bg').
.....\drawable\mediacontroller_btn_bg.xml:3: error: Error: No resource found that matches the given name (at 'drawable' with value '@color/mediacontroller_bg_pressed').
.....\drawable\mediacontroller_btn_bg.xml:4: error: Error: No resource found that matches the given name (at 'drawable' with value '@color/mediacontroller_bg_pressed').
2.3、修改方法:改正確即可
@mipmap/mediacontroller_bg
@drawable/mediacontroller_bg_pressed
3、jar包衝突:non-zero exit value 2
3.1、錯誤原因:重複的jar衝突
3.2、常見現象:support-v4以前直接放在lib下,可後來項目直接compile裏面都有v4或者v7了之類的
3.3、修改方法:1)確定,刪除沒用重複的jar 2)支持可重複,在build.gradle中添加:multiDexEnabled true
android {
defaultConfig {
multiDexEnabled true
}
}
4、編譯的代碼過多導致內存不足:non-zero exit value 3
4.1、修改方法:在build.gradle中添加 dexOptions 的 javaMaxHeapSize
android {
dexOptions {
javaMaxHeapSize "2g" //增加編譯時候的內存大小,實際看電腦內存支不支持
}
}
5、警告: 最後一個參數使用了不準確的變量類型的 varargs 方法的非 varargs 調用
Method method = cls.getMethod( " hashCode " , new Class[ 0 ]); // 編譯通過
Method method = cls.getMethod( " hashCode " , null ); // 編譯失敗
allMethod[i].invoke(dbInstance, new Object[]{}); // 編譯通過
allMethod[i].invoke(dbInstance, null ); // 編譯失敗
6、方法超量:android.dex.DexIndexOverflowException: Cannot merge new index xxxx into a non-jumbo instruction!
6.1、錯誤原因:錯誤出現的原因是 Android設定的方法數是65536個(DEX 64K problem),超過這個方法數,導致dex無法生成,就無法生成APK(限制原因: 早期的Dalvik VM內部使用short類型變量來標識方法的id,就有了 最大方法數的限制65536)
6.2、修改方法:在build.gradle中添加以下內容
android {
defaultConfig {
multiDexEnabled true
}
dexOptions {
jumboMode true //方法數量超過
}
}
7、錯誤: 程序包org.apache.http不存在
7.1、錯誤原因:早期版本有apache,後面sdk默認沒有了,使用到了HttpClient等需要apache支持
7.2、修改方法:在build.gradle中添加以下內容
android {
useLibrary 'org.apache.http.legacy'
}
8、cmake的問題,找不到so拉...
8.1、defaultConfig外面的 externalNativeBuild - cmake,指明瞭 CMakeList.txt 的路徑;
8.2、defaultConfig 裏面的 externalNativeBuild - cmake,主要填寫 CMake 的命令參數。異常處理,即由 arguments 中的參數最後轉化成一個可執行的 CMake 的命令,可以在 app/externalNativeBuild/cmake/debug/{abi}/cmake_build_command.txt中查到。如下
8.3、ndk的地方,如果真的在不同cpu幸好下生成so,那麼可以對應寫,不然不要隨便寫,否則有可能報錯
android {
defaultConfig {
...
//內部 externalNativeBuild
externalNativeBuild {
cmake {
cppFlags ""
}
}
ndk {
abiFilters 'armeabi','armeabi-v7a'
//arm64-v8a,向下兼容,如果確定沒有單獨打過v8的so,那麼就不要加這個目錄
// abiFilters 'armeabi','armeabi-v7a','arm64-v8a'//根據需要可選一個或多個
}
}
//外部 externalNativeBuild
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}