美文网首页Android进阶之路
自定义Android Studio插件 Gradle+360加固

自定义Android Studio插件 Gradle+360加固

作者: zhangchunlin | 来源:发表于2019-06-04 08:58 被阅读8次

    现在安卓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<Project> {
        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 <username>           首次使用必须先登录 <360用户名>
            <password>              <登录密码>
        -importsign <keystore_path>         导入签名信息 <密钥路径>
            <keystore_password>             <密钥密码>
            <alias>                 <别名>
            <alias_password>            <别名密码>
        -importmulpkg <mulpkg_filepath>     导入多渠道配置信息,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 <inputAPKpath>           加固命令 <APK路径>
            <outputPath>                <输出路径>
            [-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加固

        本文链接:https://www.haomeiwen.com/subject/kjwtxctx.html