@@ -241,26 +241,12 @@ class ShadowPlugin : Plugin<Project> {
241241 it.outputs.file(decodeXml).withPropertyName(" decodeXml" )
242242
243243 it.doLast {
244- val jarPath = File (project.locateApkanalyzerResultPath().readText())
245- val tempCL = URLClassLoader (arrayOf(jarPath.toURL()), contextClassLoader)
246- val binaryXmlParserClass =
247- tempCL.loadClass(" com.android.tools.apk.analyzer.BinaryXmlParser" )
248- val decodeXmlMethod = binaryXmlParserClass.getDeclaredMethod(
249- " decodeXml" ,
250- String ::class .java,
251- ByteArray ::class .java
252- )
253-
254244 val zipFile = ZipFile (processedResFile)
255245 val binaryXml = zipFile.getInputStream(
256246 zipFile.getEntry(" AndroidManifest.xml" )
257247 ).readBytes()
258248
259- val outputXmlBytes = decodeXmlMethod.invoke(
260- null ,
261- " AndroidManifest.xml" ,
262- binaryXml
263- ) as ByteArray
249+ val outputXmlBytes = decodeXml(project, binaryXml)
264250 decodeXml.parentFile.mkdirs()
265251 decodeXml.writeBytes(outputXmlBytes)
266252 }
@@ -293,6 +279,50 @@ class ShadowPlugin : Plugin<Project> {
293279 (javacTask as JavaCompile ).source(project.fileTree(relativePath))
294280 }
295281
282+ /* *
283+ * 反射apkanalyzer中的BinaryXmlParser类的decodeXml方法
284+ */
285+ @Suppress(" PrivateApi" )
286+ private fun decodeXml (project : Project , binaryXml : ByteArray ): ByteArray {
287+ val jarPath = File (project.locateApkanalyzerResultPath().readText())
288+ val tempCL = URLClassLoader (arrayOf(jarPath.toURL()), contextClassLoader)
289+ val binaryXmlParserClass =
290+ tempCL.loadClass(" com.android.tools.apk.analyzer.BinaryXmlParser" )
291+ return try {
292+ decodeXmlMethodV1(binaryXmlParserClass, binaryXml)
293+ } catch (ignored: Exception ) {
294+ decodeXmlMethodV2(binaryXmlParserClass, binaryXml)
295+ }
296+ }
297+
298+ private fun decodeXmlMethodV1 (binaryXmlParserClass : Class <* >, binaryXml : ByteArray ): ByteArray {
299+ val decodeXmlMethod = binaryXmlParserClass.getDeclaredMethod(
300+ " decodeXml" ,
301+ String ::class .java,
302+ ByteArray ::class .java
303+ )
304+ return decodeXmlMethod.invoke(
305+ null ,
306+ " AndroidManifest.xml" ,
307+ binaryXml
308+ ) as ByteArray
309+ }
310+
311+ /* *
312+ * 新版本代码中删掉了一个String参数,这个参数原来只用于log输出了
313+ * https://cs.android.com/android-studio/platform/tools/base/+/6a81855c2fa102ae4532ad9a645e40177770a26a:apkparser/analyzer/src/main/java/com/android/tools/apk/analyzer/BinaryXmlParser.java;dlc=598c38100e4fb2b001385faea994fcb54cc515b1
314+ */
315+ private fun decodeXmlMethodV2 (binaryXmlParserClass : Class <* >, binaryXml : ByteArray ): ByteArray {
316+ val decodeXmlMethod = binaryXmlParserClass.getDeclaredMethod(
317+ " decodeXml" ,
318+ ByteArray ::class .java
319+ )
320+ return decodeXmlMethod.invoke(
321+ null ,
322+ binaryXml
323+ ) as ByteArray
324+ }
325+
296326 /* *
297327 * 检查插件是否修改了资源ID分区
298328 *
0 commit comments