一、什么是插件
插件是一种遵循一定规范的应用程序接口编写出来的程序。
1.apply plugin:'com.android.application'
打包成apk
2.apply plugin:'com.android.library'
打包成aar
二、apk的打包流程
-
通过aapt工具,把资源文件生成一个R.java和resources.arsc。
-
通过aidl工具,把.aidl文件生成java文件
-
把上面两个java文件和java源文件通过javac工具生成.class文件
-
通过dx工具,把这些.class文件打包成.dex文件。
-
apkbuilder工具把dex文件和资源文件打包成.apk文件。
-
再进行签名和对齐。
插件就是把这些工具通过代码的方式形成一个流程程序。能完成这个最后生成apk的任务程序。
三、插件的开发方式
四、独立项目开发插件
-
需要创建java的module
-
把build.grdle里的 java-library 改成 groovy
-
引入gradle的api
dependencies {
implementation gradleApi()
}
- 为了获取project里的各种参数,引入gradle库
dependencies {
implementation gradleApi()
implementation "com.android.tools.build:gradle:4.1.0"
}
- 创建plugin类
plugin 就是插件,插件是通过一个个任务创建出来的。
project里的代码可以复制到gradle里去执行一下看看apk能不能打印出来。
注意一点导入的包要注意,否则会导致报错
import org.gradle.api.Plugin
import org.gradle.api.Project
import com.android.build.gradle.AppExtension
import com.android.build.gradle.api.ApplicationVariant
import com.android.build.gradle.api.BaseVariantOutput
import com.android.builder.model.SigningConfig
class MyPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
Jiagu jiagu = project.extensions.create("jiagu",Jiagu);
project.afterEvaluate {
AppExtension appExtension = project.extensions.android
//获取到对应变体的签名配置
appExtension.applicationVariants.all{
ApplicationVariant variant->
SigningConfig signingConfig = variant.signingConfig
variant.outputs.all{
BaseVariantOutput output->
File apk = output.outputFile
//到这里可以复制到app的gradle里去验证代码是否正确。输出一下apk
//为了更好的找到这任务在哪里。并且,可以手动点击去加固,于是根据应用变体去创建task任务。
JiaGuTask jiaguTask = project.tasks.create("jiagu${variant.baseName.capitalize()}", JiaGuTask)
//加固类的信息,账户,密码,加固jar包的位置
jiaguTask.jiagu = jiagu
//签名配置时候存在。
jiaguTask.signingConfig = signingConfig
//为了获取apk的路径和加固后的文件保存路径
jiaguTask.apk = apk
}
}
}
}
}
- 创建Task
Task的成员变量通过Plugin传入
执行java包进行加固的操作。
import com.android.builder.model.SigningConfig
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction;
class JiaGuTask extends DefaultTask {
//参数通过plugin传进来。
Jiagu jiagu
SigningConfig signingConfig
File apk
//通过注解,知道任务从这里执行的。
@TaskAction
def run(){
//按顺序调用命令行
//执行jiagu.jar并登陆添加账户密码
project.exec {
// java -jar jiagu.jar -login user password
it.commandLine("java", "-jar", jiagu.jiaguTools, "-login", jiagu.userName, jiagu.password)
}
//签名
if (signingConfig) {
project.exec {
// java -jar jiagu.jar -importsign xxxx
it.commandLine("java", "-jar", jiagu.jiaguTools, "-importsign", signingConfig.storeFile.absolutePath,
signingConfig.storePassword, signingConfig.keyAlias, signingConfig.keyPassword)
}
}
//执行加固并输出
project.exec {
// java -jar jiagu.jar -jiagu xxxx
it.commandLine("java", "-jar", jiagu.jiaguTools, "-jiagu", apk.absolutePath,
apk.parent, "-autosign")
}
}
}
- jiagu类
class Jiagu {
String userName
String userPwd
String jiaguTools
}
- 在src/main目录下创建resources/META-INF/gradle-plugins 的目录
在gradle里应用插件是根据这里配置文件的名字去找的com.lzl.jiagu
# 配置plugin的包名
implementation-class=com.lzl.groovylib.MyPlugin
- 配置本地仓库
插件的build.gradle里配置。
//gradle内置的仓库,下面的代码同步后会出现task
//然后执行publishing下的publishToMavenLocal,会上传到本地仓库
apply plugin: 'maven-publish'
publishing{
publications{
//Jiagu自己取的名字
Jiagu(MavenPublication){
from components.java//把源码生成的jar上传
//下面决定引入项目依赖的时候要怎么写groupId:artifactId:version
groupId 'com.lzl'
artifactId "jiagu"
version "1.0"
}
}
}
同步后会出现下面的task.下面的task任务会把插件的jar上传到本地库: C:\Users\Administrator.m2\repository\com\lzl\jiagu\1.0
- 使用插件
整个程序的build.gradle里添加
buildscript {
repositories {
//本地maven仓库
mavenLocal()
}
dependencies {
从maven中要下载的库和版本。跟9里的配置密切相关
classpath "com.lzl:jiagu:1.0"
}
}
在应用的build.gradle里添加
//插件应用
apply plugin:'com.lzl.jiagu'
//加固类的参数
jiagu{
//账号
userName '360U3190525523'
//密码
userPwd 'q8851551'
//jiagu.jar的路径
jiaguTools 'D:\享学课堂\第三期资料\jetpack\gradle的课程ams\06 Gradle自定义插件开发\新建文件夹\加固插件 资料&代码\Jiagu\jiagu.jar'
}
添加对应的release的签名文件,生成相应的debug和release包。
然后再点击加固task进行加固。