现在安卓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
网友评论