Android 应用构建"/>
Android 应用构建
Gradle
1.定义:
2.应用开发流程
3.APK构建流程
Gradle执行
gradlew + 任务名称+选项
Groovy
基本语法
//单行注释
/*多行注释*/
//基本数据类型 byte,short,int ,long ,float,double,char//变量声明
int a =10
def b =10
print("a=$a \n")//字符串声明
String str = "hello,world"
String str2 = str.toUpperCase()
print("$str2 \n")//集合
def array = [1,2,3,4]
array.add(5)
array.each {print("$it")
}
print("${array} \n")//映射表
def map = ["name":"ls","age":"100"]
print("${map} \n")//循环
for (int i = 0; i < 10; i++) {println($i)
}//方法
def hello(int arg) {}hello(1)
进阶语法
DSL(Domain Specific Language)
领域专用语言
闭包
//闭包
def c= {println("hello def c")
}
c()def c1= { it->println("hello $it")
}
c1("hahah")def c2 = {//只有一个参数时可以省略println("hello $it")
}
c2("hah")def c3 = { arg1,arg2->println("hello $arg1,$arg2")
}
c3("hah,la")
** DSL**
//自定义DSL
class DefaultConfig {private String versionName;def versionName(String versionName) {this.versionName = versionName}@OverrideString toString() {return "DefaultCofig {versionName = $versionName}"}
}class Android {private int compileSdkVersionprivate DefaultConfig defaultConfigAndroid() {this.defaultConfig = new DefaultConfig()}def compileSdkVersion(int compileSdkVersion) {thispileSdkVersion = compileSdkVersion}def defaultConfig(Closure closure) {//闭包与具体对象关联closure.setDelegate(defaultConfig)closure.call()}
}def mAndroid = {compileSdkVersion 27defaultConfig {versionName "1.0"}
}Android android = new Android()
mAndroid.delegate=android
mAndroid.call()
println("mAndroid = $android")
构建
声明周期
- 初始化
- 配置阶段(执行各个目录的build.gradlew脚本)
- 执行阶段 (配置阶段的任务执行)
在setting.gradle中设置监听回调:
def lifeTag ="Life Log----:"
gradle.addBuildListener(new BuildAdapter(){@Overridevoid settingsEvaluated(Settings settings) {super.settingsEvaluated(settings)println("$lifeTag 初始化阶段完成")}@Overridevoid projectsEvaluated(Gradle gradle) {super.projectsEvaluated(gradle)println("$lifeTag 配置化阶段完成")}@Overridevoid buildFinished(BuildResult result) {super.buildFinished(result)println("$lifeTag 构建结束")}
})
在app目录下的build.gradle中添加测试任务
task testTask(){doLast {println("[life Log----:] 任务代码")}
}
执行 _**gradlew :app:testTask -q **_命令:
Gradle插件
- 提供具体的构建功能 Task
- 提高代码的复用性
分类
- 二进制插件
- 脚本插件
尝试开发一个插件
1.建立buildSrc子工程
在新建的项目中添加buildSrc目录,并创建一个build.gradle文件
build.gradle 配置:
//引用groovy 插件,编译插件工程中的代码
apply plugin: 'groovy'repositories{jcenter()
}dependencies {implementation gradleApi()implementation localGroovy()}
2.创建插件的运行入口
创建src目录,新建RouterPlugin.groovy文件
创建RouterPlugin:
package com.plugin.gradleimport org.gradle.api.Pluginimport org.gradle.api.Projectclass RouterPlugin implements Plugin<Project> {//注入插件的逻辑@Overridevoid apply(Project project) {println("RouterPlugin , apply from")}
}
3.创建properties文件供外部使用、
创建resources\META-INF\gradle-pluginsm目录,
新建com.plugin.router.properties文件
implementation-class = com.plugin.gradle.RouterPlugin
4.在主项目模块中使用插件
app目录下的build.gradle中:
执行gradlew clean -q
可以看到插件的apply中的日志已经输出了,这里的app就是project的名称。
5.参数配置
比如现在要配置一个动态的保存路径的参数,供外部定义
1.定义extension,新建文件
package com.plugin.gradleclass RouterExtension{String saveDir
}
2.注册Extension到插件
在apply中添加
class RouterPlugin implements Plugin<Project> {//注入插件的逻辑@Overridevoid apply(Project project) {println("RouterPlugin , apply from ${project.name}")//注册参数project.getExtensions().create("router",RouterExtension)}
}
3.外部配置参数
在App目录下的build.gradle中添加:
router {saveDir getRootDir().absolutePath
}
4.获取配置的extension
在构建的配置阶段完成后即可获取配置参数了:
class RouterPlugin implements Plugin<Project> {//注入插件的逻辑@Overridevoid apply(Project project) {println("RouterPlugin , apply from ${project.name}")project.getExtensions().create("router",RouterExtension)//配置阶段结束了 就可以获取配置的参数project.afterEvaluate {RouterExtension extension = project["router"]println("外部配置路径为:${extension.saveDir}")}}
}
再执行 gradlew clean -q命令,可以看到控制台的打印日志:
6.发布与使用
发布
在插件目录的build.gradle文件中添加:
apply plugin: 'maven'// 配置maven插件中的uploadArchives任务
uploadArchives {repositories {mavenDeployer {// 设置发布路径为 工程根目录下面的 repo 文件夹//这里可以配置远程仓库repository(url: uri('../repo')) {// 设置groupId,通常为包名pom.groupId = 'com.plugin.router'// 设置artifactId,为当前插件的名称pom.artifactId = 'router-gradle-plugin'// 设置 插件的版本号pom.version = '1.0.0'}}}
}//也可以配置远程仓库
repository(url: '私服仓库地址') {authentication(userName: '账号', password: '密码')
}
snapshotRepository(url: '私服快照地址') {authentication(userName: '账号', password: '密码')
}
执行命令,将buildSrc目录拷贝到新的router-gradle-plugin目录下才可以发布,buildSrc是一个预保留的项目名所以构建不了。
在根项目的build.gradle中添加:
include ':app',':router-gradle-plugin'
同步项目成功后,执行 gradlew :router-gradle-plugin:uploadArchives
可以看到在项目根目录中新生成的repo目录:
将版本插件改为1.0.1,通过idea的gradle面板点击uploadArchive即可发布插件了
可以看到成功之后的目录:
这个就是生成的二进制jar包
在别的项目中如何使用呢?
1.在新建的项目根目录的build.gradle文件中添加仓库地址
repositories {//maven仓库地址路径,相对绝对路径都可以maven {url uri("E:\\Demo\\PluginTest\\repo")}google()jcenter()}allprojects {repositories {//maven仓库地址路径,相对绝对路径都可以maven {url uri("E:\\Demo\\PluginTest\\repo")}google()jcenter()}
}
2.在dependencies中声明依赖的插件:
dependencies {classpath 'com.android.tools.build:gradle:4.1.3'classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files/*** 声明依赖插件* groupId :artifactId :version*/classpath 'com.plugin.router:router-gradle-plugin:1.0.1'}
3.在app目录下的build.gradle中使用插件并配置extension字段传递参数:
plugins {id 'com.android.application'id 'kotlin-android'id 'kotlin-android-extensions'id 'com.plugin.router'
}router {saveDir getRootDir().absolutePath
}
4.同步项目成功之后,执行 gradlew clean -q 命令
可以看到插件中的日志输出了。
至此,一个简单的插件就开发完成,通常使用的插件内部会有很多额外的功能逻辑。
更多推荐
Android 应用构建
发布评论