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

   日期:2020-08-23     浏览:103    评论:0    
核心提示:大家一听到反编译、逆向工程就觉得不像是好人干的事情,但实际情况并不是这样,做过手机游戏开发的小伙伴应该都知道,一个游戏包从开发测试包到最终在游戏商店上架,中间会经过,代码混淆,增加渠道资源,包体加固,这些工作都需要使用反编译和再次打包的环节。安卓反编译用到的主要工具就是ApkTool了,最常用的命令如:反编译apk包apktool d app.apk在实际使用过程中,有时可能反编译可能会失败,大多数原因是使用的apktool版本与打包生成apk的安卓版本不匹配,特别是使用最新的安卓SDK版本,这时候

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

apktool d app.apk 

打包成apk文件

apktool b app

但在实际使用过程中,有时可能反编译会失败,大多数原因是使用的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官网。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服