android插件的介绍,以及独立项目开发插件(APK的加固插件)

559 阅读3分钟

一、什么是插件

插件是一种遵循一定规范的应用程序接口编写出来的程序。

1.apply plugin:'com.android.application'

打包成apk

2.apply plugin:'com.android.library'

打包成aar

二、apk的打包流程

  1. 通过aapt工具,把资源文件生成一个R.java和resources.arsc。

  2. 通过aidl工具,把.aidl文件生成java文件

  3. 把上面两个java文件和java源文件通过javac工具生成.class文件

  4. 通过dx工具,把这些.class文件打包成.dex文件。

  5. apkbuilder工具把dex文件和资源文件打包成.apk文件。

  6. 再进行签名和对齐。

插件就是把这些工具通过代码的方式形成一个流程程序。能完成这个最后生成apk的任务程序。

三、插件的开发方式

image.png

四、独立项目开发插件

  1. 需要创建java的module

  2. 把build.grdle里的 java-library 改成 groovy

  3. 引入gradle的api

dependencies {
    implementation gradleApi()
}
  1. 为了获取project里的各种参数,引入gradle库
dependencies {
    implementation gradleApi()
    implementation "com.android.tools.build:gradle:4.1.0"
}
  1. 创建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
                    }

            }


        }
    }
}
  1. 创建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")
        }

    }

}
  1. jiagu类
class Jiagu {
    String userName
    String userPwd
    String jiaguTools
}
  1. 在src/main目录下创建resources/META-INF/gradle-plugins 的目录

在gradle里应用插件是根据这里配置文件的名字去找的com.lzl.jiagu

image.png

# 配置plugin的包名
implementation-class=com.lzl.groovylib.MyPlugin
  1. 配置本地仓库

插件的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

image.png

  1. 使用插件

整个程序的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进行加固。

image.png