用Javassist合并修改jar包


// 以下使用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)

评论

暂无

添加新评论