自定義Android Studio插件 Gradle+360加固 實現(xiàn)一鍵加固打包

現(xiàn)在安卓APP為了代碼安全,都要求在發(fā)布前先加固,可以自己寫加固程序加固,我選擇用第三方加固軟件:360加固保加固(其他加固軟件也一樣),具體實現(xiàn)如下:

準備工作

  • 注冊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之后再執(zhí)行自定義task
                }
            } else {
                if (theTask.name == 'assembleRelease') {
                    println("無資源混淆")
                    theTask.dependsOn(jiaGuTask) // 編譯完apk之后再執(zhí)行自定義task
                }
            }
        }
    }
}
  • 寫一個執(zhí)行命令的方法:
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;
    }
  • 核心執(zhí)行方法:
    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>         導(dǎo)入簽名信息 <密鑰路徑>
        <keystore_password>             <密鑰密碼>
        <alias>                 <別名>
        <alias_password>            <別名密碼>
    -importmulpkg <mulpkg_filepath>     導(dǎo)入多渠道配置信息,txt格式
    -showsign               查看已配置的簽名信息
    -showmulpkg             查看已配置的多渠道信息
    -help                   顯示幫助信息
    -config                 配置加固可選項
    ----------------------可選增強服務(wù)-------------------------------
        [-crashlog]             【崩潰日志分析】
        [-x86]                  【x86支持】
        [-analyse]              【加固數(shù)據(jù)分析】
        [-nocert]               【跳過簽名校驗】
    ----------------------高級加固選項-------------------------------
        [-vmp]                  【全VMP保護】
        [-data]                 【本地數(shù)據(jù)文件保護】
        [-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'
//注意一定要最后才應(yīng)用插件
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

    可以看看執(zhí)行插件任務(wù)時的輸出:


    輸出.png

結(jié)束語

我們的APP并不能保證絕對的安全,只能增加破解者破解者的難度,我之所以要使用gradle插件的方式使用360加固,就是圖形化界面操作太繁瑣了。今天就到這里,有空的話可以看看我的其他文章:http://www.itdecent.cn/nb/29042491

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容