// 以下使用kotlin代码
// 省略 xx 行代码
private const val INPUT_FILE = "aaa.jar"
private const val JOIN_JAR_FILE = "bbb.jar"
val inputFile = File("$WORK_DIR/_inputs")
val tempDir = File("$WORK_DIR/_temp")
val outputDir = File("$WORK_DIR/_outputs")
val jarFile = File(inputFile, "classes.jar")
StrongFileUtil.deleteDir(tempDir)
tempDir.mkdirs()
if(!outputDir.exists()){
outputDir.mkdirs()
}
// 解压jar包,class文件到临时目录
Decompression.uncompress(jarFile.absolutePath, tempDir.absolutePath)
val pool: ClassPool = ClassPool.getDefault()
pool.insertClassPath("${inputFile.path}/$INPUT_FILE") // 加载原包A
pool.insertClassPath("${inputFile.path}/$JOIN_JAR_FILE") // 加入要合并的jar包B
val ctClazz: CtClass = pool.get("com.aa.aa.aaa.Main") //加载指定的类
val params: Array<CtClass> = arrayOf(pool.get("android.app.Application")) //基本类型和引用类型的描述方式是不一样的
val method: CtMethod = ctClazz.getDeclaredMethod("init", params) //取得需要修改的方法
if(method.isEmpty) {
method.insertBefore("""android.util.Log.d("Hcb", "init");""") //修改方法
method.insertBefore("""com.bb.bb.bbb.Main.init($1, "$PARAMS_1", "$PARAMS_2");""") //修改方法
}else{
error("method ${method.longName} has a body !!!")
}
ctClazz.writeFile(tempDir.path) //保存到指定位置,执行完这一步后就会在指定目录生成你需要的 class 文件
//压缩 从临时目录打包jar
val outJarFile = File( outputDir, jarFile.name.replace(".jar".toRegex(), "") + "_" + SimpleDateFormat("yyyyMMdd-HHmmss", Locale.getDefault()).format(Date()) + ".jar")
Compressor.compress(outJarFile.absolutePath, tempDir.absolutePath)
// 删除临时目录
StrongFileUtil.deleteDir(tempDir)
评论