From 120611879c44ca214ead40d59c34acfbc4b09001 Mon Sep 17 00:00:00 2001 From: Igor Eisberg <8811086+IgorEisberg@users.noreply.github.com> Date: Sun, 19 Feb 2023 13:57:03 +0200 Subject: [PATCH] fix: accept empty resources.arsc (#2998) * fix: accept empty resources.arsc * fix: accept empty resources.arsc (fix isFrameworkApk=true) --- .../src/main/java/brut/androlib/Androlib.java | 2 +- .../main/java/brut/androlib/mod/SmaliMod.java | 2 +- .../brut/androlib/res/AndrolibResources.java | 18 ++++++++---------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java index 0158f6a351..4bc7c18205 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java @@ -776,7 +776,7 @@ public void emptyFrameworkDirectory() throws AndrolibException { public boolean isFrameworkApk(ResTable resTable) { for (ResPackage pkg : resTable.listMainPackages()) { - if (pkg.getId() < 64) { + if (pkg.getId() > 0 && pkg.getId() < 64) { return true; } } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/mod/SmaliMod.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/mod/SmaliMod.java index 5fccb67102..8b0b9724c3 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/mod/SmaliMod.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/mod/SmaliMod.java @@ -30,7 +30,7 @@ import java.nio.charset.StandardCharsets; public class SmaliMod { - public static boolean assembleSmaliFile(File smaliFile,DexBuilder dexBuilder, int apiLevel, boolean verboseErrors, + public static boolean assembleSmaliFile(File smaliFile, DexBuilder dexBuilder, int apiLevel, boolean verboseErrors, boolean printTokens) throws IOException, RecognitionException { CommonTokenStream tokens; diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java index 9f2499e34f..7dcf914fda 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java @@ -66,7 +66,7 @@ public ResPackage loadMainPkg(ResTable resTable, ExtFile apkFile) switch (pkgs.length) { case 0: - pkg = null; + pkg = new ResPackage(resTable, 0, null); break; case 1: pkg = pkgs[0]; @@ -80,10 +80,6 @@ public ResPackage loadMainPkg(ResTable resTable, ExtFile apkFile) break; } - if (pkg == null) { - throw new AndrolibException("arsc files with zero packages or no arsc file found."); - } - resTable.addPackage(pkg, true); return pkg; } @@ -168,9 +164,11 @@ public void adjustPackageManifest(ResTable resTable, String filePath) resTable.setPackageId(resPackage.getId()); resTable.setPackageOriginal(pkgOriginal); - // 1) Check if pkgOriginal === mPackageRenamed - // 2) Check if pkgOriginal is ignored via IGNORED_PACKAGES - if (pkgOriginal.equalsIgnoreCase(mPackageRenamed) || (Arrays.asList(IGNORED_PACKAGES).contains(pkgOriginal))) { + // 1) Check if pkgOriginal is null (empty resources.arsc) + // 2) Check if pkgOriginal === mPackageRenamed + // 3) Check if pkgOriginal is ignored via IGNORED_PACKAGES + if (pkgOriginal == null || pkgOriginal.equalsIgnoreCase(mPackageRenamed) + || (Arrays.asList(IGNORED_PACKAGES).contains(pkgOriginal))) { LOGGER.info("Regular manifest package..."); } else { LOGGER.info("Renamed manifest package found! Replacing " + mPackageRenamed + " with " + pkgOriginal); @@ -708,7 +706,7 @@ public Duo getManifestFileDecoder(boolean wi if (withResources) { axmlParser.setAttrDecoder(new ResAttrDecoder()); } - decoders.setDecoder("xml", new XmlPullStreamDecoder(axmlParser,getResXmlSerializer())); + decoders.setDecoder("xml", new XmlPullStreamDecoder(axmlParser, getResXmlSerializer())); return new Duo<>(new ResFileDecoder(decoders), axmlParser); } @@ -772,7 +770,7 @@ private void generatePublicXml(ResPackage pkg, Directory out, } } - private ResPackage[] getResPackagesFromApk(ExtFile apkFile,ResTable resTable, boolean keepBroken) + private ResPackage[] getResPackagesFromApk(ExtFile apkFile, ResTable resTable, boolean keepBroken) throws AndrolibException { try { Directory dir = apkFile.getDirectory();