需求是这样的
开发者接入sdk,接入成功之后提供apk,拆包对里面的sdk内容进行更替,得以实现不同渠道接入不同的SDK
实现步骤拆解如下:
- apk接入jar包
- 将其他渠道的jar包通过dx.jar 转化成 dex
- 将dex通过baksmali转化成smali
- 拆包将相关jar包的smali替换成目标渠道的samli
- 打包,签名即可
1. apk接入jar包 + 修改jar包
pass
2. 将jar包转化成dex
dx --dex --output=myjar_dex\classes.dex myjar
options:
--output=<这里是打出来的dex所在的目录\dex文件名>
myjar : 是jar包所在目录
执行成功之后就会在myjar_dex文件夹下打出一个classes.dex文件。
3. 将jar包转成的dex转化成smali
java -jar baksmali.jar -o baksmaliout classes.dex
options:
java -jar baksmali.jar : 执行baksmali.jar 这个jar文件
-o baksmaliout : 输出的文件夹
classes.dex : 是即将转化的dex文件
执行成功之后会在当前文件夹下生成一个baksmaliout文件夹,在该文件夹下生成了smali
4. 通过apktool对apk进行拆包,并删除对应的smali
apktool d replacejar.apk
对apk进行拆包,在replacejar文件夹下会解析出该apk所有的smali文件,进行替换即可
5. 替换成功,使用apktool进行打包
apktool b replacejar
再进行签名,install即可
附加内容:使用命令打jar包
-
将java文件编译成.class文件
把某个目录下的java文件编译成.class文件命令如下:
javac com\thc\pack\*.java -d bin
options:
com...*.java : 是java文件所在目录
-d : 生成的class文件地址
生成class之后就可以通过java命令执行java文件中的代码,这里需要注意如下:
如下Utils类:
package com.thc.myjar.utils; public class Utils { public static void main(String[] args) { System.out.print("jar success"); } public static int cacu(int a, int b) { return CacuUtil.cacu_add(a, b); } public static String str(String msg) { return StrUtils.doString(msg); } }
如果想通过java命令来运行改文件需要在与包名同级的目录下执行cmd命令,如下:
E:\WorkSpace\TestPack\myjar\src\main\java\mybin>java com.thc.myjar.utils.Utils
Utils的class文件在mybin\com\thc\myjar\utils目录下,我们在mybin目录下打开cmd命令,执行上述命令即可
除了上面一种方式,还有另外一种方式如下,不要给java文件加包名:
public class Utils {
public static void main(String[] args) {
System.out.print("jar success");
}
public static int cacu(int a, int b) {
return CacuUtil.cacu_add(a, b);
}
public static String str(String msg) {
return StrUtils.doString(msg);
}
}
这样,我们就可以在和class文件同级目录下执行javac命令
-
将生成的class文件打到jar包中去
在打jar包的时候需要注意和上面同样的问题,就是执行cmd命令所在的目录是和包名最外层目录同级的。在和com同级目录下执行如下命令:
jar -cvf my.jar com
options:
-cvf : c表示要创建一个新的jar包,v表示创建的过程中在控制台输出创建过程的一些信息,f表示给生成的jar包命名
my.jar : 打出来的包的命名
com : 是打包的目录
网友评论