現(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


