文章大纲

  • 引言
  • 一、aaptOptions节点
    • 1、additionalParameters节点
    • 2、ignoreAssets和ignoreAssetsPattern
    • 3、noCompress
    • 4、cruncherProcesses
    • 5、cruncherEnabled
  • 二、sourceSets节点
  • 三、adbOptions、compileOptions 节点
  • 四、dataBinding节点
  • 五、dexOptions节点
  • 六、lintOptions节点
  • 七、packagingOptions节点
  • 八、Splits节点
  • 九、testOptions节点

引言

前面一篇文章Android 进阶——Android Studio 项目结构详细述及Gradle脚本语法android子节点buildTypes、productFlavors、variantFilt完全解析(二)总结了android节点下defaultConfig、productFlavors、variantFilter、buildTypes的配置,这篇把android中其他重要的节点——aaptOptions、sourceSets、adbOptions、 compileOptions、dataBinding、dexOptions、lintOptions、 packagingOptions、splits、testOptions总结完毕,参见android子节点信息
Gradle系列文章链接如下:

  • Android 进阶——Android Studio 项目结构详细述及Gradle脚本语法完全解析(一)
  • Android 进阶——Android Studio 项目结构详细述及Gradle脚本语法android子节点buildTypes、productFlavors、variantFilt完全解析(二)
  • Android 进阶——Android Studio 项目结构详细述及Gradle脚本语法android剩余子节点配置完全解析(三)
  • Android 进阶——Android Studio 项目结构详细述及Gradle脚本语法dependencies节点和依赖管理完全解析(四)

Android 进阶——Android Studio 项目结构详细述及Gradle脚本语法android剩余子节点配置完全解析(三)_第1张图片

一、aaptOptions节点

在这里插入图片描述
aapt全称Android Asset Packaging Tool即编译资源文件工具,也是通过闭包委托形式进行的配置,用于配置Android插件构建项目时处理资源文件工具,编译过程中所有对资源的处理最终都是交由aapt去完成,所以不同版本的aapt是需要配合正确的gradle 插件版本才能使用的的,比如说前面的versionCode等信息就是通过aapt插入到清单文件中的等。
Android 进阶——Android Studio 项目结构详细述及Gradle脚本语法android剩余子节点配置完全解析(三)_第2张图片

android{    //资源合并:aapt 编译资源文件    aaptOptions {        //aapt执行的额外参数        additionalParameters  //通过传递这个额外参数给aapt编译之后就可以把清单文件里的原来的包名改成com.crazymo.upd,如果还需要传递更多参数可以直接附加在后面用 ‘,’连接'--rename-manifest-package', 'com.crazymo.upd', //来指定资源重叠包overlay的res2'-S', 'src/main/res2', '--auto-add-overlay'        //对png进行优化检查        cruncherEnabled false        //对res中的资源进行排除        ignoreAssets '*.jpg'        //aapt l -v        noCompress '.bat'    }}

1、additionalParameters节点

用于给aapt传递的额外参数,相当于是在命令行运行的参数(The list of additional parameters to pass to aapt.),传递不同的参数编译之后就可以实现不同的作用。默认情况下只有一个res包,但是如果你需要针对不同的版本使用不同的资源,使用额外参数 ‘-S’,‘src/main/cmo’,’–auto-add-overlay’ 指定资源重叠包overlay,编译之后aapt就会自动把重叠包和默认的资源包合并,如果与res重名则取res下的,没有则把重叠包下的附加到res下,最终apk里的resources.asrc则拥有合并后的资源,首先在与res目录同级下新建一个资源目录cmo,再通过上面的参数传递(但如果有多个’-S’的话,最先指定的优先级最高),其实关于aapt合并资源的可以通过很多种形式进行配置,不仅仅可以通过additionalParameters来传递参数,还可以通过sourceSet来指定源集,也还配置productFlavor等。

Android 进阶——Android Studio 项目结构详细述及Gradle脚本语法android剩余子节点配置完全解析(三)_第3张图片
如果都配置了的话发生冲突时aapt会采取优先级从高到低进行资源合并,优先获取级别高的值,按照Build Variant>Build Type>Flavour>(main源集>aapt 传递的’-S’)>dependencies规则

2、ignoreAssets和ignoreAssetsPattern

用于忽略与条件表达式匹配中的res文件夹下的资源,被忽略的资源就不会被打包到apk里(assets下不会被忽略),比如说忽略掉所有以jpg结尾的图片,就可以这样配置 ignoreAssets ‘*.jpg’。

3、noCompress

用于配置在编译成apk的时候指定除了AAPT源码中预置的一些不被压缩的类型之外自定义类型的数据不被压缩,只要满足条件表达式匹配则不会进行压缩

//如此配置则将平滑地禁用所有文件的压缩noCompress ''  

可以使用命令aapt -l -v xx.apk进行查看

4、cruncherProcesses

设置要使用的cruncher进程数。 更多的cruncher进程会更快地处理文件,但需要更多的内存和CPU,仅仅是对编译过程有效,不需关注

5、cruncherEnabled

默认开启,是否对PNG进行优化检查(deprecated),编译时会对后缀为png的图片进行格式检查,如果不是正确的png图片会编译出错。

二、sourceSets节点

sourceSets来自于Android插件里自己的AndroidSourceSet配置源集的目录信息,可以给不同的源集指定不同的信息,Android插件会从源集的配置的目录组中查找项目的源代码和资源, 每个源集还会确定应使用其代码和资源的构建输出的范围。Android Studio创建新项目时,IDE会为main源集创建目录组存放被所有变体共享的代码和资源。而sourceSets节点则是提供给开发者配置自定义的源集,最终会把自定义的源集合并大main源集中,总之,main源集才是最终的代码执行入口。
Android 进阶——Android Studio 项目结构详细述及Gradle脚本语法android剩余子节点配置完全解析(三)_第4张图片

三、adbOptions、compileOptions 节点

dbOptions则是配置adb 命令执行的时候的一些信息,而compileOptions 则是配置编译信息,两者都与aapt 类似。

android {    adbOptions {        //apk安装时候的可选参数 即传递给adb 命令行执行时的参数,有很多参数比如说指定安装在sdcrad上等等        installOptions        //adb执行超时时间        timeOutInMs    }    compileOptions {        //java源文件编码 默认使用UTF-8        encoding  'UTF-8'        //java编译是否使用gradle新的增量模式,不用特意改变默认值        incremental true//如果需要使用1.8 需要开启jackOptions        sourceCompatibility  JavaVersion.VERSION_1_7        targetCompatibility  JavaVersion.VERSION_1_7    }}

四、dataBinding节点

dataBinding节点是用于引入Data Binding支持库的,只要设置了enable=true的时候就会自动引入库的支持。

五、dexOptions节点

在这里插入图片描述
用于配置Dex 工具选项信息,如果方法数超过65K则会进行分包处理。

子节点或属性名称说明
additionalParametersList of additional parameters to be passed to dx.传递给dx的额外参数,相当于是在命令行运行的参数dx --xxxxx,具体参数可以使用dx --help查阅比如dx --minimal-main-dex 用于指定生成最小化main dex(哪怕方法数没有超过);实际上前面的其他相关节点或属性配置的信息最终都是传递到dx去执行的,比如说multiDexEnabled设置为true的时候就是最终传递到dx 中的–multi-dex 参数中
javaMaxHeapSizeSpecifies the -Xmx value when calling dx. Example value is “2048m”.
jumboModeEnable jumbo mode in dx (–force-jumbo).即可以编译更大的dex
keepRuntimeAnnotatedClasses在主dex中保留所有具有运行时注解的类。
maxProcessCount最大进程数默认为4
preDexLibraries默认开启预编译处理,可以提高效率,但是执行clean的时候会很慢
threadCount最大线程数默认为4
android {   ....     buildTypes {        debug {            multiDexEnabled true//keep_in_main.txt与build.gradle同目录            multiDexKeepFile file('keep_in_main.txt')        }    }    //dx 配置    dexOptions {        //最小化生成main dex        //--minimal-main-dex 如果指定了这个参数及时没有超过65K 也会进行分包,只把必须放在main dex的放在dex,其他的会分到其他包        //--set-max-idx_number 单个dex 最大id数        additionalParameters '--minimal-main-dex','--set-max-idx-number=5000'        //大模式 dex        jumboMode true    }}

六、lintOptions节点

lintOptions节点是用于配置lint代码检查工具的,使用lint 工具可以发现并纠正代码潜在错误即提高代码质量,开启并执行lint检查任务之后会在app/build/reports/lint-result-xxxx

apply plugin: 'com.android.application'android {   ....    //lint工具配置 帮助发现并纠正代码结构质量    lintOptions {        //发现错误 停止构建        abortOnError true//        error('UnusedResources') 如果把指定id配置到error里意味着则一旦发生没有使用的资源则认为是错误,相当于是提升了id的级别//        check 'UnusedResources' //检查指定id 可以使用lint --list 获取检查id        checkAllWarnings true //检查所有警告        checkReleaseBuilds true //在release 是否检查fatal错误//        enable 'UnusedResources'  //开启指定id的检查//        disable               //关闭//        htmlOutput        //html输出文件//        htmlReport        //是否生成htmloutput//        ignoreWarnings true    //是否忽略警告只报告错误//        noLines       //是否在生成错误时需要包含行数        quiet true         //在终端中关闭分析消息输出        warningsAsErrors true //将警告变成错误    }}

七、packagingOptions节点

打包成APK配置的选项,主要是在用于引入多种依赖库的时候发生错误,可以配置这个选项来进行配置,这个节点支持的属性比较简单主要有三个属性参见PackagingOptions:

  • pickFirsts ——当出现重复文件 会使用第一个匹配的文件打包进入apk,默认为空
  • merges ——当出现重复文件时合并重复的文件打包进入apk,默认值为/META-INF/services/**,调用merge方法时候不会附加默认值,而调用setMerges会覆盖掉默认值
  • excludes ——打包的时候排除匹配的文件,默认有一堆列表具体参见

比如说在项目中同时引入两个库的时候,如下图:
Android 进阶——Android Studio 项目结构详细述及Gradle脚本语法android剩余子节点配置完全解析(三)_第5张图片
这时候就可以使用配置packagingOptions节点来处理:

        packagingOptions{//        pickFirsts = ['META-INF/LICENSE'] // Not really needed because the default is empty.//        merge 'META-INF/LICENSE'            exclude 'META-INF/LICENSE'    }

八、Splits节点

Splits节点用于分包配置也很简单包含三个子节点:

  • abi —— 封装用于构建每个ABI 对应的APK的设置。

  • density ——封装用于构建每屏幕密度对应的APK的设置。

  • language ——封装用于构建每种语言(或语言环境)对应的APK的设置

如果应用需要针对多种设备配置(比如说不同的屏幕密度和应用程序二进制接口ABI),通过分包配置可避免将所有配置的资源打包到单个大型APK中,通过配置不同节点的信息,打包生成不同结构不同版本的APK,Android插件和Google Play商店正是提供了以下策略来生成和提供每个针对不同设备配置的构建脚本。

    splits{//        abi {  //开启abi分包,假如说单独配置这个属性的时候true其他属性没有配置,编译打包的时候会生成所有abi版本的apk  enable true//            reset() 重置所有配置信息//            include 'x86','armeabi-v7a' 设置把动态库包含到指定的abi架构中,而没有指定的则不会吧动态库包含到对应abi下的apk//            exclude 'x86' 排除,与include作用相反//            universalApk true //生成包含所有abi架构的全量apk//        }         density{//            enable true//            exclude('xhdpi')         }    }

九、testOptions节点

testOptions节点用于配置单元测试:本地测试test和设备测试androidTest

//    testOptions{        animationsDisabled true //设备测试时禁用动画效果,以排除因为单元测试中动画可能产生的bug(专注于逻辑测试)        unitTests.all {            systemProperty 'blog', 'crazymo' //设置systemProperty key-value,这样就可以在单元测试里通过System.getProperty("blog");获取对应的值即crazymo            testLogging.showStandardStreams = true //开启在命令行标准化输出            exclude 'com/crazymo/demo/test'include 'com/crazymo/demo/test2'        }    }

未完待续…

更多相关文章

  1. Android进阶知识树——Android系统的启动过程
  2. 福利!!!你想要的Android、Java、Python、QT等等视频资源都在这里
  3. Android中文资源站专栏:五个好用的日常软件
  4. Android中的资源分析
  5. android 查看apk中资源文件
  6. Android xml资源文件animal动画解析
  7. Android 之 资源自适应与国际化
  8. android如何获取url指定的图片资源

随机推荐

  1. MultiDex 遇到的大坑
  2. Android(安卓)Glide加载四周圆角图
  3. CheckedTextView 复选框左显示
  4. android 工程,点击图片,在屏幕显示
  5. Android(安卓)sensor 学习--sensor介绍
  6. Android(安卓)RecyclerView多个Item布局
  7. 在android获取root权限的方法^_^。
  8. Android的权限 permission
  9. Android(安卓)SDK Manager解决更新时的问
  10. Error:(19, 0) Gradle DSL method not fo