android 自定义gradle,Android自定义Gradle插件

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

最近各种热修复框架开源,其中使用instant run方式的框架是目前兼容性最好的,典型的有蘑菇街的Aceso和美团的Robust。两者都是使用ASM在编译的时候进行方法级别的修改来达到在运行时热修复。具体原理不详谈,本篇文章主要讲述使用插件在编译时候进行处理。

基础流程:Gradle会将Java代码打包成class,我们可以在打包成class之后插入我们的插件,在插件中使用asm来进行对字节码的操作。

插件的插入方式使用的是Gradle 1.5之后的特性Transform API。

编写一个简单可用的Gradle插件

首先创建一个Java Library,取名为libplugin

按照以下方式创建项目

2c0b9f69aa08c95068b3473dfceb7a2d.png

此处有坑:注意下面的META-INF和gradle-plugins是父子目录关系,不是一个目录名称,AS可能会给你优化到一个文件夹,导致你插件无法apply,请分开成父子目录写。

首先在src目录下创建groovy和resources目录。groovy包用来存储gradle代码,gradle是用groovy来实现的

resources目录存放的是gradle插件的名称,在外界apply需要根据你定义的这个文件名来进行apply,这里我命名为com.smallsoho.plugin.properties,那么在外界使用就需要apply plugin:’com.smallsoho.plugin’

com.smallsoho.plugin.properties文件内容如下:

implementation-class=com.smallsoho.plugin.PluginMain

此处存放指定插件的实现是哪个类,这个类在我上面写groovy的com.smallsoho.plugin包下

其次解释groovy包下的代码

com.smallsoho.plugin是包名,具体什么可以自定义,下面是两个类,一个是PluginExt类,是一个Model,里面的代码

package com.smallsoho.plugin

class PluginExt {

String name;

}

我们平时在其他的gradle插件中总会定义一些东西,这里我们可以定义一个model来做一会往插件传参数的model

然后是插件的代码package com.smallsoho.plugin

import org.gradle.api.Plugin

import org.gradle.api.Project

class PluginMain implements Plugin {

@Override

void apply(Project project) {

println 'hello, world!'

}

}

这里我们写的是创建一个Plugin插件的标准方式,我们只要实现apply方法。方法传入的是我们的项目,也就是我们在其他模块下写apply的那个project,project中存储着这个我们传进来的项目的各种参数。此处我们不使用任何东西,仅仅打印一句Hello Plugin。

修改插件的build.gradle

apply plugin: 'groovy'

apply plugin: 'maven'

buildscript {

repositories {

jcenter()

}

dependencies {

classpath 'com.android.tools.build:gradle:2.3.0'

}

}

dependencies {

compile gradleApi()//gradle sdk

compile localGroovy()//groovy sdk

}

uploadArchives {

repositories {

mavenDeployer {

repository(url: uri("$rootDir/maven"))

pom.groupId = 'com.smallsoho.plugin'

pom.artifactId = 'soloplugin'

pom.version = '1.0.0'

}

}

}

compileGroovy {

sourceCompatibility = 1.7

targetCompatibility = 1.7

options.encoding = "UTF-8"

}

此处我们在项目的根目录下先手动创建一个目录名称为maven,我们知道gradle的包管理都是存储在maven仓库中的,我们这里定义一个本地的maven仓库,首先我们打包到本地的maven仓库,然后在主项目中依赖我们打包好的包。

代码开始我们apply了一个groovy语言插件,和一个maven插件。然后我们需要依赖两个编译,用于我们写groovy插件,其次我们在下面写了uploadArchives,用于上传我们本次写的插件到maven文件夹下。

把我们的插件发送到本地仓库

点击下列按钮就能将我们的插件打包上传到本地maven,成功之后会在刚才创建的maven目录下面生成对应的jar

5e7af6a8a04483d7edf7f58c6f4793e2.png

应用我们的插件

在根目录的build.gradle下配置

import com.smallsoho.plugin.PluginMain

buildscript {

repositories {

jcenter()

maven {

url uri("$rootDir/maven")

}

}

dependencies {

classpath 'com.android.tools.build:gradle:2.3.0'

classpath 'com.smallsoho.plugin:soloplugin:1.0.0'

// NOTE: Do not place your application dependencies here; they belong

// in the individual module build.gradle files

}

}

//其他省略

apply plugin: 'com.smallsoho.plugin'

此处有可能你会弹出一个error

Error:(2, 0) Plugin with id 'com.smallsoho.plugin' not found.

检查上面的META-INF和gradle-plugins是不是父子文件夹,as可能会给你优化成一个目录。

验证一下

构建一下项目,你会发现

97bdeb2a0ee737b166630dbfe3e1c384.png

成功打印出来了我们的项目

在build.gradle中使用自定义参数

在引入插件的Gradle文件中定义

pluginext {

name 'smallsohosolo'

}

修改PluginMain类为

public class PluginMain implements Plugin {

@Override

void apply(Project project) {

//将pluginext和PluginExt连接起来

project.extensions.create('pluginext', PluginExt)

//创建一个任务

project.task('hello') {

doLast {

println project.pluginext.name + ' 你好'

}

}

}

}

在Gradle中执行

./gradlew hello

成功输出了我们在Gradle中定义的变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 开发中,Gradle 是一个非常重要的构建工具,可以用来构建和打包 Android 应用程序。Gradle 插件一种工具,可以扩展 Gradle 的功能,使其能够支持更多的功能。而多渠道打包是 Android 应用程序开发中非常重要的一个方面,它可以让我们将应用程序打包成不同的版本,并发布到不同的应用商店或市场上。 在 Android Studio 中,我们可以通过自定义 Gradle 插件实现多渠道打包,具体步骤如下: 1. 创建 Gradle 插件项目 在 Android Studio 中创建一个新项目,选择 Gradle 插件项目模板。这将创建一个 Gradle 插件项目,并生成一些默认的代码和文件。 2. 实现多渠道打包 在插件项目中,我们需要实现多渠道打包的功能。这可以通过 Gradle 的 productFlavors 和 buildTypes 配置来实现。我们可以定义多个 productFlavors,并为每个 productFlavor 配置不同的参数,例如应用程序的包名、应用程序名称等。在 buildTypes 中,我们可以为每个 buildType 配置不同的参数,例如应用程序的版本号、是否开启混淆等。 3. 打包应用程序 在插件项目中,我们可以编写一个 Gradle 任务来实现应用程序的打包。这个任务可以使用 Gradle 提供的 assemble 任务来实现。我们可以为每个 productFlavor 和 buildType 配置不同的打包参数,并使用 Gradle 的 assemble 任务来生成应用程序的 APK 文件。 4. 发布应用程序 在插件项目中,我们可以编写一个 Gradle 任务来实现应用程序的发布。这个任务可以使用 Gradle 提供的 uploadArchives 任务来实现。我们可以为每个 productFlavor 和 buildType 配置不同的发布参数,并使用 Gradle 的 uploadArchives 任务将应用程序发布到不同的应用商店或市场上。 总的来说,自定义 Gradle 插件多渠道打包是 Android 应用程序开发中非常重要的一个方面。通过自定义 Gradle 插件,我们可以实现更加灵活和高效的应用程序打包和发布。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值