Java原生调用apktool反编译及再次打包源码(转载)

大家一听到反编译、逆向工程就觉得好像离自己很远,都是些黑客才干的事儿,但实际情况并不是这样,做过手机游戏开发的小伙伴应该都知道,一个游戏包从开发测试到最终在游戏商店上架,中间会经过,代码混淆,增加渠道资源,包体加固等等,这些工作都需要使用反编译和再次打包的技术。
安卓反编译用到的主要工具就是ApkTool了,最常用的命令如:
反编译apk包

apktool d app.apk
1
打包成apk文件

apktool b app
1
但在实际使用过程中,有时可能反编译会失败,大多数原因是使用的apktool版本与生成apk的安卓版本不匹配,特别是使用最新的安卓SDK版本,这时候我们可以下载最新的apktool,如果还是解决不了问题,那就只能等apktool官方升级了。但是! 如果我们使用Java调用apktool,如果apktool还没有兼容最新版本的安卓SDK,那我们就可以自己来升级啦。
Java调用apktool反编译方法:

import brut.androlib.Androlib;
import brut.androlib.ApkDecoder;

public void decompile() {
ApkDecoder decoder = new ApkDecoder();
decoder.setApkFile(apkFile);
decoder.setForceDelete(true);
decoder.setDecodeSources((short) 16);
decoder.setOutDir(outputDir);
decoder.decode();
}

读取AndroidManifest.xml清单文件:

import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

public static Document readAndroidManifest(){
File manifestFile = new File(apkFile.getDecompiledDirectory(), “AndroidManifest.xml”);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(manifestFile);
doc.getDocumentElement().normalize();
return doc;
}

修改APK包名

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public static void renamePackage(Document manifestDoc, String newPackage){
Element element = getElementByTag(manifestDoc,newPackage);
element.setAttribute(“package”,newPackage);
}

public static Element getElementByTag(Document document, String tag) {
NodeList elementList = document.getElementsByTagName(tag);
if (elementList.getLength() != 1)
return null;
Node nNode = elementList.item(0);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
return (Element) nNode;
}
return null;
}

经过了一顿操作,往包里加入了我们自己的料,最终再次打包生成apk。
重新生成apk文件

import brut.androlib.Androlib;
import brut.androlib.ApkOptions;

public void builder() {
ApkOptions apkOptions = new ApkOptions();
new Androlib(apkOptions).build(apkFile.getDecompiledDirectory(), outFile);
}

以上是反编译及二次打包常用方法介绍,获取更多资料及下载全部代码,请访问AnyPacker官网。

原文链接:https://blog.csdn.net/qq_24465933/article/details/108141915?utm_medium=distribute.pc_feed.none-task-blog-personrec_tag-8.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-personrec_tag-8.nonecase&request_id=5f44272e0388ae0b5643d569

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值