NO 1:
今天在“爸比讲故事”项目重构时遇到了这个问题,在低版本设备(SDK 18 - 4.3.1)上面死活发布不上去,还有打包也打不成功,折腾了好长一段时间,最后度娘了一下解决方案:
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函数,对MultiDex初始化即可。
1)首先修改Gradle配置文件,启用MultiDex并包含MultiDex支持:
defaultConfig {
multiDexEnabled true
}
2)设置Application
public class BBApp extends Application {
/**
* 存储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方法中执行 BGASwipeBackManager.getInstance().init(this) 来初始化滑动返回
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; // 屏幕高度(像素)
// 启动录音播放服务
// 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:
今天在升级“爸比讲故事”项目开发工具Android Studio的gradle时,在办公司蜗牛的网速下面,最终没有升级成功,无赖,只有扛着电脑回家继续填坑。哪想又跳进了另外一个坑:
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)
// 升级方式
// 项目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里面的对应目录下面的文件夹信息,参照下图所示:
删除了gradle-3-3-all下面的文件夹信息后,重新启动Android Studio又可以继续愉快的玩耍了,接下来的事情就是赖心的等待着更新gradle版本吧😭😭😭😭😭😭,能不能更新成功,看人品咯。
上面的解决方式,是最屌丝也是最常见的做法,在AS Refreshing XXX project gradle的过程中,除了等待还只是等待,下面将会介绍一个更加快捷的方式,这是一天在掘金这个技术类博客app中读到的一个分享---解决 AS Gradle 一直 Buildling 或 refreshing 的问题(专治各种Rrefreshing假死状态):
要解决这类问题,需要 Gradle 和 Android Studio 关于 Gradle 配置的知识,下面先说一下 Android Studio 项目 Gradle 相关的几个概念。
#Gradle
Gradle 是一种构建项目工具。
#Gradle 插件
在项目的 build.gradle 文件中有这样一句配置:
classpath 'com.android.tools.build:gradle:2.3.0'
这里的版本是 Gradle 插件的版本而不是 Gradle 版本。每个版本插件都有对应要求最低的 Gradle 版本。
#gradle\wrapper 目录
这个目录是所在项目默认的 gradle 环境。
wrapper 是针对所在项目的,只在所在项目内起作用,没有安装在本地,否则所有的项目都使用一个 Gradle 版本,如果两个项目使用的是不同的 Gradle 版本,就没办法区别了,所以 Google 使用 gradle 插件实现了 wrapper,可以给每个项目配置需要的 Gradle 版本。
#gradle-wrapper.properties 文件
通常,建好一个新项目,该文件的内容如下:
#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
前几项是 Gradle 的目录,最后一个是需要的 Gradle 版本的 Url。
#studio安装目录/gradle
这个目录是 Studio 新建项目默认使用的 Gradle 版本。
eg:Mac用户找到这个目录方式:
1)进入应用程序,找到Android Studio
2)右键“显示包内容”,进入Content文件夹下面的gradle文件夹
#C:/Users/用户名.gradle/wrapper/dists
所有的 Gradle 版本 gradle-版本号-all 或 gradle-版本号-bin 都保存在这里。
eg:Mac用户找到这个目录方式:
解决问题
知道了上面那些概念,现在来看看怎样解决问题。
出现这种问题的原因是 Android Studio 在为我们下载需要的 Gradle,而由于网络不好还是 Studio 下载东西本身就慢的原因导致我们等很长时间,最终放弃,重启 Studio,building,重启 Studio...
有两种情况:
1)Studio 版本升级,需要升级默认的 Gradle
2)gradle-wrapper.properties 文件中的 distributionUrl 指向的 Gradle 版本,本地不存在
问题 1 解决方案
1.等,pass,有时候下载不下来等再长时间也是白玩。
2.打开 C:\Users\用户名.gradle\wrapper\dists 目录,进入到最新的 Gradle 目录里。
如升级 Studio 需要 gradle-3.3-all 版本。那么用浏览器访问 https://services.gradle.org/distributions/gradle-3.3-all.zip 下载 gradle3.3-all 版本压缩包,进入 C:\Users\用户名.gradle\wrapper\dists\gradle-3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9 目录中,删除除 gradle-3.3-all.zip.lck 文件外的所有文件夹和文件,复制浏览器下载好的 gradle-3.3-all.zip 到该目录,重新打开 Studio 即可。
问题 2 解决方案
1.查看 gradle-wrapper.properties要求的 Gradle 版本,去 C:\Users\用户名.gradle\wrapper\dists目录中看看对应版本目录下有没有对于 Gradle 版本的 zip包,没有的话,下载好丢进来即可,和问题 1 的解决方案一样。
2.因为 Studio 项目默认使用项目中的 Gradle 版本,即 gradle-wrapper.properties
文件配置的 Gradle 版本。我们下载不到 Gradle 的时候,可以给当前项目设置本地存在的 Gradle 版本。
这时候可能会报错:
Error:(1, 0) Minimum supported Gradle version is 3.3. Current version is 3.2.
这是因为给本项目配置的 Gradle 版本没有达到 classpath 'com.android.tools.build:gradle:2.3.0' gradle 插件要求的最低版本,插件版本改小点就行。这是 Gradle 插件各个版本的信息
#总结
出现 Gradle 一直 Buildling 或 refreshing 的问题是因为 Android Studio 在下载依赖的 Gradle 版本太慢,解决方案最好是自己下载需要的 Gradle 版本压缩包,丢进对应目录即可。
特别鸣谢Bakumon's Blog的文章,阅读这篇文章后,让我这个Android Studio小白对AS的目录结构有了一个深入的理解和认识。