看完这篇Gradle,你才能去面腾讯

Posted 码个蛋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了看完这篇Gradle,你才能去面腾讯相关的知识,希望对你有一定的参考价值。

码个蛋(codeegg)第 652 次推文


原文:https://www.jianshu.com/p/1274c1f1b6a4



六.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检查

  • install、uninstall任务:在已连接的设备上安装或者卸载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块指定的配置

  • 常用配置:

看完这篇Gradle,你才能去面腾讯


b.buildTypes


  • 作用:是构建类型,在Android Gradle中内置了debug和release两个构建类型,差别在于能否在设备上调试和签名不同

  • 每一个BuildType都会生成一个SourceSet以及相应的assemble<BuildTypeName>任务

  • 常用配置:

看完这篇Gradle,你才能去面腾讯


c.signingConfigs


  • 作用:配置签名设置,标记App唯一性、保护App

  • 可以对不同构建类型采用不同签名方式:debug模式用于开发调试,可以直接使用Android SDK提供的默认debug签名证书;release模式用于发布,需要手动配置

  • 常用配置:

看完这篇Gradle,你才能去面腾讯

android {
 signingConfigs {
 release{
  storeFile file('myFile.keystore')
  storePassword 'psw'
  keyAlias 'myKey'
  keyPassword 'psw'
 }
 }
}


d.productFlavors


  • 作用:添加不同的渠道、并对其做不同的处理

  • 常用配置:

看完这篇Gradle,你才能去面腾讯

//定义baidu和google两个渠道,并声明两个维度,优先级为abi>version>defaultConfig
android{
 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_ 16
  targetCompatibility = JavaVersion.VERSION_ 16
 }
}


g. adb选项配置

通过adbOptions{}闭包进行adb配置,可配置项:


<一>timeOutInMs:设置执行adb命令的超时时间,单位毫秒

<二>installOptions:设置adb install安装设置项


  • -l:锁定该应用程序

  • -r:替换已存在的应用程序,即强制安装

  • -t:允许测试包

  • -s:把应用程序安装到SD卡上

  • -d:允许进行降级安装,即安装版本比手机自带的低

  • -g:为该应用授予所有运行时的权限


android{
 adbOptions{
  timeOutInMs = 5*1000
  installOptions '-r''-s'
 }
}


h.DEX选项配置

通过dexOptions {}闭包进行dex配置,可配置项:


  • incremental:配置是否启用dx的增量模式,默认值为false

  • javaMaxHeapSize:配置执行dx命令时为其分配的最大堆内存

  • jumboMode:配置是否开启jumbo模式

  • preDexLibraries:配置是否预dex Libraries库工程,默认值为true,开启后会提高增量构建的速度

  • threadCount:配置Android Gradle运行dx命令时使用的线程数量


近期文章:






今日问题:

腾讯大佬弥补了你的Gradle漏洞了吧?


快来码仔社群解锁新姿势吧!

以上是关于看完这篇Gradle,你才能去面腾讯的主要内容,如果未能解决你的问题,请参考以下文章

看完这篇,轻松get限流!

看完这篇Java基础,你也是天花板

一个小时,零基础入门,看完这篇30行代码 教你实现百度换肤!

看完这篇,成为Grafana高手!

flutter这么香,该怎么学?看完这篇包你学会

入手公司项目却不会Maven?看完这篇保你轻松掌握(附资料分享)