升级了Android Studio 3.0后 , 首次创建项目就报错了 , 经过一番折腾总算是解决了 , 但是仔细想想 , 还是感觉自己的gradle相比于java来说还是太弱了.这篇博客也希望能提醒一下各位 , 工欲善其事,必先利其器.
首先是我解决今天遇到问题的解决方法
首先查看对应的gradle版本
-
手动下载Gradle . 即根目录->gradle->wrapper->gradle-wrapper.properties文件中 , 相对应的gradle版本 , 如图所示
其实对于这个问题 , 网上有很多解决方案 , 比如说手动修改对应的gradle版本为自己已有的版本。已有版本可以在如图所示的文件中找到,一般来说 , 只需要输入已经完整下载的gradle包即可(完整下载指的是,打开文件后有个.ok的文件,文件大小为0,这个文件是一个标志文件,标志着这个文件夹下的东西已经完全下载)
但是我们今天不能这样做,如果你修改了gradle的版本,会在gradle中报一大堆错误,错误稍后再谈。所以还是科学上网,或者是手动下载新版本吧
修改了gradle版本带来的错误
修改了gradle的文件时,会提示app/build.gradle文件中大量标红 , 细心的老哥们会发现 , 包引入的方式居然发生了改变:
这里从compile变成了implementation这种新的方式 , 因为这里是使用默认的gradle版本来生成的语句,手动修改版本必然会出现问题。可以自己手动修改过来就好了,如果直接用新版本的gradle这里不用理会。至于为什么会出现这种改变,这里就不再讨论了
仍然报错?
这就是平时的习惯问题了,检查设置中gradle是不是设置为离线模式了。在默认新版本的gradle下回引入新版本的包,比如v7包,离线模式时候,在本地当然找不到这个包。如果你把引用的包改掉也可以(会有不少需要改),但这里建议你关闭离线模式,让gradle去下载新的包就行啦
其实说到底,还是对gradle不够了解。所以接下来就来总结一下Gradle文件中,各个字段的含义以及用法,小技巧在另一篇博客中收集(待更新)。
app/build.gradle文件
1. android->defaultConfig 默认偏好设置
动态的在build时配置AndroidManifest.xml里的项目,defaultConfig里的配置可以覆盖manifest里的配置。
- 在build.gradle文件生成一个applicationId,对应的属性值是填写的package name。applicationId表示真正的包名,而package不再被认为是包名,因为应用程序被打包成apk文件的时候,原先在manifest声明的package被applicationId代替。也刚好说明为什么应用程序安装到手机后,手机上显示的是applicationId,而不是显示package,同时如果想在应用程序中接入第三方的API,填写的包名也必须是applicationId。
- versionName,versionCode: 版本名和版本号
- minSdkVersion,targetSdkVersion: 支持的安卓设备版本的区间
- testInstrumentationRunner:允许自动化测试
- ndk { // 设置支持的SO库架构
abiFilters 'armeabi', 'x86', 'x86','x86_64', 'armeabi-v7a', 'arm64- v8a'
} - buildConfigField:自定义字段,方便调试时打log,如
buildConfigField("int", "SLEEP_TIME", "5000")
public static final boolean DEBUG = BuildConfig.API_ENV;
2. android-> signingConfigs 自定义签名设置
(懒得配置了,个人喜欢手动签名)
3. android->buildTypes 构建类型
每一个APP至少包含debug和release两种构建类型,debug定义APP的调试版本
- debug模式的几个特点:
支持断点调试和log信息打印,debuggable属性值为true
使用系统默认的密钥库签署apk文件
没有对apk文件进行代码和资源文件的优化(包括文件压缩、冗余文件删除)
没有对代码进行混淆 - release定义APP的发布版本:
不支持断点调试,debuggable默认为false
没有压缩类文件代码,minifyEnabled,默认为false
没有压缩资源文件,shrinkResources,默认为false
没有指定自定义签名文件,默认使用系统的密钥库签署apk- minifyEnable定义是否压缩代码,false表示不压缩
-
proguardFiles定义混淆代码的默认混淆规则:
proguard-android.txt表示系统自带的混淆规则,
proguard-rules.pro位于当前module根目录下,用于定义开发者自己的混淆规则。
这里贴上自己的代码:
buildTypes {
release {
//混淆配置打开时,才会自动上传符号表到 BugHD
minifyEnabled false
//对齐优化设置为true,否则找不到该task (默认不写也是true)
zipAlignEnabled true
//配置正式版签名证书信息,否则上传release版本是unsigned_apk,导致无法安装。
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
shrinkResources true //移除无用的资源文件
}
debug {
minifyEnabled false// 是否混淆
shrinkResources true //移除无用的资源文件
}
}
4. android->dexOptions DEX文件构建属性配置(加快构建速度)
Android Studio在每次构建的时候,都感觉花好长时间,这时候我们可以配置一下dexOption加快构建速度
- preDexLibraries 声明是否预先编译依赖库,实质是通过延时清除已生成的依赖库的构建文件,达到加快速度的目的。
- maxProcessCount 设置进程运行过程中可以使用的最大线程数。默认值为4。
- javaMaxHeapSize 设置DEX编译器的最大堆大小,堆或者栈都是用于存放暂时不用的垃圾,当内存不足时,垃圾回收机制会清除过时的缓存,堆大小决定垃圾清除的频率,影响着构建的速度
dexOptions {
incremental true //使用增量构建
javaMaxHeapSize "4g" //设置堆内存
jumboMode = true //大工程模式
maxProcessCount=8
}
以上的配置,在引入MultiDex的时候,有几率会在debug模式下报错,但是在release时正常,所以在引入MultiDex的情况下,debug时手动注释掉,release时放开
5. android->splits 将一个apk拆分成多个相关配置(拆分依据:屏幕密度、系统架构)
(姑且没用过)
6. dependencies 引入的依赖包
dependencies {
compile project(':third-party:FilePicker')
compile files('libs/zxing.jar')
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:25.1.0'
compile group: 'com.android.support', name: 'appcompat-v7', version: '25.1.0'
}
以上的依赖分别对应:
-
模块依赖项(工程依赖,module依赖)
声明了一个名为third-party/FilePicker的本地 Android 库模块作为依赖项,并要求构建系统在构建应用时编译并包含该本地模块。
本地二进制依赖项
本地二进制依赖树
本地依赖,告诉构建系统在编译类路径和最终的应用软件包中包含 app/libs/ 目录内的指定或全部 JAR 文件。如果有模块需要本地二进制依赖项,这些依赖项的 JAR 文件必须复制到项目内部的 /libs 中。远程二进制依赖项
远程二进制依赖组
远程二进制依赖,通过指定其 JCenter 坐标,针对 Android 支持库的 添加依赖。默认情况下,Android Studio 会将项目配置为使用顶级构建文件中的 JCenter 存储区。当您将项目与构建配置文件同步时,Gradle 会自动从 JCenter 中抽取依赖项。或者,您也可以通过使用 SDK 管理器下载和安装特定的依赖项。当然也可以自己制作开源库上传,再到这里用一句话引用。