Android(安卓)Gradle知识点总结
Gradle是Android的第三方插件,是由Google的Android团队开发的。从Android的角度看,Android插件是基于Gradle构建的,和Android Studio完美无缝搭配的新一代构建系统。
Android官方对于Gradle的介绍:
- 可以容易地重用代码和资源;
- 可以容易地创建应用的衍生版本,所以不管是创建多个apk,还是不同功能的应用都很方便;
- 可以容易地配置/扩展以及自定义构建过程;
- 和IDE无缝整合。
1.Android Gradle插件简介:
Android Gradle的插件分类其实是根据Android工程属性分类的。在Android中有3种工程:一类是app应用工程,可以生成一个可运行的apk应用;一类是Library库工程,可以生成ARR包给其他app公用,就和jar一样但它包含了Android的资源等信息,是特殊的jar包;最后一类Test测试工程,用于对app工程和Library工程进行单元测试。
- APP插件 id:com.android.application
- Library插件 id:com.android.library
- Test插件 id:com.android.test
2.Android Gradle插件的应用:
要使用一个插件时必须知道它的插件id,除此之外,如是第三方插件还要配置classpath。Android Gradle插件属于第三方插件,托管于Jcenter上,使用前必须配置依赖classpath。
buildscript { repositories { google() jcenter() //构建脚本引入jcenter } dependencies { classpath 'com.android.tools.build:gradle:3.5.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}
buildscript{}这部分配置可以写到根工程的build.gradle脚本文件中,这样所有的子工程就不用重复配置了。
android{}是Android插件提供的一个扩展类型,这Android Gradle工程的唯一的入口,可以自定义Android Gradle工程。
apply plugin: 'com.android.application'android { compileSdkVersion 28 defaultConfig { applicationId "com.example.demo1" minSdkVersion 15 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }}dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' implementation 'com.android.support:recyclerview-v7:27.1.1'}
3.Android Gradle工程属性解析:
- compileSdkVersion:是配置编译Android工程的SDK;
- buildToolsVersion:是配置Android构建工具的版本;
- defaultConfig:是默认配置,它是一个ProductFlavtor,ProductFlavtor允许根据不同情况同时生成多个不同的apk包;
minSdkVersion: 是最低支持Android系统的API LEVEL;
targetSdkVersion: 表明基于哪个Android版本开发的;
versionCode: 表示app应用内部版本号,一般用于控制app升级;
versionName:表示app应用版本名称,用户可以看到发布的版本号;
- buildType:是一个NameDomainObjectContainter类型,是一个域对象。可以在buildType{}里新增任意多个需要构建的类型,如debug/release等。
minifEnable:是否为构建类型启用混淆;
proguardFiles:当启用混淆时,所使用的proguard的配置文件。
4.Android Gradle任务:
Android插件时基于Java插件,所以Android插件基本上包含了所有Java插件的功能,包括继承任务如assemble/check/build等。除此之外Android在大类上还添加了connectedCheck/deviceCheck/lint/install/uninstall等任务。
这些是属于Android特有的功能:
- connectedCheck:在所有的连接设备或模拟器上运行check检查;
- deviceCheck:通过API连接远程设备上运行checks,被用于CI(持续集成)服务器上;
- lint:在所有ProductFlavtor上运行lint检查;
- install/uninstall:可以直接连接设备上的安装或者卸载app;
5.自定义Android Gradle工程:
- defaultConfig默认配置:defaultConfig是Android对象中的一个配置块,负责定义所有的默认配置。它是一个ProductFlavtor,如一个ProductFlavtor没有被特殊定义配置的话,默认就会使用defaultConfig{}块指定配置,比如包名/版本号/版本名称等;
- 配置签名信息:一个app只有在签名之后才能被发布/安装/使用,签名是保护app的方式,标记该app的唯一性。
- 构建的应用类型:在buildTypes{}代码块中添加元素即可。
applicationIdSuffix:用于配置基于默认applicationId的后缀,如在defaultConfig设置applicationId为"com.example.demo",在debug中buildTypes设置applicationId为debug,最终生成debug apk的包名为com.example.demo.debug;
debuggable:也是buildTypes的属性,用于配置是否生成一个可供调试的apk;
jniDebuggable:是buildTypes的属性,用于配置是否生成一个可供调试jni(C/C++)代码的apk;
minifEnabled:用于配置该buildTypes是否启动Proguard混淆;
multiDexEnable:用于配置该buildTypes是否启动自动拆分多个Dex的功能;
proguardFile:用于配置Proguard混淆使用的配置文件;
proguardFiles:用于配置Proguard混淆使用的配置文件,该方法可以同时配置多个Proguard配置文件;
shrinkResoures:用于配置是否自动清理未使用的资源;
singingConfig:用于配置该buildTypes使用签名配置;
zipalign:是Android提供的整理优化apk的工具,它能提高系统和应用运行的效率,更快地读写apk中资源,降低内存的使用。所以对于要发布的app一定要使用zipalign进行优化;
6.Android Gradle高级自定义:
- 使用共享库:
Android的包(如android.app/android.content/android.view/android.widget等)都是默认就包含在Android SDK库里的,所有应用都可以直接使用它们,系统会自动连接它们,不会出现找不到相关类的情况;
还有些独立的库(如com.google.android.maps/com.test.runner等)并不会被系统自动连接,所以在使用需单独进行生成使用,这类称为共享库;
在Android中,除了标准的SDK还存在两种库:一种是add-ons库,它们位于add-ons目录下这些库大部分是第三方厂商或公司开发的,一般是为了开发者使用,又不想暴露其具体实现;另一种optional可选库,platforms/android-xx/optional目录下,一般为了兼容就版本的API。
- 批量修改生成的apk文件名:既要修改生成的apk文件名,那么就要修改Android Gradle打包输出。为了解决这问题Android提供了3个属性:applicationVariants(仅仅适用于Android应用Gradle的插件)/ libraryVariants(仅仅适用Android库Gradle的插件)/testVariants(以上两种都适用);
下面是批量修改apk名字的例子:
android { compileSdkVersion 28 defaultConfig { applicationId "com.example.demo1" minSdkVersion 15 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } productFlavors { google{ } } applicationVariants.all { Variant -> Variant.outputs.each{ output -> if (output.outputFile != null && output.outputFile.name.endWith('.apk') && 'release'.equals(variant.buildType.name) ){ def flavorName = variant.buildType.startWith("_") ? variant.flavorName.subString(1) : variant.flavorName def apkFile = new File(output.outputFile.getParent() ,"demo_${flavorName}_v${variant.versionName}_${buildTime()}.apk") //${}是占位符 output.outputFile = apkFile } } }}def buildTime() { def date = new Date() def formattedDate = date.format("yyyyMMdd") return formattedDate}
- 动态生成版本信息:
1、一般版本有3部分构成:major.minor.patch,第一个是主版本号,第二个是副版本号,第三个是补丁号。
分模块的方式:可以版本号的配置单独抽取出来,放在单独的文件里,供build引用。引入模块化“apply from”,新建一个version.gradle文件专用于存放版本,在项目的build.gradle中apply from:‘version.gradle’。之后使用version.gradle中的如appVersionCode等属性值;
version.gradleext { appVerionCode = 1 appVersionName = '1.0.1'}
2、从git的tag中获取:
在Git中获取当前tag的名称命令如下
git describe --abbrev=0 --tags
project的exec方法有commandLine方法可使用
def getAppVersionName() { def stdout = new ByteArrayOutputStream() exec { commandLine 'git','describ','--abbrev=0','--tags' standarOutput = stdout } return stdout.toString()}def getAppVersionCode() { def stdout = new ByteArrayOutputStream() exec { commandLine 'git','tag','--list' standarOutput = stdout } return stdout.toString().split("\n").size()}
3、从属性文件中获取和递增:
在项目目录下新建一个version.properties的属性文件;
把版本名称分成3部分major.minor.patch,版本号分成一部分number,然后在version.properties中新增4个KV键值对;
在build.gradle里新建两个方法,用于读取属性文件,获取对应key值,然后把major.minor.patch这3个key拼接成版本名称number为版本号;
获取之后要更新存放在version.properties文件中以便下次使用。
- 隐藏签名文件信息:
为了保密措施,签名信息不能放在项目中,也不能放在每个开发者的计算机上。解决的方法就是把签名信息放在服务器上,所以要有一台专门用于打包发版的服务器,把签名文件和秘钥信息放到服务器上,在打包时去读取即可。
下面是使用环境变量的方式:
signingConfigs { def appStoreFile = System.getenv("STORE_FILE") def appStorePassword = System.getenv("STORE_PASSWORD") def appKeyAlias = System.getenv("KEY_ALIAS") def appKeyPassword = System.getenv("KEY-PASSWORD") release { storeFile file(appStoreFile) storePassword appStorePassword keyAlias appKeyAlias keyPassword appKeyPassword }}
- 动态配置AndroidManifest文件:
在构建过程中动态修改AndroidManifest文件中的内容,如使用友盟分析统计时,会要求我们在AndroidManifest总指定渠道名称
Android Gradle提供了让我们替换AndroidManifest文件中的内容,就是占位符manifestPlaceholder/Manifest等
productFlavors { google { manifestPlaceholders.put("UMENG_CHANNEL","google") } baidu { manifestPlaceholders.put("UMENG_CHANNEL","baidu") }}
- 自定义BuildConfig::
Android Gradle提供了buildConfigField(String type,String name,Stirng value)方法可添加常量到BuildConfig中去。
- 动态添加自定义资源:
Android开发中,资源都在res文件夹里定义,然后在工程里引用。这里的自定义资源是专门针对res/values类型资源的,不光可以在res/values文件夹里使用xml的方式定义,也还可以在Android Gradle中定义。
实现这一功能正是resValue方法,它在BuildType和ProductFlavor这两个对象中都存在。这样可以分别针对不同渠道,活不同构建类型来自定义其特有的资源。
- Java编译选项:
需对Java源文件的编码、源文件使用的JDK版本等进行调优修改,Android对象中提供一个compileOptions方法,接受CompileOptions类型闭包作为参数。CompileOptions提供3个属性分别为:encoding、sourceCompatibility/targetCompatibility,来配置Java编译选项;
- adb操作选项配置:
Android Gradle预留了对adb的一些选项的控制配置,即时adbOptions{};
- DEX选项配置:
Android Gradle预留dexOptions{}进行dex选项配置。
- 突破65535方法闲置:
启用Multidex,提供MultidexApplication等方式;
- 自动清理未使用的资源:
使用Android Lint,会检测出哪些资源没有被使用,然后按照检测出来的列表清理即可。
7、Android Gradle多项目构建:
Android的项目一般分为库项目、应用项目、测试项目,Android Gradle根据这些项目分别对应有3种插件:com.android.library/com.android.application/com.android.test。
可根据业务,把工程分成一个个库项目,然后一个主的应用项目引用组合起来就成为了一个最终的产品。
8、Android Gradle多渠道构建:
Android Gradle提供了ProductFlavors方法来添加不同的渠道。
Flurry多渠道和友盟多渠道构建,
9、Android Gradle测试:
10、Android Gradle NDK支持:
更多相关文章
- Android(安卓)位图(二) Bitmap
- Android入门教程(五)之------第一个Android工程HelloAndroid
- Android(安卓)自动编译、打包生成apk文件 2 - 使用原生Ant方式
- Android入门教程(三)之------导入现有Android工程
- 【译】Google官方推出的Android架构组件系列文章(二)将Architectur
- android SDK应用
- Android创建和使用数据库详…
- android之命令行创建AVD
- 【Android(安卓)内存优化】Bitmap 长图加载 ( BitmapRegionDecod