From dc5bafb270b19b6735f693f48c1f4e8fc8171df7 Mon Sep 17 00:00:00 2001 From: aprz512 Date: Fri, 22 Nov 2024 13:07:16 +0800 Subject: [PATCH] =?UTF-8?q?fix(core.gradle-plugin):=20=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=9B=B4=E9=AB=98=E7=89=88=E6=9C=ACcmdline-tools=E4=B8=ADdecod?= =?UTF-8?q?eXml=E6=96=B9=E6=B3=95=E7=AD=BE=E5=90=8D=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #1314 --- .../shadow/core/gradle/ShadowPlugin.kt | 60 ++++++++++++++----- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt index 93df1a3b6..ff64fe2d5 100644 --- a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt +++ b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt @@ -241,26 +241,12 @@ class ShadowPlugin : Plugin { it.outputs.file(decodeXml).withPropertyName("decodeXml") it.doLast { - val jarPath = File(project.locateApkanalyzerResultPath().readText()) - val tempCL = URLClassLoader(arrayOf(jarPath.toURL()), contextClassLoader) - val binaryXmlParserClass = - tempCL.loadClass("com.android.tools.apk.analyzer.BinaryXmlParser") - val decodeXmlMethod = binaryXmlParserClass.getDeclaredMethod( - "decodeXml", - String::class.java, - ByteArray::class.java - ) - val zipFile = ZipFile(processedResFile) val binaryXml = zipFile.getInputStream( zipFile.getEntry("AndroidManifest.xml") ).readBytes() - val outputXmlBytes = decodeXmlMethod.invoke( - null, - "AndroidManifest.xml", - binaryXml - ) as ByteArray + val outputXmlBytes = decodeXml(project, binaryXml) decodeXml.parentFile.mkdirs() decodeXml.writeBytes(outputXmlBytes) } @@ -293,6 +279,50 @@ class ShadowPlugin : Plugin { (javacTask as JavaCompile).source(project.fileTree(relativePath)) } + /** + * 反射apkanalyzer中的BinaryXmlParser类的decodeXml方法 + */ + @Suppress("PrivateApi") + private fun decodeXml(project: Project, binaryXml: ByteArray): ByteArray { + val jarPath = File(project.locateApkanalyzerResultPath().readText()) + val tempCL = URLClassLoader(arrayOf(jarPath.toURL()), contextClassLoader) + val binaryXmlParserClass = + tempCL.loadClass("com.android.tools.apk.analyzer.BinaryXmlParser") + return try { + decodeXmlMethodV1(binaryXmlParserClass, binaryXml) + } catch (ignored: Exception) { + decodeXmlMethodV2(binaryXmlParserClass, binaryXml) + } + } + + private fun decodeXmlMethodV1(binaryXmlParserClass: Class<*>, binaryXml: ByteArray): ByteArray { + val decodeXmlMethod = binaryXmlParserClass.getDeclaredMethod( + "decodeXml", + String::class.java, + ByteArray::class.java + ) + return decodeXmlMethod.invoke( + null, + "AndroidManifest.xml", + binaryXml + ) as ByteArray + } + + /** + * 新版本代码中删掉了一个String参数,这个参数原来只用于log输出了 + * https://cs.android.com/android-studio/platform/tools/base/+/6a81855c2fa102ae4532ad9a645e40177770a26a:apkparser/analyzer/src/main/java/com/android/tools/apk/analyzer/BinaryXmlParser.java;dlc=598c38100e4fb2b001385faea994fcb54cc515b1 + */ + private fun decodeXmlMethodV2(binaryXmlParserClass: Class<*>, binaryXml: ByteArray): ByteArray { + val decodeXmlMethod = binaryXmlParserClass.getDeclaredMethod( + "decodeXml", + ByteArray::class.java + ) + return decodeXmlMethod.invoke( + null, + binaryXml + ) as ByteArray + } + /** * 检查插件是否修改了资源ID分区 *