Android中的Gradle——app/build.gradle

升级了Android Studio 3.0后 , 首次创建项目就报错了 , 经过一番折腾总算是解决了 , 但是仔细想想 , 还是感觉自己的gradle相比于java来说还是太弱了.这篇博客也希望能提醒一下各位 , 工欲善其事,必先利其器.

首先是我解决今天遇到问题的解决方法

首先查看对应的gradle版本
  • 手动下载Gradle . 即根目录->gradle->wrapper->gradle-wrapper.properties文件中 , 相对应的gradle版本 , 如图所示 《Android中的Gradle——app/build.gradle》 笔者这里是4-1-all版本的

其实对于这个问题 , 网上有很多解决方案 , 比如说手动修改对应的gradle版本为自己已有的版本。已有版本可以在如图所示的文件中找到,一般来说 , 只需要输入已经完整下载的gradle包即可(完整下载指的是,打开文件后有个.ok的文件,文件大小为0,这个文件是一个标志文件,标志着这个文件夹下的东西已经完全下载)

《Android中的Gradle——app/build.gradle》 本地已下载的gradle

但是我们今天不能这样做,如果你修改了gradle的版本,会在gradle中报一大堆错误,错误稍后再谈。所以还是科学上网,或者是手动下载新版本吧

修改了gradle版本带来的错误

修改了gradle的文件时,会提示app/build.gradle文件中大量标红 , 细心的老哥们会发现 , 包引入的方式居然发生了改变:

《Android中的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根目录下,用于定义开发者自己的混淆规则。

      《Android中的Gradle——app/build.gradle》 image.png

      这里贴上自己的代码:

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'
}

以上的依赖分别对应:

  1. 模块依赖项(工程依赖,module依赖)
    声明了一个名为third-party/FilePicker的本地 Android 库模块作为依赖项,并要求构建系统在构建应用时编译并包含该本地模块。

    《Android中的Gradle——app/build.gradle》 被依赖的项目位置

  2. 本地二进制依赖项

  3. 本地二进制依赖树
    本地依赖,告诉构建系统在编译类路径和最终的应用软件包中包含 app/libs/ 目录内的指定或全部 JAR 文件。如果有模块需要本地二进制依赖项,这些依赖项的 JAR 文件必须复制到项目内部的 /libs 中。

  4. 远程二进制依赖项

  5. 远程二进制依赖组
    远程二进制依赖,通过指定其 JCenter 坐标,针对 Android 支持库的 添加依赖。默认情况下,Android Studio 会将项目配置为使用顶级构建文件中的 JCenter 存储区。当您将项目与构建配置文件同步时,Gradle 会自动从 JCenter 中抽取依赖项。或者,您也可以通过使用 SDK 管理器下载和安装特定的依赖项。当然也可以自己制作开源库上传,再到这里用一句话引用

    原文作者:MinuitZ
    原文地址: https://www.jianshu.com/p/55e6e670a2ce
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞