From d8fa2b921c801707f40a2c30adb07ab79ac949a0 Mon Sep 17 00:00:00 2001 From: REAndroid Date: Sat, 31 Dec 2022 07:52:10 -0500 Subject: [PATCH] add public.xml decoder --- .../lib/apk/ApkModuleXmlDecoder.java | 28 +++++++++++++++++++ .../java/com/reandroid/lib/apk/ApkUtil.java | 1 + 2 files changed, 29 insertions(+) diff --git a/src/main/java/com/reandroid/lib/apk/ApkModuleXmlDecoder.java b/src/main/java/com/reandroid/lib/apk/ApkModuleXmlDecoder.java index fe121cf..6e6f0e8 100644 --- a/src/main/java/com/reandroid/lib/apk/ApkModuleXmlDecoder.java +++ b/src/main/java/com/reandroid/lib/apk/ApkModuleXmlDecoder.java @@ -48,12 +48,17 @@ import java.util.*; public void decodeTo(File outDir) throws IOException, XMLException { this.decodedEntries.clear(); + logMessage("Decoding ..."); TableEntryStore entryStore=new TableEntryStore(); entryStore.add(Frameworks.getAndroid()); TableBlock tableBlock=apkModule.getTableBlock(); entryStore.add(tableBlock); xmlBagDecoder=new XMLBagDecoder(entryStore); + + decodePublicXml(tableBlock, outDir); + decodeAndroidManifest(entryStore, outDir); + logMessage("Decoding resource files ..."); List resFileList=apkModule.listResFiles(); for(ResFile resFile:resFileList){ @@ -109,6 +114,24 @@ import java.util.*; addDecodedEntry(resFile.getEntryBlockList()); } + private void decodePublicXml(TableBlock tableBlock, File outDir) + throws IOException{ + for(PackageBlock packageBlock:tableBlock.listPackages()){ + decodePublicXml(packageBlock, outDir); + } + } + private void decodePublicXml(PackageBlock packageBlock, File outDir) + throws IOException { + String packageDirName=getPackageDirName(packageBlock); + logMessage("Decoding public.xml: "+packageDirName); + File file=new File(outDir, packageDirName); + file=new File(file, ApkUtil.RES_DIR_NAME); + file=new File(file, "values"); + file=new File(file, ApkUtil.FILE_NAME_PUBLIC_XML); + ResourceIds resourceIds=new ResourceIds(); + resourceIds.loadPackageBlock(packageBlock); + resourceIds.writeXml(file); + } private void decodeAndroidManifest(EntryStore entryStore, File outDir) throws IOException, XMLException { if(!apkModule.hasAndroidManifestBlock()){ @@ -152,7 +175,12 @@ import java.util.*; } } private void decodeValues(EntryStore entryStore, File outDir, PackageBlock packageBlock) throws IOException { + logMessage("Decoding values: " + +packageBlock.getIndex() + +"-"+packageBlock.getName()); + packageBlock.sortTypes(); + for(SpecTypePair specTypePair: packageBlock.listAllSpecTypePair()){ for(TypeBlock typeBlock:specTypePair.listTypeBlocks()){ decodeValues(entryStore, outDir, typeBlock); diff --git a/src/main/java/com/reandroid/lib/apk/ApkUtil.java b/src/main/java/com/reandroid/lib/apk/ApkUtil.java index ec84713..f460226 100644 --- a/src/main/java/com/reandroid/lib/apk/ApkUtil.java +++ b/src/main/java/com/reandroid/lib/apk/ApkUtil.java @@ -145,4 +145,5 @@ public class ApkUtil { public static final String NAME_value_type="value_type"; public static final String NAME_data="data"; public static final String RES_DIR_NAME="res"; + public static final String FILE_NAME_PUBLIC_XML ="public.xml"; }