Android-Bug收集

NO 1:

今天在“爸比講故事”項(xiàng)目重構(gòu)時(shí)遇到了這個(gè)問題,在低版本設(shè)備(SDK 18 - 4.3.1)上面死活發(fā)布不上去,還有打包也打不成功,折騰了好長(zhǎng)一段時(shí)間,最后度娘了一下解決方案:

03-09 01:58:55.077 2713-2713/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                 java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/com.babi.story-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.babi.story-1, /system/lib]]
                                                     at android.app.ActivityThread.installProvider(ActivityThread.java:4882)
                                                     at android.app.ActivityThread.installContentProviders(ActivityThread.java:4485)
                                                     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4425)
                                                     at android.app.ActivityThread.access$1300(ActivityThread.java:141)
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
                                                     at android.os.Handler.dispatchMessage(Handler.java:99)
                                                     at android.os.Looper.loop(Looper.java:137)
                                                     at android.app.ActivityThread.main(ActivityThread.java:5103)
                                                     at java.lang.reflect.Method.invokeNative(Native Method)
                                                     at java.lang.reflect.Method.invoke(Method.java:525)
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
                                                     at dalvik.system.NativeStart.main(Native Method)
                                                  Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/com.babi.story-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.babi.story-1, /system/lib]]
                                                     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53)
                                                     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
                                                     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
                                                     at android.app.ActivityThread.installProvider(ActivityThread.java:4867)
                                                     at android.app.ActivityThread.installContentProviders(ActivityThread.java:4485) 
                                                     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4425) 
                                                     at android.app.ActivityThread.access$1300(ActivityThread.java:141) 
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 
                                                     at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                     at android.os.Looper.loop(Looper.java:137) 
                                                     at android.app.ActivityThread.main(ActivityThread.java:5103) 
                                                     at java.lang.reflect.Method.invokeNative(Native Method) 
                                                     at java.lang.reflect.Method.invoke(Method.java:525) 
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
                                                     at dalvik.system.NativeStart.main(Native Method) 

解決方法:
可能是添加MultiDex分包,但未初始化的原因,在Application中重寫attachBaseContext函數(shù),對(duì)MultiDex初始化即可。
1)首先修改Gradle配置文件,啟用MultiDex并包含MultiDex支持:

defaultConfig {
        multiDexEnabled true
 }

2)設(shè)置Application

public class BBApp extends Application {
    /**
     * 存儲(chǔ)activity
     */
    private static final List<BaseActivity> mActivities = new LinkedList<BaseActivity>();

    private static BBApp mInstance;
    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        context = getApplicationContext();

        // 必須在Application的onCreate方法中執(zhí)行 BGASwipeBackManager.getInstance().init(this) 來初始化滑動(dòng)返回
        BGASwipeBackManager.getInstance().init(this);

        // 初始化屏幕分辨率、縮放dpi
        DisplayMetrics metric = ResourceUtils.getResources().getDisplayMetrics();
        AppConstant.SCREEN_DENSITY = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
        AppConstant.SCREEN_WIDTH = metric.widthPixels; // 屏幕寬度(像素)
        AppConstant.SCREEN_HEIGHT = metric.heightPixels; // 屏幕高度(像素)

        // 啟動(dòng)錄音播放服務(wù)
        // startService(new Intent(this, PlayService.class));
        // 初始化夜間模式
        // new ThemeInit(context);
        // 初始化開啟4g下載
        init4GOpen();
        // 初始化圖片
        initImageLoader();
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);
    }
}

NO 2:

今天在升級(jí)“爸比講故事”項(xiàng)目開發(fā)工具Android Studio的gradle時(shí),在辦公司蝸牛的網(wǎng)速下面,最終沒有升級(jí)成功,無賴,只有扛著電腦回家繼續(xù)填坑。哪想又跳進(jìn)了另外一個(gè)坑:

Error:Failed to open zip file.
Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
Re-download dependencies and sync project (requires network)
Re-download dependencies and sync project (requires network)
// 升級(jí)方式
// 項(xiàng)目build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // classpath 'com.android.tools.build:gradle:2.2.0'
        classpath 'com.android.tools.build:gradle:2.3.0'
    }
}

// gradle-wrapper.properties文件
#Thu Mar 09 23:15:26 CST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
// distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

解決方式:
刪除更目錄下面的.gradle里面的對(duì)應(yīng)目錄下面的文件夾信息,參照下圖所示:

解決方式

刪除了gradle-3-3-all下面的文件夾信息后,重新啟動(dòng)Android Studio又可以繼續(xù)愉快的玩耍了,接下來的事情就是賴心的等待著更新gradle版本吧????????????,能不能更新成功,看人品咯。

上面的解決方式,是最屌絲也是最常見的做法,在AS Refreshing XXX project gradle的過程中,除了等待還只是等待,下面將會(huì)介紹一個(gè)更加快捷的方式,這是一天在掘金這個(gè)技術(shù)類博客app中讀到的一個(gè)分享---解決 AS Gradle 一直 Buildling 或 refreshing 的問題(專治各種Rrefreshing假死狀態(tài)):

要解決這類問題,需要 Gradle 和 Android Studio 關(guān)于 Gradle 配置的知識(shí),下面先說一下 Android Studio 項(xiàng)目 Gradle 相關(guān)的幾個(gè)概念。

#Gradle

Gradle 是一種構(gòu)建項(xiàng)目工具。

#Gradle 插件

在項(xiàng)目的 build.gradle 文件中有這樣一句配置:

classpath 'com.android.tools.build:gradle:2.3.0'

這里的版本是 Gradle 插件的版本而不是 Gradle 版本。每個(gè)版本插件都有對(duì)應(yīng)要求最低的 Gradle 版本。

#gradle\wrapper 目錄

這個(gè)目錄是所在項(xiàng)目默認(rèn)的 gradle 環(huán)境。

wrapper 是針對(duì)所在項(xiàng)目的,只在所在項(xiàng)目?jī)?nèi)起作用,沒有安裝在本地,否則所有的項(xiàng)目都使用一個(gè) Gradle 版本,如果兩個(gè)項(xiàng)目使用的是不同的 Gradle 版本,就沒辦法區(qū)別了,所以 Google 使用 gradle 插件實(shí)現(xiàn)了 wrapper,可以給每個(gè)項(xiàng)目配置需要的 Gradle 版本。

#gradle-wrapper.properties 文件

通常,建好一個(gè)新項(xiàng)目,該文件的內(nèi)容如下:

#Fri Mar 03 15:53:44 CST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

前幾項(xiàng)是 Gradle 的目錄,最后一個(gè)是需要的 Gradle 版本的 Url。

#studio安裝目錄/gradle
這個(gè)目錄是 Studio 新建項(xiàng)目默認(rèn)使用的 Gradle 版本。

eg:Mac用戶找到這個(gè)目錄方式:
1)進(jìn)入應(yīng)用程序,找到Android Studio
2)右鍵“顯示包內(nèi)容”,進(jìn)入Content文件夾下面的gradle文件夾

#C:/Users/用戶名.gradle/wrapper/dists
所有的 Gradle 版本 gradle-版本號(hào)-all 或 gradle-版本號(hào)-bin 都保存在這里。

eg:Mac用戶找到這個(gè)目錄方式:

dists目錄

解決問題

知道了上面那些概念,現(xiàn)在來看看怎樣解決問題。

出現(xiàn)這種問題的原因是 Android Studio 在為我們下載需要的 Gradle,而由于網(wǎng)絡(luò)不好還是 Studio 下載東西本身就慢的原因?qū)е挛覀兊群荛L(zhǎng)時(shí)間,最終放棄,重啟 Studio,building,重啟 Studio...

有兩種情況:
1)Studio 版本升級(jí),需要升級(jí)默認(rèn)的 Gradle
2)gradle-wrapper.properties 文件中的 distributionUrl 指向的 Gradle 版本,本地不存在

問題 1 解決方案

1.等,pass,有時(shí)候下載不下來等再長(zhǎng)時(shí)間也是白玩。
2.打開 C:\Users\用戶名.gradle\wrapper\dists 目錄,進(jìn)入到最新的 Gradle 目錄里。
如升級(jí) Studio 需要 gradle-3.3-all 版本。那么用瀏覽器訪問 https://services.gradle.org/distributions/gradle-3.3-all.zip 下載 gradle3.3-all 版本壓縮包,進(jìn)入 C:\Users\用戶名.gradle\wrapper\dists\gradle-3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9 目錄中,刪除除 gradle-3.3-all.zip.lck 文件外的所有文件夾和文件,復(fù)制瀏覽器下載好的 gradle-3.3-all.zip 到該目錄,重新打開 Studio 即可。

問題 2 解決方案
1.查看 gradle-wrapper.properties要求的 Gradle 版本,去 C:\Users\用戶名.gradle\wrapper\dists目錄中看看對(duì)應(yīng)版本目錄下有沒有對(duì)于 Gradle 版本的 zip包,沒有的話,下載好丟進(jìn)來即可,和問題 1 的解決方案一樣。

2.因?yàn)?Studio 項(xiàng)目默認(rèn)使用項(xiàng)目中的 Gradle 版本,即 gradle-wrapper.properties
文件配置的 Gradle 版本。我們下載不到 Gradle 的時(shí)候,可以給當(dāng)前項(xiàng)目設(shè)置本地存在的 Gradle 版本。


gradle_setting.png
gradle_setting.png

這時(shí)候可能會(huì)報(bào)錯(cuò):
Error:(1, 0) Minimum supported Gradle version is 3.3. Current version is 3.2.

這是因?yàn)榻o本項(xiàng)目配置的 Gradle 版本沒有達(dá)到 classpath 'com.android.tools.build:gradle:2.3.0' gradle 插件要求的最低版本,插件版本改小點(diǎn)就行。這是 Gradle 插件各個(gè)版本的信息

#總結(jié)
出現(xiàn) Gradle 一直 Buildling 或 refreshing 的問題是因?yàn)?Android Studio 在下載依賴的 Gradle 版本太慢,解決方案最好是自己下載需要的 Gradle 版本壓縮包,丟進(jìn)對(duì)應(yīng)目錄即可。

特別鳴謝Bakumon's Blog的文章,閱讀這篇文章后,讓我這個(gè)Android Studio小白對(duì)AS的目錄結(jié)構(gòu)有了一個(gè)深入的理解和認(rèn)識(shí)。

NO 3:

最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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