Android 編譯遇到的問題(淚目)

近日,公司需要改一個(gè)APP需求,此APP是上古代碼,15年Eclipse代碼,幾經(jīng)易手,面目全非。。。因?qū)嵲诓幌肱狤clipse的安卓環(huán)境,故而遷移到as上面(不是直接兼容的,是把lib,jnilib,asset,res,src,androidmanifest按照as的格式拷貝到個(gè)空的as目錄中),工程打開遇到各種編譯的坑,僅此做記錄。。。

參考

1、Some file crunching failed, see logs for details解決方案 以及.9patch點(diǎn)9圖片的報(bào)錯(cuò)的詳細(xì)修改方法
2、gradle編譯異常記錄:finished with non-zero exit value 1-3
3、警告: 最后一個(gè)參數(shù)使用了不準(zhǔn)確的變量類型的 varargs 方法的非 varargs 調(diào)用

異常


1、java.lang.RuntimeException: Some file crunching failed, see logs for details

1.1、錯(cuò)誤原因:構(gòu)建Gradle的時(shí)候,Gradle會(huì)去檢查一下是否修改過文件的后綴名。
1.2、常見現(xiàn)象:
......1)一般大多數(shù)是出現(xiàn)在圖片上,.jpg修改成了.png就會(huì)出現(xiàn)這個(gè)問題。
......2)命名圖片成了xxx.png.png這類問題
......3)“@layout/more_text ”,多了空格,Error: ' ' is not a valid resource name character
......4).9圖片不規(guī)范,必須加一個(gè)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"
        //...
    }

    //增加這個(gè)
    //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,實(shí)際上logs體現(xiàn)不了,不如用看build過程找問題 --》 右側(cè)工具欄/Gradle/app工程/:app/build/build


2323232323.png

2、被編譯的代碼或資源有問題: non-zero exit value 1

2.1、錯(cuò)誤原因:資源問題,寫的不規(guī)范,遺漏啥的。以前的Eclipse工具不幫你找錯(cuò),有就行了,管你前面類型是啥
2.2、常見現(xiàn)象:

    .....\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、錯(cuò)誤原因:重復(fù)的jar沖突
3.2、常見現(xiàn)象:support-v4以前直接放在lib下,可后來項(xiàng)目直接compile里面都有v4或者v7了之類的
3.3、修改方法:1)確定,刪除沒用重復(fù)的jar 2)支持可重復(fù),在build.gradle中添加:multiDexEnabled true

android {
    defaultConfig {
        multiDexEnabled  true 
    }
}

4、編譯的代碼過多導(dǎo)致內(nèi)存不足:non-zero exit value 3

4.1、修改方法:在build.gradle中添加 dexOptions 的 javaMaxHeapSize

android {
    dexOptions {
          javaMaxHeapSize "2g" //增加編譯時(shí)候的內(nèi)存大小,實(shí)際看電腦內(nèi)存支不支持
    }
}

5、警告: 最后一個(gè)參數(shù)使用了不準(zhǔn)確的變量類型的 varargs 方法的非 varargs 調(diào)用

    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、錯(cuò)誤原因:錯(cuò)誤出現(xiàn)的原因是 Android設(shè)定的方法數(shù)是65536個(gè)(DEX 64K problem),超過這個(gè)方法數(shù),導(dǎo)致dex無法生成,就無法生成APK(限制原因: 早期的Dalvik VM內(nèi)部使用short類型變量來標(biāo)識(shí)方法的id,就有了 最大方法數(shù)的限制65536)
6.2、修改方法:在build.gradle中添加以下內(nèi)容

android {
defaultConfig {
        multiDexEnabled  true 
    }

    dexOptions {
         jumboMode true  //方法數(shù)量超過
    }
}

7、錯(cuò)誤: 程序包org.apache.http不存在

7.1、錯(cuò)誤原因:早期版本有apache,后面sdk默認(rèn)沒有了,使用到了HttpClient等需要apache支持
7.2、修改方法:在build.gradle中添加以下內(nèi)容

android {
    useLibrary 'org.apache.http.legacy'
}

8、cmake的問題,找不到so拉...

8.1、defaultConfig外面的 externalNativeBuild - cmake,指明了 CMakeList.txt 的路徑;
8.2、defaultConfig 里面的 externalNativeBuild - cmake,主要填寫 CMake 的命令參數(shù)。異常處理,即由 arguments 中的參數(shù)最后轉(zhuǎn)化成一個(gè)可執(zhí)行的 CMake 的命令,可以在 app/externalNativeBuild/cmake/debug/{abi}/cmake_build_command.txt中查到。如下
8.3、ndk的地方,如果真的在不同cpu幸好下生成so,那么可以對(duì)應(yīng)寫,不然不要隨便寫,否則有可能報(bào)錯(cuò)

android {
    
    defaultConfig {
        ...
        //內(nèi)部  externalNativeBuild 
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }

        ndk {
            abiFilters 'armeabi','armeabi-v7a'
            //arm64-v8a,向下兼容,如果確定沒有單獨(dú)打過v8的so,那么就不要加這個(gè)目錄
//                abiFilters 'armeabi','armeabi-v7a','arm64-v8a'//根據(jù)需要可選一個(gè)或多個(gè)
        }
    }

  //外部  externalNativeBuild 
   externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

}



9、編譯發(fā)布APK時(shí)候發(fā)生一個(gè)嚴(yán)重錯(cuò)誤 : Lint found fatal errors while assembling a release target.

android {
    lintOptions {
        checkReleaseBuilds false
        // 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
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容