Android 应用构建

编程入门 行业动态 更新时间:2024-10-27 20:35:09

<a href=https://www.elefans.com/category/jswz/34/1771384.html style=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 应用构建

本文发布于:2024-02-10 16:20:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1676199.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!