美文网首页StudioAndroid开发Android技术知识
Android中的Gradle——app/build.gradl

Android中的Gradle——app/build.gradl

作者: MinuitZ | 来源:发表于2017-11-16 17:06 被阅读83次

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

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

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

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


    本地已下载的gradle

    但是我们今天不能这样做,如果你修改了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根目录下,用于定义开发者自己的混淆规则。


        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 库模块作为依赖项,并要求构建系统在构建应用时编译并包含该本地模块。


      被依赖的项目位置
    2. 本地二进制依赖项

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

    4. 远程二进制依赖项

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

    相关文章

      网友评论

        本文标题:Android中的Gradle——app/build.gradl

        本文链接:https://www.haomeiwen.com/subject/srulvxtx.html