一: Android Studio Gradle 构建项目
在Android Studio 软件下 打开 Terminal终端 ,输入命令行 : tree,可以获取项目结构
项目结构的Gradle资源包含:
1,全局build.gradle : 控制每个module的编译过程
2,module的build.gradle
3,gradle.properties : 设置Gradle脚本中的参数
4,local.properties : Gradle的sdk相关环境变量配置
5,setting.gradle : 配置Gradle多项目管理
全局build.gradle :
最重要的是buildscript的部分代码
buildscript {
// 指定使用的远程仓库
repositories {
jcenter()
google()
}
// 指定依赖的Android Gradle 插件版本
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
}
}
module的build.gradle
// apply 领域
// 指定这个module是一个Android Application
apply plugin: 'com.android.application'
// android 领域
// 指定构建过程中所用到的所有参数
android{
}
// dependencies领域
// 指定构建过程种所依赖的所有库
dependencies{
}
local.properties
指定项目使用的sdk路径
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Fri Oct 12 14:07:25 GMT+08:00 2018
ndk.dir=D\:\\working\\Android\\sdk\\ndk-bundle
sdk.dir=D\:\\working\\Android\\sdk
二: Android Studio Gradle 构建项目 Task
在Android Studio 软件下 打开 Terminal终端 ,输入命令行 : gradle / gradlew task,可以获取项目所有task
在Android Studio 软件下 打开 Terminal终端 ,输入命令行 : gradle / gradlew task -all,可以获取项目所有task之间的调用关系
需要了解掌握的基本task
- assemble task : 用于项目组合输出,包含assembleDebug和assembleRelease
- Check : 用于执行检查任务
- Build : 组合命令,执行了check和assemble的所有工作
- Clean : 清理所有的中间编译结果
三: Android Studio Gradle 更改项目结构
在android领域中进行配置 :
// 自定义项目结构
sourceSets{
main{
java.srcDirs=['src']
res.srcDirs=['res']
assets.srcDirs=['assets']
jni.srcDirs=['jni']
jniLibs.srcDirs=['libs']
manifest.srcDirs=['AndroidManifest.xml']
// 也可以分类
res.srcDirs=[
'src/main/res/',
'src/main/res/layout/activity',
'src/main/res/layout/fragment'
]
}
}
四 : Android Studio Gradle 构建项目配置
全局配置参数 :
在全局build.gradle中指定全局参数
ext{
compileSdkVersion = 23
buildToolsVersion = '23.0.2'
minSdkVersion = 14
targerSdkVersion = 23
versionCode = 3
versionName = '1.0.1'
}
引用全局参数配置 :
android{
compileSdkVersion rootProject.ext.compileSdkVersion
}
app module -> build.gradle -> android{} -> defaultConfig{}
构建开发配置信息
defaultConfig {
applicationId "com.sheng.app"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
// 可以动态控制versionName
def getCustomVersionName(){
}
versionName getCustomVersionName()
app module -> build.gradle -> android{} -> buildTypes{}
构建生成的Apk具备的功能,Log日志…
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
在Android Studio 软件下 打开 Terminal终端 ,输入命令行 : gradle / gradlew build 可以在module的output/apk目录下生成apk文件
系统会默认生成3个apk文件,2个debug类型,1个release类型
自定义构建apk类型
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
cys {
// 为应用设置包名 : 默认包名 + .cys
applicationIdSuffix ".cys"
}
}
在Android Studio 软件下 打开 Terminal终端 ,输入命令行 : gradle / gradlew clean 和 gradle / gradlew build 可以在module的output/apk目录下生成apk文件
系统会生成4个apk文件,2个debug类型,1个release类型,1个cys类型
自定义构建apk类型的继承
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
// cys继承debug
cys.initWith(buildTypes.debug)
cys {
// 为应用设置包名 : 默认包名 + .cys
applicationIdSuffix ".cys"
}
}
构建类型的参数如下 :
Property name | Default values for debug | Default values for release / other |
---|---|---|
debuggable | true | false |
jniDebugBuild | false | false |
renderscriptDebugBuild | false | false |
rederscriptOptimLevel | 3 | 3 |
packageNameSuffix | null | null |
versionNameSuffix | null | null |
signingConfig | android.signingConfigs.debug | null |
zipAlign | false | true |
构建signingConfigs
为应用签名,默认只有debug有签名
生成签名 :
Android Studio -> Build -> Generate Signed APK -> 输入签名相关信息 -> 获取到.jks签名文件
配置签名 :
在module -> build.gradle -> android{}
signingConfig{
cys{
storeFile file("xxx.jks")
storePassword "123456"
keyAlias "cys"
keyPassword "123456"
}
}
android{} 下可选配置 :
// 指定Java的编译版本
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// 控制Lint的代码检查
lintOptions{
// Lint Check 发生Error的时候,是否继续编译
abortOnError false
}
Gradle 动态参数配置
比如签名文件配置在android{}下,代码写死,这很不友好,所以一般会通过.properties 配置动态参数
首先打开gradle.properties,添加配置
systemProp.keyAliasPassword=123456
systemProp.keyAlias=cys
systemProp.keyStorePassword=123456
systemProp.keyStore=xxx.jks
使用 :
signingConfigs{
cys{
storeFile fileSystem.properties['keyStore']();
storePassword System.properties['keyStorePassword']
keyAlias System.properties['keyAlias']
keyPassword System.properties['keyAliasPassword']
}
}
或者
直接使用Key / Value
首先打开gradle.properties,添加配置
cys.KeyAlias=cys
cys.KeyAliasPassword=123456
使用 :
signingConfigs{
cys{
storeFile fileSystem.properties['keyStore']();
storePassword System.properties['keyStorePassword']
keyAlias System.properties['cys.keyAlias']
keyPassword System.properties['cys.keyAliasPassword']
}
}
或者
直接使用属性方式
首先打开gradle.properties,添加配置
pKeyAlias=cys
pKeyAliasPassword=123456
使用 :
signingConfigs{
cys{
storeFile fileSystem.properties['keyStore']();
storePassword System.properties['keyStorePassword']
keyAlias pKeyAlias
keyPassword pKeyPassword
}
}
系统参数
Gradle内置了很多系统级别的参数,这些参数可以在使用中直接获取值
使用 :
task printProperties{
println project
println project.name
println project.buildDir
println project.buildFile
prinfln project.version
println name
println buildDir
println path
}
输出
一些Gradle内置的系统变量
多渠道打包 :
流程 :
1,创建渠道占位符
在AndroidManifest 文件中的Application节点下,创建meta-data节点
<meta-data
android:name="PRODUCT"
// ${CHANNEL_VALUE} 要进行的渠道占位符
android:value="${CHANNEL_VALUE}"/>
2, 配置Gradle脚本
app module -> build.gradle -> android{}
添加productFlavors,并增加定义的渠道名,使用manifestPlaceholders指定要替换的渠道占位符的值
productFlavors{
product1{
manifestPlaceholders=[CHANNEL_VALUE:"PRODUCT1"]
}
product2{
manifestPlaceholders=[CHANNEL_VALUE:"PRODUCT2"]
}
product3{
manifestPlaceholders=[CHANNEL_VALUE:"PRODUCT3"]
}
}
// 脚本优化
productFlavors.all{ flavor ->
flavor.manifestPlaceholders = [CHANNEL_VALUE:name]
}
3, 终端执行gradle / gradlew build命令可以在module的output/apk目录下生成apk文件
生成重命名包:
对生成的apk包名进行重命名
// 获取所有的apk包
applicationVariants.all{ vatiant ->
variant.outputs.each{ output ->
// 判断文件是否是apk,是否是release版本
if(output.outputFile != null &&
output.outputFile.name.endsWith('.apk') &&
'release'.equals(variant.buildType.name)){
// 重命名
def apkFile = new File(output.outputFile.getParent(),
"CYSApp_${variant.flavorName}_ver${variant.versionName}.apk")
output.outputFile = apkFile
}
}
}
不同版本添加不同代码
设置buildConfigField(类型,名称,值)
app module -> build.gradle -> android{} -> buildTypes{}
buildTypes{
release{
// 设置debug模式
buildConfigField "boolean" "testFlag" "true"
// 设置app名称 需要删除string.xml下的app名称
resValue("string", "app_name", "Release")
}
cys{
buildConfigField "boolean" "testFlag" "false"
resValue("string", "app_name", "CYS")
}
}
五 : Android Studio Gradle 多项目依赖
jar包依赖 :
module下都有lib文件夹,只需要把jar包放到lib文件夹下,右键选择"add as library" ,即可导入依赖
Android Studio 生成jar包
task makeJar(type : Jar){
// 清空已经存在的jar包
delete ‘lib/sdk.jar’
// 指定生成的jar包
baseName 'sdk'
// 从class文件生成jar包
from('build/intermediates/classes/debug/com/cys/')
// 打包进jar包后的文件目录结构
into('com/cys/')
// 去掉不需要打包的目录和文件
exclude('test/', 'BuildConfig.class', 'R.class')
// 去掉R文件
exclude { it.name.startsWith('R$'); }
}
so库依赖
需要在module/src/main 目录下创建一个jniLibs目录即可,开发者把对应的armeabi,armeabi-v7a等CPU文件拷贝过来,并添加相应的so文件
本地库项目依赖
创建module,在Android Studio -> Setting -> Project Structure 中,添加module依赖
远程仓库依赖
Gradle支持以aar的形式依赖远程服务器上的库项目
本地aar依赖
当开发者对一个module进行编译后,在它的module/build/outputs/aar/目录下,会生成相应的aar文件,使用的时候,直接在主项目中右键 new module -> import .aar packages即可
使用Gradle上传aar到Maven库
uploadArchives{
repositories{
mavenDeployer{
pom.groupId = GROUPID
pom.artifactId = ARTIFACTID
if(System.properties['isRelease'].toBoolean()){
pom.version = VERSION
repository(url : nexusRelease){
authentication(userName : nexusUsername, password : nexusPassword)
}
}else {
pom.version = "${ VERSION }-SNAPSHOT"
repository(url : nexusSnapshots){
authentication(userName : nexusUsername, password : nexusPassword)
}
}
pom.project{
description 'XXXXXX'
}
}
}
}
同时,还需要在gradle.properties文件中进行参数的配置
GROUP_ID = com.xxx.xxx
ARTIFACT_ID=aaaa
VERSION=1.x.x
RELEASE_REPOSITORY_URL=maven url
nexusUsername = username
nexusPassword=password
systemProp.isRelease=true
最后在终端执行 gradle / gradlew uploadArchives ,就可以完成依赖库的上传