编译工程 : 编译工程时会生成 Android 依赖库的 aar 文件 , 生成目录是 module/build/outputs/aar/ 目录下
获取 multiple-dex-core-debug.aar 文件的另外一种方法 : 运行 Gradle 任务中的 Tasks/other/assembleDebug 任务 , 即可生成 multiple-dex-core-debug.aar 文件 ;
解压获取文件 ( 仅做参考 ) : 将
D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-core\build\outputs\aar
路径下的 multiple-dex-core-debug.aar 文件后缀修改为 .zip
解压上述文件 , 拿到 classes.jar 文件即可 ;
该 classes.jar 就是 multiple-dex-core 的 Android 依赖库中的 ProxyApplication.kt Kotlin 文件 编译出的 jar 包 ;
上述 解压文件仅做 参考 , 实际使用时 , 在程序中使用代码解压 ;
三、解压代理 Application 依赖库 aar 文件
获取 multiple-dex-core-debug.aar 文件对象
// 获取 multiple-dex-core-debug.aar 文件对象 var aarFile = File("multiple-dex-core/build/outputs/aar/multiple-dex-core-debug.aar")
解压上述 multiple-dex-core-debug.aar 文件到 aarUnzip 目录中 , 先创建解压目录 ;
// 解压上述 multiple-dex-core-debug.aar 文件到 aarUnzip 目录中 // 创建解压目录 var aarUnzip = File("multiple-dex-tools/aarUnzip")
正式解压 , unZipAar 方法在下面完整代码中 ;
// 解压操作 unZipAar(aarFile, aarUnzip)
拿到 multiple-dex-core-debug.aar 中解压出来的 classes.jar 文件
// 拿到 multiple-dex-core-debug.aar 中解压出来的 classes.jar 文件 var classesJarFile = File(aarUnzip, "classes.jar")
完整代码示例 :
fun main() { /* 1 . 生成 dex 文件 , 该 dex 文件中只包含解密 其它 dex 的功能 编译工程 会生成 Android 依赖库的 aar 文件 生成目录是 module/build/outputs/aar/ 目录下 前提是需要在 菜单栏 / File / Setting / Build, Execution, Deployment / Compiler 设置界面中 , 勾选 Compile independent modules in parallel (may require larger ) 将 D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-core\build\outputs\aar 路径下的 multiple-dex-core-debug.aar 文件后缀修改为 .zip 解压上述文件 拿到 classes.jar 文件即可 ; */ // 获取 multiple-dex-core-debug.aar 文件对象 var aarFile = File("multiple-dex-core/build/outputs/aar/multiple-dex-core-debug.aar") // 解压上述 multiple-dex-core-debug.aar 文件到 aarUnzip 目录中 // 创建解压目录 var aarUnzip = File("multiple-dex-tools/aarUnzip") // 解压操作 unZipAar(aarFile, aarUnzip) // 拿到 multiple-dex-core-debug.aar 中解压出来的 classes.jar 文件 var classesJarFile = File(aarUnzip, "classes.jar") } /** * 删除文件, 如果有目录, 则递归删除 */ private fun deleteFile(file: File) { if (file.isDirectory) { val files = file.listFiles() for (f in files) { deleteFile(f) } } else { file.delete() } } /** * 解压文件 * @param zip 被解压的压缩包文件 * @param dir 解压后的文件存放目录 */ fun unZipAar(zip: File, dir: File) { try { // 如果存放文件目录存在, 删除该目录 deleteFile(dir) // 获取 zip 压缩包文件 val zipFile = ZipFile(zip) // 获取 zip 压缩包中每一个文件条目 val entries = zipFile.entries() // 遍历压缩包中的文件 while (entries.hasMoreElements()) { val zipEntry = entries.nextElement() // zip 压缩包中的文件名称 或 目录名称 val name = zipEntry.name // 如果 apk 压缩包中含有以下文件 , 这些文件是 V1 签名文件保存目录 , 不需要解压 , 跳过即可 if (name == "META-INF/CERT.RSA" || name == "META-INF/CERT.SF" || (name == "META-INF/MANIFEST.MF") ) { continue } // 如果该文件条目 , 不是目录 , 说明就是文件 if (!zipEntry.isDirectory) { val file = File(dir, name) // 创建目录 if (!file.parentFile.exists()) { file.parentFile.mkdirs() } // 向刚才创建的目录中写出文件 val fileOutputStream = FileOutputStream(file) val inputStream = zipFile.getInputStream(zipEntry) val buffer = ByteArray(1024) var len: Int while (inputStream.read(buffer).also { len = it } != -1) { fileOutputStream.write(buffer, 0, len) } inputStream.close() fileOutputStream.close() } } // 关闭 zip 文件 zipFile.close() } catch (e: Exception) { e.printStackTrace() } }