一、Android 引用Gradle插件的形式
apply plugin: 'com.android.application'
apply plugin: 'r2generator-plugin'
在这里引入的插件,系统编译是会到dependencies 代码块中查找是否有对应的依赖,dependencies 中引入的依赖,系统又会去repositories 代码块中配置的仓库中寻找有没有对应的插件。有才会正常加载,编译。
buildscript {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
// maven { url uri('build/r2') }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.31"
classpath 'com.github.nichbar:r2generator:1.0.5'
}
}
二、简单开发一个插件
现在我们利用360提供的加固jar包来写一个apk加固的插件。
1.先去360网站下载一个工具包(https://jiagu.360.cn/#/global/download)
我们可以看看里面的文件,从《360加固助手使用手册.pdf》中我们可以看到用cmd命令可以加固apk,简单加固只需要三步
(1)使用以下命令登录
java\bin\java -jar jiagu.jar -login <user name> <password>
(2)签名apk
>java\bin\java -jar jiagu.jar -importsign <keystore_path> <keystore_password>
<alias> <alias_password>
(3)给apk加固
>java\bin\java -jar jiagu.jar -jiagu <inputAPKpath> <outputpath> -autosign -
automulpkg
现在整体思路就是,我们需要在Gradle中收集上面需要用到信息,比如用户名,密码,签名信息等。然后执行上面三个命令就好。
2.用Android studio 的工程中新建一个java library,命名随意,我这里就叫plugin
3.修改plugin中的build.gradle文件,如上图所示,将’java-library’改为‘groovy’,然后添加Gradle API的依赖,同步一下,可能下载Gradle 源码的包比较慢,耐心等一下。
4.新建一个File 命名随意,但后缀要是“groovy”,我这里命名JiaguPlugin.groovy
package com.example.reinforce
import com.android.build.api.variant.ApplicationVariant
import com.android.build.gradle.AppExtension
import com.android.build.gradle.api.BaseVariantOutput
import com.android.builder.model.SigningConfig
import org.gradle.api.Plugin
import org.gradle.api.Project
class JiaguPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
//这里需要创建扩展,可以在gradle中进行配置,类似Android application 的applicationId、targetSdkVersion
JiaguExtension reinforceExtension = project.extensions.create("jiaguExtension", JiaguExtension)
//回调, 在gradle配置完成之后回调,在解析完build.gradle之后回调
project.afterEvaluate {
AppExtension android = project.extensions.android
android.applicationVariants.all {
ApplicationVariant variant ->
//对应变体(debug/release)的签名配置
SigningConfig signingConfig = variant.signingConfig
variant.outputs.all {
BaseVariantOutput output->
//输出的apk文件
File apk = output.outputFile
//创建加固任务 jiag Debug
JiaguTask reinforceTask = project.tasks.create("jiagu${variant.baseName.capitalize()}", JiaguTask)
reinforceTask.extension = reinforceExtension
reinforceTask.signingConfig = signingConfig
reinforceTask.apk = apk
}
}
}
}
}
package com.example.reinforce
class JiaguExtension {
String userName;
String password;
String ReinforceToolsPath
String getUserName() {
return userName
}
void setUserName(String userName) {
this.userName = userName
}
String getPassword() {
return password
}
void setPassword(String password) {
this.password = password
}
String getReinforceToolsPath() {
return ReinforceToolsPath
}
void setReinforceToolsPath(String reinforceToolsPath) {
ReinforceToolsPath = reinforceToolsPath
}
}
JiaguExtension 类的作用是让用户自己在gradle.build中配置用户名和密码等信息。
package com.example.reinforce
import com.android.builder.model.SigningConfig
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
class JiaguTask extends DefaultTask{
JiaguExtension extension
SigningConfig signingConfig
File apk
JiaguTask() {
//这里可以给定义的Task分组
group = "reinforce"
}
@TaskAction
def execute(){
project.exec {
//加固apk先要登录
//执行cmd命令 java -jar jiagu.jar -login user password
//空格用逗号分开
it.commandLine("java","-jar",extension.ReinforceToolsPath,"-login".extension.userName,extension.password)
}
if(signingConfig){
project.exec {
//执行cmd命令 java -jar jiagu.jar -importsign xxxx
it.commandLine("java", "-jar", extension.ReinforceToolsPath, "-importsign", signingConfig.storeFile.absolutePath,
signingConfig.storePassword, signingConfig.keyAlias, signingConfig.keyPassword)
}
}
project.exec {
//执行cmd命令 java -jar jiagu.jar -jiagu xxxx
it.commandLine("java", "-jar", extension.ReinforceToolsPath, "-jiagu", apk.absolutePath,
apk.parent, "-autosign")
}
}
}
JiaguTask 类的作用是执行cmd的三个命令。
到这里插件的代码已经写得差不多了,接下来看看怎么引用这个插件。
插件在引用之前必须先上传到仓库中,本地仓库或者是服务器仓库都可以。
在plugin的build.gradle中添加如下代码
apply plugin:'maven-publish'
publishing{
publications{
Jiagu(MavenPublication){
from components.java //要把源码生成的jar包上传
groupId 'com.example.reinforce'
artifactId "plugin"
version "1.0"
}
}
}
同步一下,会在Android studio 的右边看到这个Task
双击里面的publishToMavenLocal,Gradle 会将这个插件上传到本地仓库,然后我们去电脑的.m2文件夹会看到我们上传的插件。
C:\Users\zzq20\.m2\repository\com\example\reinforce\plugin\1.0
到这里插件上传已经成功了,接下来我们看看怎么引用插件
在项目的根目录的build.gradle文件中假如如下代码
buildscript {
repositories {
google()
jcenter()
mavenLocal()//添加这行代码,上一步我们将插件上传到了本地的maven,多以这里我们需要配置本地的maven仓库
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.0"
classpath "com.example.reinforce:plugin:1.0"//添加这行代码。引入插件,这里的写法要跟上传时,写的groupId 、artifactId 、version 一一对应。
}
}
最后一步,对于使用者,我们要在使用module 的build.gradle中添加
apply plugin "com.example.reinforce"
jiaguExtension{
userName '你的360账号'
password '你的账号密码'
reinforceToolsPath 'D:\\download\\360jiagubao_windows_64\\jiagu\\jiagu.jar'
}
在这里,整个过程就完了。