六.Android Gradle插件
1.概述
Android Gradle插件继承于Java插件,具有Java插件的所有特性,也有自己的特性,看下官方介绍:
可以很容易地重用代码和资源
可以很容易地创建应用的衍生版本
可以很容易地配置、扩展以及自定义构建过程
和IDE无缝整合
2.插件分类
App应用工程:生成可运行apk应用;id: com.android.application
Library库工程:生成aar包给其他的App工程公用;id: com.android.library
Test测试工程:对App应用工程或Library库工程进行单元测试;id: com.android.test
3.项目结构
- |-example
- | |-build.gradle| |-example.iml
- | |-libs
- | |-proguard-rules.pro 混淆配置文件
- | |-src
- | |-androidTest
- | |-java Android单元测试代码
- | |-main
- | |-java App主代码
- | |-res 资源文件
- | |-AndroidManifest.xml 配置文件
- | |-test
- | |-java 普通单元测试代码
4.内置任务
<一>Java插件内置任务:如build、assemble、check等
<二>Android特有的常用任务:
connectedCheck任务:在所有连接的设备或者模拟器上运行check检查
deviceCheck任务:通过API连接远程设备运行checks
lint任务:在所有ProductFlavor上运行lint检查
×××tall、un×××tall任务:在已连接的设备上安装或者卸载App
signingReport任务:打印App签名
androidDependencies任务:打印Android 依赖
5.应用实例
- //应用插件,Android Gradle属于Android发布的第三方插件buildscript{
- repositories{
- jcenter()
- }
- dependencies{
- classpath 'com.android.tcols.build:gradle:1.5.0'}
- }
- apply plugin:'com.android.application'//自定义配置入口,后续详解android{
- compileSdkVersion 23 //编译Android工程的SDK版本buildToolsVersion "23.0.1" //构建Android工程所用的构建工具版本defaultConfig{
- applicationId "org.minmin.app.example"
- minSdkVersion 14
- targetSdkVersion 23
- versionCode 1
- versionName "1.0"}
- buildTypes{
- release{
- minifyEnabled false
- proguardFiles getDefaultPraguardFile('proguard-andrcid.txt'), 'proguard-rules.pro'
- }
- }
- }//配置第三方依赖dependencies{
- compile fileTree(dir:'libs', include:['*.jar'])
- testCompile 'junit:junit:4.12'
- compile 'com.android.support:appcorpat-v7:23.1.1'
- compile 'com.android.support:design:23.1.1'}
a.defaultConfig
作用:用于定义所有的默认配置,是一个ProductFlavor,若ProductFlavor没有被特殊定义,默认使用defaultConfig块指定的配置
常用配置:
b.buildTypes
作用:是构建类型,在Android Gradle中内置了debug和release两个构建类型,差别在于能否在设备上调试和签名不同
每一个BuildType都会生成一个SourceSet以及相应的assemble<BuildTypeName>任务
常用配置:
c.signingConfigs
作用:配置签名设置,标记App唯一性、保护App
可以对不同构建类型采用不同签名方式:debug模式用于开发调试,可以直接使用Android SDK提供的默认debug签名证书;release模式用于发布,需要手动配置
常用配置:
android { signingConfigs { release{ storeFile file('myFile.keystore') storePassword 'psw' keyAlias 'myKey' keyPassword 'psw' } } }
d.productFlavors
作用:添加不同的渠道、并对其做不同的处理
常用配置:
- //定义baidu和google两个渠道,并声明两个维度,优先级为abi>version>defaultConfigandroid{
- flavorDimensions "abi", "version"
- productFlavors{
- google{
- dimension "abi"
- }
- baidu{
- dimension "version"
- }
- }
e.buildConfigFiled
作用:在buildTypes、ProductFlavor自定义字段等配置
方法:buildConfigField(String type,String name,String value)
type:字段类型
name:字段常量名
value:字段常量值
android{ buildTypes{ debug{ buildConfigField "boolean", "LOG_DEBUG", "true" buildConfigField "String", "URL", ' "http://www.ecjtu.jx.cn/" ' } } }
6.多项目构建
和Java Grdle多项目构建一样的,通过settings.gradle配置管理多项目;在每个项目都有一个build.gradle,采用项目依赖就能实现多项目协作。
项目直接依赖一般适用于关联较紧密、不可复用的项目,如果想让项目被其他项目所复用,比如公共组件库、工具库等,可以单独发布出去。
7.多渠道构建
a.基本原理
构建变体(Build Variant)=构建类型(Build Type)+构建渠道(Product Flavor)
Build Type有release、debug两种构建类型
Product Flavor有baidu、google两种构建渠道
Build Variant有baiduRelease、baiduDebug、googleRelease、googleDebug四种构件产出
构建渠道(Product Flavor)还可以通过dimension进一步细化分组
assemble开头的负责生成构件产物(Apk)
assembleBaidu:运行后会生成baidu渠道的release和debug包
assembleRelease:运行后会生成所有渠道的release包
assembleBaiduRelease:运行后只会生成baidu的release包
b.构建方式:
通过占位符manifestPlaceholders实现:
- //AndroidManifest<meta-data
- android: value="Channel ID"
- android:name="UMENG_ CHANNEL"/> //build.gradle
- android{
- productFlavors{
- google{
- manifestPlaceholders.put("UMENG_ CHANNEL", "google")
- }
- baidu{
- manifestPlaceholders.put("UMENG_ CHANEL", "baidu")
- }
- }
- //改进:通过productFlavors批量修改android{
- productFlavors{
- google{
- }
- baidu{
- }
- ProductFlavors.all{ flavor->
- manifestPlaceholders.put("UMENG_ CHANEL", name)
- }
- }
8.高级应用
**a. **使用共享库
android sdk库:系统会自动链接
共享库:独立库,不会被系统自动链接,使用时需要在AndroidManifest通过<uses-library>指定
//声明需要使用maps共享库,true表示如果手机系统不满足将不能安装该应用 <uses-library android:name="com.google.android.maps" android:required="true" />
add-ons库:存于add-ons目录下,大部分由第三方厂商或公司开发,会被自动解析添加到classpath
optional可选库:位于platforms/android-xx/optional目录下,通常为了兼容旧版本的API,使用时需要手动添加到classpath
**b. **批量修改生成的apk文件名
<一>类型:
applicationVariants :仅仅适用于Android应用Gradle插件
libraryVariants :仅仅适用于Android库Gradle插件
testVariants :以上两种Gradle插件都使用
<二>示例:
applicationVariants是一个DomainObjectCollection集合,通过all方法遍历每一个ApplicationVariant,这里有googleRelease和googleDebug两个变体;然后判断名字是否以.apk结尾,如果是就修改其文件名。示例中共有。
c.动态生成版本信息
原始方式:由defaultConfig中的versionName指定
分模块方式:把版本号等配置抽出放在单独的文件里,并用ext{}括起来,通过apply from将其引入到build.gradle,版本信息就被当作扩展属性直接使用了
从git的tag中获取
从属性文件中动态获取和递增
d.隐藏签名文件信息
<一>必要性:为保证签名信息安全,最好直接放在项目中,而是放在服务器上
<二>一种思路:
服务器:配置好环境变量,打包时直接使用
本地:直接使用android提供的debug签名
在signingConfigs加入以下判断
- signingConfigs { if (System.env.KEYSTORE_PATH != null) { //打包服务器走这个逻辑
- storeFile file(System.env.KEYSTORE_PATH)
- keyAlias System.env.ALIAS
- keyPassword System.env.KEYPASS
- storePassword System.env.STOREPASS
- } else { //当不能从环境变量取到签名信息时,使用本地debug签名
- storeFile file('debug.keystore')
- storePassword 'android'
- keyAlias 'androiddebugkey'
- keyPassword 'android'
- }
- }
e.动态添加自定义的资源
<一>针对res/values中的资源,除了使用xml定义,还可以通过Android Gradle定义
<二>方法:resValue(String type, String name, String value)
type:资源类型,如有string、id、bool
name:资源名称,以便在工程中引用
value:资源值
productFlavors{ google{ resValue 'string', 'channel_tips', 'google渠道欢迎你' } }
以google为例,在debug模式下,资源文件保存目录:build/generated/res/resValues/google/debug/values/generated.xml
f.Java编译选项
通过compileOptions{}闭包进行编译配置,可配置项:
encoding:配置源文件的编码
sourceCompatibility:配置Java源代码的编译级别
targetCompatibility:配置生成Java字节码的版本
android{ compileOptions{ encoding = 'utf-8' sourceCompatibility = JavaVersion.VERSI0N_ 1_ 6 targetCompatibility = JavaVersion.VERSION_ 1_ 6 } }
g.adb选项配置
通过adbOptions{}闭包进行adb配置,可配置项:
<一>timeOutInMs:设置执行adb命令的超时时间,单位毫秒
<二>×××tallOptions:设置adb ×××tall安装设置项
-l:锁定该应用程序
-r:替换已存在的应用程序,即强制安装
-t:允许测试包
-s:把应用程序安装到SD卡上
-d:允许进行降级安装,即安装版本比手机自带的低
-g:为该应用授予所有运行时的权限
android{ adbOptions{ timeOutInMs = 5*1000 ×××tallOptions '-r', '-s' } }
h.DEX选项配置
通过dexOptions {}闭包进行dex配置,可配置项:
incremental:配置是否启用dx的增量模式,默认值为false
javaMaxHeapSize:配置执行dx命令时为其分配的最大堆内存
jumboMode:配置是否开启jumbo模式
preDexLibraries:配置是否预dex Libraries库工程,默认值为true,开启后会提高增量构建的速度
threadCount:配置Android Gradle运行dx命令时使用的线程数量
好文推荐:寒冬下2年android的搞笑求职历程 有需要关于Android进阶方面的学习高级技术大纲以及免费教学视频资料的可以私信我【领取资料】哦!