1. 程式人生 > >AndroidStudio3.0使用過程中遇到的bug

AndroidStudio3.0使用過程中遇到的bug

一、匯入專案報錯問題:

如果是AndroidStudio3.0以上的編譯工具編譯的專案,可直接匯入

如果是AndroidStudio3.0以下的編譯工具編譯的專案,切記改完之後再匯入。

Project目錄下:

1、app的build.gradle檔案下 // buildToolsVersion "26.0.3",即註釋buildToolsVersion xx 這句

2、compileSdkVersion xx 改為 xx版本在26及以上

3、gradle/wrapper/gradle-wrapper.properties檔案修改:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

AndroidStudio3.0不支援  4.1以下的gradle版本,gradle-4.1-all.zip是你電腦上已安裝的gradle版本

二、安裝包問題

1、debug-apk複製到裝置上,安裝不上,提示應用安裝有誤

解決辦法:打包簽名後使用release安裝包可以安裝,

注意打包簽名時,選擇V1(jar Signature)   V2(full apk Signature),兩個都選中,編譯的安裝包可以適配,如果只選擇v2,則不能相容7.0以下裝置,如果只選V1,只生成jar包(小編暫時只摸索得這一個方法,如果讀者收其他方法,還望分享)

三、x.Utils等第三方框架初始化出錯(Android5.0以上出現的問題):

問題app 安裝成功之後,開啟就停止執行,報錯:Java.lang.NoClassDefFoundError: org.xutils.common.task.TaskControllerImpl

原因:在android stuido 中進行了分包的處理。分包處理之後導致的

解決辦法:分包處理後把專案application繼承的父類Application改為MultiDexApplication 即可

專案編譯報錯

錯誤:Android Studio Caused by: java.lang.ClassNotFoundException

原因:Android系統中,一個App的所有程式碼都在一個Dex檔案裡面。Dex是一個類似Jar的儲存了多有Java編譯位元組碼的歸檔檔案。因為Android系統使用Dalvik虛擬機器,所以需要把使用Java Compiler編譯之後的class檔案轉換成Dalvik能夠執行的class檔案。這裡需要強調的是,Dex和Jar一樣是一個歸檔檔案,裡面仍然是Java程式碼對應的位元組碼檔案。當Android系統啟動一個應用的時候,有一步是對Dex進行優化,這個過程有一個專門的工具來處理,叫DexOpt。DexOpt的執行過程是在第一次載入Dex檔案的時候執行的。這個過程會生成一個ODEX檔案,即Optimised Dex。執行ODex的效率會比直接執行Dex檔案的效率要高很多。 但是在早期的Android系統中,DexOpt的LinearAlloc存在著限制: Android 2.2和2.3的緩衝區只有5MB,Android 4.x提高到了8MB或16MB。當方法數量過多導致超出緩衝區大小時,會造成dexopt崩潰,導致無法安裝.

解決方案:

1) 在app目錄下build.gradle中android中的defaultConfig中新增multiDexEnabled true

2) 整合類Application的類中在onCreate方法中新增程式碼MultiDex.install(this); 


四、so包報錯

錯誤:main java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app-lib/com.makeparams1111-2/libclib.so" is too small to be an ELF executable

原因:錯誤資訊說在工程中找不到64位的so檔案,32位的不能代替。遇到這個問題應該就不知所措了,明明都是按照三方文件上的步驟匯入的,怎麼還會有報錯,這個問題出現的原因就是有些三方的架包只提供了32的so檔案,而沒有提供64位的so檔案。說到這,首先想到的辦法就是從網上在下載個64位的so檔案不就完了,問題就來了,有些網上找的64位的不一定是三方官方提供的,那麼就不能去使用和相容。

解決方案:

就是在自己工程app目錄下build.gradle的Android根目錄新增上一句話:

ndk{

abiFilters "armeabi"

}

這句話意思是隻載入32位的so檔案,那麼如果是64位系統的手機肯定也是可以相容的。

這時如果還是有報錯,可能是因為gradle的配置中,並不知道是否要做作業系統的相容,這時只要在gradle.properties檔案中加上Android.useDeprecatedNdk=true;

五、簽名打包報錯

錯誤

Error:(34, 24) Error: This fragment should provide a default constructor (a public constructor with no arguments) (com.base.component.FragmentCamera) [ValidFragment]

import com.hndist.monitor.main.R;  

D:\AndroidStudioWorkSpace\jc\app\src\main\java\com\base\component\FragmentCamera.java:50: Error: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment]

原因:Fragment要有空構造

解決辦法:在各個自定義的Fragment裡面都新增上空構造方法