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è)目錄方式:

解決問題
知道了上面那些概念,現(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 版本。

這時(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í)。