開發常見錯誤及解決方案

weixin_33936401發表於2017-06-19

<h4>個人平時專案開發過程遇到的一些問題,記錄下來並總結解決方案,希望能幫到大家解決問題,有些問題的解決方案是在StackoverFlow上找到的有的是百度、Google,建議大家遇到問題多去上面找,基本上都能找到解決方案的。</h4>
<h5>(1)將Eclipse專案匯入到Android studio 中 很多點9圖出現問題解決方法:
在build.gradle裡新增以下兩句:</h5>
<code>aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false</code>
<h5>用來關閉Android Studio的PNG合法性檢查的,直接不讓它檢查。
(2)Android Studio 錯誤: 非法字元: '\ufeff' 解決方案|錯誤: 需要class, interface或enum
****原因:****Eclipse可以智慧的把UTF-8+BOM檔案轉為普通的UTF-8檔案,Android Studio還沒有這個功能,所以使用Android Studio編譯UTF-8+BOM編碼的檔案時會出現” 非法字元: '\ufeff' “之類的錯誤

解決方法:手動將UTF-8+BOM編碼的檔案轉為普通的UTF-8檔案。****用EdItPlus開啟.java檔案依次:文件》文字編輯》轉換文字編碼》選擇UTF-8編碼即可

(3)將專案匯入到AS中出現以下問題:</h5>
<code>Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > com.android.bui</code>
<h5>解決方法:
在build.grade中新增以下程式碼:</h5>
<code>android{
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
}
}</code>
<h5>(4)未知錯誤</h5>
<code>Error:Timeout waiting to lock cp_proj class cache for build file '/Users/Mr.xiao/Desktop/AndroidShopNC2014MoblieNew/androidShopNC2014Moblie/build.gradle'
(/Users/Mr.xiao/.gradle/caches/2.10/scripts/build_3cyr7hzjurcc62ge3ixidshos/cp_proj).
It is currently in use by another Gradle instance.
Owner PID: unknown
Our PID: 1412
Owner Operation: unknown
Our operation: Initialize cache
Lock file: /Users/Mr.xiao/.gradle/caches/2.10/scripts/build_3cyr7hzjurcc62ge3ixidshos/cp_proj/cache.properties.lock</code>
<h5>
解決方案
以上是錯誤提示。
解決的思路很簡單隻需要把cache.properties.lock檔案刪除了就可以了。當時我們刪除的時候會被佔用這時候需要進入工作管理員結束關於java的程式就行比如 java 的jdk 刪除後重啟讓java jdk啟動 啟動Android Studio就能啟動APK了。

(5)修改了Android專案的最小SDK版本之後出現很多stysle檔案找不到

解決方案</h5>

<code>compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "net.mmloo2014.android"
minSdkVersion 14
targetSdkVersion 23
}</code>
<h5>compileSdkVersion 是多少版本的

那麼compile 'com.android.support:appcompat-v7:23.2.1’ 就是啥版本的。

(6)Android studio 編譯問題:finished with non-zero exit value 2

問題:

</h5>
<code>Error:Execution failed for task ':androidShopNC2014Moblie: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 '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2</code>
<h5>解決方案
這個錯誤在app的build.gradle裡面新增下面這句就好了。</h5>
<code>android {
defaultConfig {
multiDexEnabled true
}
}</code>
<h5>(7)Android studio 編譯問題:finished with non-zero exit value 1(由於匯入的依賴出現重複造成的)

問題:

</h5>
<code>Error:Execution failed for task ':app:transformClassesWithDexForDebug'.

com.Android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'F:\Program Files (x86)[Java](http://lib.csdn.net/base/17)\jdk1.8.0_31\bin\java.exe'' finished with non-zero exit value 1</code>
<h5>
解決方案
這個是因為依賴包重複了 (像v4和nineoldandroids),app中實現了對easeUI的依賴,但是app和easeUI都新增了對這個包的依賴。所以就報這個錯誤,修改之後再報,就clean,rebuild一下。

(8)問題</h5>
<code>Error:Execution failed for task
':app:transformClassesWithJarMergingForDebug'.>
com.android.build.api.transform.TransformException:
java.util.zip.ZipException:
duplicate entry: org/apache/http/ConnectionClosedException.class</code>
<h5>
解決方案
這個是在我們啟動的時候報錯的,而不是在編譯的時候,原因是這樣的,報這個錯是因為有2個庫中存在相同的類。大家可以看到stackoverflow上有人也提了這樣的問題。只需要刪除其中的一個就可以解決了。

(9)新增第三方依賴出現的問題</h5>
<code>Error:Execution failed for task ':app:processDebugManifest'.

Manifest merger failed :
uses-sdk:minSdkVersion 14 cannot be smaller than version 19 declared in library [com.github.meikoz:basic:2.0.3]
/AndroidStudioCode/EnjoyLife/app/build/intermediates/exploded-aar/
com.github.meikoz/basic/2.0.3/AndroidManifest.xml
Suggestion: use tools:overrideLibrary="com.android.core" to force usage</code>
<h5>

錯誤原因
出現這個錯誤的原因是我引入的第三方庫最低支援版本高於我的專案的最低支援版本,異常中的資訊顯示:我的專案的最低支援版本為14,而第三方庫的最低支援版本為19,所以丟擲了這個異常。

解決方案
在AndroidManifest.xml檔案中標籤中新增

</h5>
<code><uses-sdk tools:overrideLibrary="xxx.xxx.xxx"/></code>
<h5>其中的xxx.xxx.xxx為第三方庫包名,如果存在多個庫有此異常,則用逗號分割它們,例如:</h5>
<code><uses-sdk tools:overrideLibrary="xxx.xxx.aaa, xxx.xxx.bbb"/></code>
<h5>這樣做是為了專案中的AndroidManifest.xml和第三方庫的AndroidManifest.xml合併時可以忽略最低版本限制。

(10)Android studio 編譯問題:finished with non-zero exit value 1(由於buildtools版本太高造成的)

錯誤

</h5>
<code>Error:Execution failed for task ':app:transformClassesWithDexForDebug'.

com.android.ide.common.process.ProcessException:
org.gradle.process.internal.ExecException:
Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1</code>
<h5>

錯誤原因
buildToolsVersion版本太高,我原來的 buildToolsVersion "24.0.0” 需要jdk1.8,而我的是jdk1.7,所以一直報這個錯,剛開始以為是v4包和V7包衝突,因為之前遇到這樣的問題,而這次刪除V4包之後依然報這個錯,上stackoverflow搜了一下,把buildTools版本降下來就好了。

解決方案

</h5>
<code>android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
}</code>
<h5>(11)Android studio 編譯問題:Gradle DSL not found 'android()' 問題
</h5>
<code>

5795280-3a4196b2dc06c262.png
clipboard.png</code>
<h5>
解決方案
配置build.gradle:
</h5>
<code>buildscript {
repositories {
jcenter()
}

dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
}
}

allprojects {
repositories {
jcenter()
}
}
buildscript {
repositories {
jcenter()
}

dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
}
}

allprojects {
repositories {
jcenter()
}
}</code>
<h5>配置app/build.gradle:</h5>
<code>apply plugin: 'com.android.application'android {
compileSdkVersion 23
buildToolsVersion '23.0.3'
defaultConfig {
minSdkVersion 9
targetSdkVersion 23
versionCode 1
versionName '1.0'
}
}
dependencies {
compile 'com.android.support:appcompat-v7:23.2.1'
}</code>
<h5>最後再同步一下sync即可。

(12)Android studio 編譯問題:Gradle DSL not found 'android()'

問題描述

</h5>
<code>Error:(51, 52) 錯誤: -source 1.6 中不支援 diamond 運算子
(請使用 -source 7 或更高版本以啟用 diamond 運算子)</code>
<h5>
解決方案
方案一
</h5>

<code>
5795280-029febfc28ea973a.png
將標紅處設定為1.7.png

5795280-8dc9a86c32628a96.png
修改soure為1.7.png</code>
<h5>方案二
在build gradle中進行配置如下程式碼:</h5>
<code>android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}</code>
<h5>最後同步一下即可

(13)Glide使用問題:使用Glide載入圓角圖片,第一次顯示佔點陣圖
問題描述最近在專案中使用Glide載入圓形圖片,並且設定placehloder和error兩個佔點陣圖,執行發現,第一次載入圖片只顯示佔點陣圖,需要第二次進入的時候才會正常顯示。如果你剛好使用了這個圓形Imageview庫或者其他的一些自定義的圓形Imageview,而你又剛好設定了佔位的話,那麼,你就會遇到第一個問題。如何解決呢?

方案一不設定佔點陣圖

方案二使用Glide的Transformation API自定義圓形Bitmap的轉換</h5>
<code> /**
* Glide圓形圖片處理
*/
static class CircleTransform extends BitmapTransformation {
public CircleTransform(Context context) {
super(context);
}

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return circleCrop(pool, toTransform);
    }

    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;

        int size = Math.min(source.getWidth(), source.getHeight());
        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

        Bitmap result = pool.get(size, size, Bitmap.Config.RGB_565);
        if (result == null) {
            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);
        return result;
    }

    @Override
    public String getId() {
        return getClass().getName();
    }
}</code>

<h5>使用方法:</h5>
<code>Glide.with(context).load(imageUrl).placeholder(placeholder).error(errorImage).transform(new CircleTransform(context)).into(imageView);</code>
<h5>方案三
重寫Glide的圖片載入監聽方法,具體如下:</h5>
<code>Glide.with(mContext)
.load(url)
.placeholder(R.drawable.loading_drawable)
.into(new SimpleTarget<Bitmap>(width, height) {
@Override public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
// setImageBitmap(bitmap) on CircleImageView
}
});</code>
<h5>注意事項:
該方法在listview上覆用有問題的bug,如果在listview中載入CircleImageView,請不要使用該方法。

方案四:不使用Glide的預設動畫:</h5>
<code>Glide.with(mContext)
.load(url)
.dontAnimate()
.placeholder(R.drawable.loading_drawable)
.into(circleImageview);</code>
<h5>(14)json資料解析問題:json串頭部出現字元:"\ufeff" 解決方法
異常資訊</h5>
<code>org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject</code>
<h5>解析伺服器返回 的json格式資料時,我們可能會發現,資料格式上是沒有問題的,但是仔細對比會發現,在json串頭部發現字元:"\ufeff"

客戶端解決方案:</h5>
<code>/**

  • 異常資訊:org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject
  • json串頭部出現字元:"\ufeff" 解決方法
  • @param data
  • @return
    */
    public static final String removeBOM(String data) {
    if (TextUtils.isEmpty(data)) {
    return data;
    }
    if (data.startsWith("\ufeff")) {
    return data.substring(1);
    }
    else {
    return data;
    }
    }</code>
    <h5>伺服器端解決方案:
    將輸出此json的php原始碼重新用editplus之類用utf-8無BOM的編碼儲存。不要用windows系統自帶的記事本編輯php原始碼,這個BOM就是記事本這些windows自帶的編輯器引入的。

(15)Android studio編譯問題:not found ndk()
問題</h5>
<code>Error:(15, 0) Gradle DSL method not found: 'ndk()' method-not-found-ndk</code>
<h5>解決方案
出現該問題,可能是由於ndk配置在build.gradle配置檔案中位置弄錯導致的</h5>
<code>apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
    applicationId "com.guitarv.www.ndktest"
    minSdkVersion 17
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    ndk {
        moduleName = "HelloJNI"
    }
    sourceSets.main {
        jni.srcDirs = []
        jniLibs.srcDir "src/main/libs"
    }
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

}</code>
<h5>(16)Android studio匯入其他的專案:UnsupportedMethodException
問題</h5>
<code>UnsupportedMethodException Unsupported method: AndroidProject.getPluginGeneration(). The version of Gradle you connect to does not support that method. To resolve the problem you can change/upgrade the target version of Gradle you connect to. Alternatively, you can ignore this exception and read other information from the model.

5795280-86f4112140cc8de6.png

錯誤截圖</code>
<h5>解決方案

將根目錄中的build.gradle檔案中的gradle版本號,出現錯誤之前,我的是1.3.0,修改成2.2.0之後重新編譯一下就可以執行了。</h5>
<code>dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}</code>
<h5>將這個版本號改成你其他專案能夠執行成功的版本號即可

(17)Android studio更新到2.1.1之後使用CollapsingToolbarLayout出現Error inflating class CollapsingToolbarLayout
之前在專案中使用了CollapsingToolbarLayout,效果還是可以的,但是Android stuido更新到2.1.1版本之後出現Error inflating class CollapsingToolbarLayout 異常崩潰
異常資訊如下所示:</h5>
<code>com.test.android/com.test.android.ui.activity.RandomActivity}: android.view.InflateException: Binary XML file line #22: Error inflating class android.support.design.widget.CollapsingToolbarLayout
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: android.view.InflateException: Binary XML file line #22: Error inflating class android.support.design.widget.CollapsingToolbarLayout
at android.view.LayoutInflater.createView(LayoutInflater.java:633)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136)
at com.test.android.ui.activity.RefreshableActivity.onCreate(RefreshableActivity.java:31)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

                                                               Caused by: java.lang.NoSuchMethodError: No static method setLayoutDirection(Landroid/graphics/drawable/Drawable;I)V in class Landroid/support/v4/graphics/drawable/DrawableCompat; or its super classes (declaration of 'android.support.v4.graphics.drawable.DrawableCompat' appears in /data/app/com.test.android-1/base.apk)
                                                                  at android.support.design.widget.CollapsingToolbarLayout.setStatusBarScrim(CollapsingToolbarLayout.java:663)
                                                                  at android.support.design.widget.CollapsingToolbarLayout.<init>(CollapsingToolbarLayout.java:197)
                                                                  at android.support.design.widget.CollapsingToolbarLayout.<init>(CollapsingToolbarLayout.java:132)
                                                                  at java.lang.reflect.Constructor.newInstance(Native Method) 
                                                                  at java.lang.reflect.Constructor.newInstance(Constructor.java:288) 
                                                                  at android.view.LayoutInflater.createView(LayoutInflater.java:607) 
                                                                  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) 
                                                                  at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
                                                                  at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) 
                                                                  at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) 
                                                                  at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
                                                                  at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
                                                                  at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
                                                                  at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276) 
                                                                  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136) 
                                                                  at com.test.android.ui.activity.RefreshableActivity.onCreate(RefreshableActivity.java:31) 
                                                                  at android.app.Activity.performCreate(Activity.java:5990) 
                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                                                                  at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                                                                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                  at android.os.Looper.loop(Looper.java:135) 
                                                                  at android.app.ActivityThread.main(ActivityThread.java:5254) 
                                                                  at java.lang.reflect.Method.invoke(Native Method) 
                                                                  at java.lang.reflect.Method.invoke(Method.java:372)</code>

<h5>解決方案
在專案的build.gradle檔案中新增下面一行,同步一下即可</h5>
<code>compile ('com.android.support:support-v4:23.4.0'){
force = true;
}</code>
<h5>(18)Android studio gradle編譯異常</h5>
<code>java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0
</code>

<h5>這是class版本不支援。經查詢,Android Studio2.2必須使用JDK8及以上版本,而且是強制的。所以呢,趕緊下了個JDK8最新版的。安裝完畢,把JAVA_HOME指向了JDK8,實測JDK7和8是可以共存的。那麼,重啟Android Studio後問題解決</h5>

相關文章