自定义Android Studio插件 Gradle+360加固 实现一键加固打包

现在安卓APP为了代码安全,都要求在发布前先加固,可以自己写加固程序加固,我选择用第三方加固软件:360加固保加固(其他加固软件也一样),具体实现如下:

准备工作

  • 注册360账号(记住用户名和密码)
  • 下载360加固保程序(放到硬盘的某个位置)

开始撸码

  • 新建一个model(注意:名字必须为buildSrc),删除无用的代码。如下图。


    加固.png
  • build.gradle 如下:
apply plugin: 'groovy'
dependencies {
    compile gradleApi()
    compile localGroovy()
}
  • 为Grande写一个扩展:
class JiaGuPluginExtension {
    File jiaGuFile //指向加固的jar包
    String username //用户名
    String password //密码
    File storeFile; //签名文件
    String storePassword//签名密码
    String keyAlias//别名
    String keyPassword ///别名密码
    File channelFile //指向通道备注文件.txt
    File inputFile//输入apk
    File outputFile//输入apk
    String[] config;//扩展配置
    JiaGuPluginExtension(Project project) {
    }
}
  • 在编写一个插件:
class JiaGuPlugin implements Plugin {
    static final String GROUP = 'JiaGu'
    static final String EXTENSION_NAME = 'jiagu'
    @Override
    void apply(Project project) {
        println('JiaGuPlugin')
        project.extensions.create(EXTENSION_NAME, JiaGuPluginExtension, project)
        boolean isResguard = project.plugins.hasPlugin("AndResGuard")
        Task jiaGuTask = project.tasks.create(JiaGuTask.NAME, JiaGuTask)
        project.tasks.whenTaskAdded { Task theTask ->
            if (isResguard) {
                if (theTask.name == 'resguardRelease') {
                    println("有资源混淆")
                    theTask.dependsOn(jiaGuTask) // 编译完apk之后再执行自定义task
                }
            } else {
                if (theTask.name == 'assembleRelease') {
                    println("无资源混淆")
                    theTask.dependsOn(jiaGuTask) // 编译完apk之后再执行自定义task
                }
            }
        }
    }
}
  • 写一个执行命令的方法:
static String exec(String command) throws InterruptedException {
        String returnString = "";
        Process pro = null;
        Runtime runTime = Runtime.getRuntime();
        if (runTime == null) {
            System.err.println("Create runtime false!");
        }
        try {
            pro = runTime.exec(command);
            BufferedReader input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
            PrintWriter output = new PrintWriter(new OutputStreamWriter(pro.getOutputStream()));
            String line;
            while ((line = input.readLine()) != null) {
                returnString = returnString + line + "\n";
            }
            input.close();
            output.close();
            pro.destroy();
        } catch (IOException ex) {
            ex.printStackTrace()
        }
        return returnString;
    }
  • 核心执行方法:
    static final String NAME = "jiaGuRelease"
    JiaGuTask() {
        group = JiaGuPlugin.GROUP
        description = "use 360 jiagu"
    }
    @TaskAction
    def start() {
        def ext = project.extensions.findByName(JiaGuPlugin.EXTENSION_NAME) as JiaGuPluginExtension
        String rerult = exec("java -jar ${ext.jiaGuFile.getAbsolutePath()} -login ${ext.username} ${ext.password}")
        println("+++++" + rerult)
        if (rerult.concat("success")) {
            String extCmd = ""
            if (ext.storeFile != null && ext.storeFile.exists()){
                //要签名
                rerult = exec("java -jar ${ext.jiaGuFile.getAbsolutePath()} -importsign ${ext.storeFile.getAbsolutePath()} ${ext.storePassword}  ${ext.keyAlias}  ${ext.keyPassword}")
                println(rerult)
                extCmd += " -autosign "
            }
            if (ext.channelFile != null && ext.channelFile.exists()) {
                rerult = exec("java -jar ${ext.jiaGuFile.getAbsolutePath()} -importmulpkg ${ext.channelFile}")
                println(rerult)
                extCmd += " -automulpkg "
            }
            println("加固中........")
            if (ext.config != null && ext.config.size() > 0){
                rerult = exec("java -jar ${ext.jiaGuFile.getAbsolutePath()} -config ${ext.config}")
                println(rerult)
            }
            if (!ext.outputFile.exists()){
                ext.outputFile.mkdirs();
            }
            String cmd = "java -jar ${ext.jiaGuFile.getAbsolutePath()} -jiagu ${ext.inputFile.getAbsolutePath()} ${ext.outputFile.getAbsolutePath()}"
            rerult = exec(cmd + extCmd)
            println(rerult)
        }
    }
  • 具体的命令编写参考360加固文档:
    -login            首次使用必须先登录 <360用户名>
                      <登录密码>
    -importsign          导入签名信息 <密钥路径>
                     <密钥密码>
                         <别名>
                    <别名密码>
    -importmulpkg      导入多渠道配置信息,txt格式
    -showsign               查看已配置的签名信息
    -showmulpkg             查看已配置的多渠道信息
    -help                   显示帮助信息
    -config                 配置加固可选项
    ----------------------可选增强服务-------------------------------
        [-crashlog]             【崩溃日志分析】
        [-x86]                  【x86支持】
        [-analyse]              【加固数据分析】
        [-nocert]               【跳过签名校验】
    ----------------------高级加固选项-------------------------------
        [-vmp]                  【全VMP保护】
        [-data]                 【本地数据文件保护】
        [-assets]               【资源文件保护】
        [-filecheck]                【文件完整性校验】
        [-ptrace]               【Ptrace防注入】
        [-so]                   【SO文件保护】
        [-dex2c]                【dex2C保护】
        [-string_obfus]             【字符串加密】
        [-dex_shadow]               【DexShadow】
        [-so_private]               【SO防盗用】
    -----------------------------------------------------------------
    -config_so          配置需要加固的SO文件,以空格分隔
    -config_assets          配置需要忽略的资源文件,以空格分隔
    -config_so_private      配置防盗用的SO文件,以空格分隔
    
    -showconfig             显示已配置加固项
    -version                显示当前版本号
    -update                 升级到最新版本
    -jiagu            加固命令 
                        <输出路径>
        [-autosign]                 【自动签名】
        [-automulpkg]               【自动多渠道】
        [-pkgparam mulpkg_filepath]     【自定义文件生成多渠道】
  • 最后看如何使用:
apply from: "resource.gradle"
//apply from: 'tinker.gradle'
//注意一定要最后才应用插件
apply plugin: top.andnux.plugin.JiaGuPlugin
jiagu {
    jiaGuFile file("D:\\Android\\jiagu\\jiagu.jar")
    username "xxxx"
    password "xxxx"
    storeFile android.signingConfigs.release.storeFile
    storePassword android.signingConfigs.release.storePassword
    keyAlias android.signingConfigs.release.keyAlias
    keyPassword android.signingConfigs.release.keyPassword
    config '-so', '-data', '-assets', '-string_obfus', '-so_private'
    inputFile file("${buildDir.getAbsolutePath()}\\outputs\\apk\\release\\app-release.apk")
    outputFile file("${buildDir.getAbsolutePath()}\\jiagu") //这里指定的是输出文件夹
}
  • 看看我们自己编写分插件:


    插件.png

    可以看看执行插件任务时的输出:


    输出.png

结束语

我们的APP并不能保证绝对的安全,只能增加破解者破解者的难度,我之所以要使用gradle插件的方式使用360加固,就是图形化界面操作太繁琐了。今天就到这里,有空的话可以看看我的其他文章:https://www.jianshu.com/nb/29042491

你可能感兴趣的:(自定义Android Studio插件 Gradle+360加固 实现一键加固打包)