Extract into ApkInvoker and split into data classes. (#3124)

* extract AaptInvoker and rename MetaFile to ApkInfo, all decode methods from AndrolibResources moved to the ApkDecoder

* extract ARSCData and FlagsOffset from ARSCDecoder and remove unused imports

* rebase to master

* move decodeManifest and decodeResources to the ResourceDecoder

* remove commented old code
This commit is contained in:
sv99
2023-07-04 01:38:52 +03:00
committed by GitHub
parent e69b1ed7c0
commit a7e2e3e5e1
38 changed files with 1278 additions and 1289 deletions

View File

@ -16,7 +16,7 @@
*/
package brut.androlib;
import brut.androlib.meta.MetaInfo;
import brut.androlib.apk.ApkInfo;
import brut.common.BrutException;
import brut.directory.ExtFile;
import brut.directory.FileDirectory;
@ -37,8 +37,8 @@ import static org.junit.Assert.*;
public class BaseTest {
protected void compareUnknownFiles() throws BrutException {
MetaInfo control = MetaInfo.readMetaFile(sTestOrigDir);
MetaInfo test = MetaInfo.readMetaFile(sTestNewDir);
ApkInfo control = ApkInfo.load(sTestOrigDir);
ApkInfo test = ApkInfo.load(sTestNewDir);
assertNotNull(control.unknownFiles);
assertNotNull(test.unknownFiles);

View File

@ -17,7 +17,6 @@
package brut.androlib;
import brut.androlib.exceptions.AndrolibException;
import brut.androlib.res.AndrolibResources;
import brut.androlib.res.Framework;
import brut.common.BrutException;
import brut.directory.DirUtil;

View File

@ -20,7 +20,7 @@ import brut.androlib.ApkBuilder;
import brut.androlib.ApkDecoder;
import brut.androlib.BaseTest;
import brut.androlib.TestUtils;
import brut.androlib.meta.MetaInfo;
import brut.androlib.apk.ApkInfo;
import brut.common.BrutException;
import brut.directory.ExtFile;
import brut.util.OS;
@ -491,17 +491,17 @@ public class BuildAndDecodeTest extends BaseTest {
@Test
public void confirmZeroByteFileExtensionIsNotStored() throws BrutException {
MetaInfo metaInfo = MetaInfo.readMetaFile(sTestNewDir);
ApkInfo apkInfo = ApkInfo.load(sTestNewDir);
for (String item : metaInfo.doNotCompress) {
for (String item : apkInfo.doNotCompress) {
assertNotEquals("jpg", item);
}
}
@Test
public void confirmZeroByteFileIsStored() throws BrutException {
MetaInfo metaInfo = MetaInfo.readMetaFile(sTestNewDir);
assertTrue(metaInfo.doNotCompress.contains("assets/0byte_file.jpg"));
ApkInfo apkInfo = ApkInfo.load(sTestNewDir);
assertTrue(apkInfo.doNotCompress.contains("assets/0byte_file.jpg"));
}
@Test

View File

@ -16,11 +16,10 @@
*/
package brut.androlib.aapt1;
import brut.androlib.ApkBuilder;
import brut.androlib.ApkDecoder;
import brut.androlib.BaseTest;
import brut.androlib.TestUtils;
import brut.androlib.meta.MetaInfo;
import brut.androlib.apk.ApkInfo;
import brut.directory.ExtFile;
import brut.common.BrutException;
import brut.util.OS;
@ -57,7 +56,7 @@ public class ReferenceVersionCodeTest extends BaseTest {
File outDir = new File(sTmpDir + File.separator + apk + ".out");
apkDecoder.decode(outDir);
MetaInfo metaInfo = MetaInfo.readMetaFile(decodedApk);
assertEquals("v1.0.0", metaInfo.versionInfo.versionName);
ApkInfo apkInfo = ApkInfo.load(decodedApk);
assertEquals("v1.0.0", apkInfo.versionInfo.versionName);
}
}

View File

@ -18,7 +18,6 @@ package brut.androlib.aapt1;
import brut.androlib.*;
import brut.androlib.exceptions.AndrolibException;
import brut.androlib.res.AndrolibResources;
import brut.androlib.res.Framework;
import brut.directory.ExtFile;
import brut.common.BrutException;

View File

@ -17,9 +17,8 @@
package brut.androlib.aapt2;
import brut.androlib.*;
import brut.androlib.meta.MetaInfo;
import brut.androlib.apk.ApkInfo;
import brut.androlib.Config;
import brut.androlib.res.AndrolibResources;
import brut.common.BrutException;
import brut.directory.ExtFile;
import brut.util.OS;
@ -79,14 +78,14 @@ public class BuildAndDecodeTest extends BaseTest {
@Test
public void confirmZeroByteFileExtensionIsNotStored() throws BrutException {
MetaInfo metaInfo = MetaInfo.readMetaFile(sTestNewDir);
assertFalse(metaInfo.doNotCompress.contains("jpg"));
ApkInfo apkInfo = ApkInfo.load(sTestNewDir);
assertFalse(apkInfo.doNotCompress.contains("jpg"));
}
@Test
public void confirmZeroByteFileIsStored() throws BrutException {
MetaInfo metaInfo = MetaInfo.readMetaFile(sTestNewDir);
assertTrue(metaInfo.doNotCompress.contains("assets/0byte_file.jpg"));
ApkInfo apkInfo = ApkInfo.load(sTestNewDir);
assertTrue(apkInfo.doNotCompress.contains("assets/0byte_file.jpg"));
}
@Test

View File

@ -18,6 +18,7 @@ package brut.androlib.aapt2;
import brut.androlib.*;
import brut.androlib.exceptions.AndrolibException;
import brut.androlib.res.ResourcesDecoder;
import brut.androlib.res.data.ResTable;
import brut.common.BrutException;
import brut.directory.ExtFile;
@ -53,9 +54,12 @@ public class NonStandardPkgIdTest extends BaseTest {
new ApkBuilder(config, sTestOrigDir).build(testApk);
LOGGER.info("Decoding pkgid8.apk...");
ApkDecoder apkDecoder = new ApkDecoder(testApk);
apkDecoder.decode(sTestNewDir);
mResTable = apkDecoder.getResTable();
ResourcesDecoder resourcesDecoder = new ResourcesDecoder(
Config.getDefaultConfig(), new ExtFile(testApk));
sTestNewDir.mkdirs();
resourcesDecoder.decodeManifest(sTestNewDir);
mResTable = resourcesDecoder.decodeResources(sTestNewDir);
}
@AfterClass

View File

@ -17,9 +17,9 @@
package brut.androlib.androlib;
import brut.androlib.BaseTest;
import brut.androlib.Config;
import brut.androlib.res.AndrolibResources;
import brut.androlib.apk.ApkInfo;
import org.junit.Test;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.junit.Assert.assertEquals;
@ -28,82 +28,82 @@ public class InvalidSdkBoundingTest extends BaseTest {
@Test
public void checkIfInvalidValuesPass() {
AndrolibResources androlibResources = new AndrolibResources();
ApkInfo apkInfo = new ApkInfo();
Map<String, String> sdkInfo = new LinkedHashMap<>();
sdkInfo.put("minSdkVersion", "15");
sdkInfo.put("targetSdkVersion", "25");
sdkInfo.put("maxSdkVersion", "19");
androlibResources.setSdkInfo(sdkInfo);
assertEquals("19", androlibResources.checkTargetSdkVersionBounds());
apkInfo.setSdkInfo(sdkInfo);
assertEquals("19", apkInfo.checkTargetSdkVersionBounds());
}
@Test
public void checkIfMissingMinPasses() {
AndrolibResources androlibResources = new AndrolibResources();
ApkInfo apkInfo = new ApkInfo();
Map<String, String> sdkInfo = new LinkedHashMap<>();
sdkInfo.put("targetSdkVersion", "25");
sdkInfo.put("maxSdkVersion", "19");
androlibResources.setSdkInfo(sdkInfo);
assertEquals("19", androlibResources.checkTargetSdkVersionBounds());
apkInfo.setSdkInfo(sdkInfo);
assertEquals("19", apkInfo.checkTargetSdkVersionBounds());
}
@Test
public void checkIfMissingMaxPasses() {
AndrolibResources androlibResources = new AndrolibResources();
ApkInfo apkInfo = new ApkInfo();
Map<String, String> sdkInfo = new LinkedHashMap<>();
sdkInfo.put("minSdkVersion", "15");
sdkInfo.put("targetSdkVersion", "25");
androlibResources.setSdkInfo(sdkInfo);
assertEquals("25", androlibResources.checkTargetSdkVersionBounds());
apkInfo.setSdkInfo(sdkInfo);
assertEquals("25", apkInfo.checkTargetSdkVersionBounds());
}
@Test
public void checkIfMissingBothPasses() {
AndrolibResources androlibResources = new AndrolibResources();
ApkInfo apkInfo = new ApkInfo();
Map<String, String> sdkInfo = new LinkedHashMap<>();
sdkInfo.put("targetSdkVersion", "25");
androlibResources.setSdkInfo(sdkInfo);
assertEquals("25", androlibResources.checkTargetSdkVersionBounds());
apkInfo.setSdkInfo(sdkInfo);
assertEquals("25", apkInfo.checkTargetSdkVersionBounds());
}
@Test
public void checkForShortHandSTag() {
AndrolibResources androlibResources = new AndrolibResources();
ApkInfo apkInfo = new ApkInfo();
Map<String, String> sdkInfo = new LinkedHashMap<>();
sdkInfo.put("targetSdkVersion", "S");
androlibResources.setSdkInfo(sdkInfo);
assertEquals("31", androlibResources.checkTargetSdkVersionBounds());
apkInfo.setSdkInfo(sdkInfo);
assertEquals("31", apkInfo.checkTargetSdkVersionBounds());
}
@Test
public void checkForShortHandSdkTag() {
AndrolibResources androlibResources = new AndrolibResources();
ApkInfo apkInfo = new ApkInfo();
Map<String, String> sdkInfo = new LinkedHashMap<>();
sdkInfo.put("targetSdkVersion", "O");
androlibResources.setSdkInfo(sdkInfo);
assertEquals("26", androlibResources.checkTargetSdkVersionBounds());
apkInfo.setSdkInfo(sdkInfo);
assertEquals("26", apkInfo.checkTargetSdkVersionBounds());
}
@Test
public void checkForSdkDevelopmentInsaneTestValue() {
AndrolibResources androlibResources = new AndrolibResources();
ApkInfo apkInfo = new ApkInfo();
Map<String, String> sdkInfo = new LinkedHashMap<>();
sdkInfo.put("targetSdkVersion", "VANILLAICECREAM");
androlibResources.setSdkInfo(sdkInfo);
assertEquals("10000", androlibResources.checkTargetSdkVersionBounds());
apkInfo.setSdkInfo(sdkInfo);
assertEquals("10000", apkInfo.checkTargetSdkVersionBounds());
}
}

View File

@ -18,7 +18,9 @@ package brut.androlib.decode;
import brut.androlib.ApkDecoder;
import brut.androlib.BaseTest;
import brut.androlib.Config;
import brut.androlib.TestUtils;
import brut.androlib.res.ResourcesDecoder;
import brut.androlib.res.data.ResTable;
import brut.androlib.res.data.value.ResArrayValue;
import brut.androlib.res.data.value.ResValue;
@ -50,9 +52,12 @@ public class DecodeArrayTest extends BaseTest {
@Test
public void decodeStringArray() throws BrutException {
String apk = "issue1994.apk";
ApkDecoder apkDecoder = new ApkDecoder(new File(sTmpDir + File.separator + apk));
//ApkDecoder apkDecoder = new ApkDecoder(new File(sTmpDir + File.separator + apk));
ResourcesDecoder resourcesDecoder = new ResourcesDecoder(
Config.getDefaultConfig(),
new ExtFile(sTmpDir + File.separator + apk));
ResTable resTable = apkDecoder.getResTable();
ResTable resTable = resourcesDecoder.getResTable();
ResValue value = resTable.getResSpec(0x7f020001).getDefaultResource().getValue();
assertTrue("Not a ResArrayValue. Found: " + value.getClass(), value instanceof ResArrayValue);
@ -61,9 +66,11 @@ public class DecodeArrayTest extends BaseTest {
@Test
public void decodeArray() throws BrutException {
String apk = "issue1994.apk";
ApkDecoder apkDecoder = new ApkDecoder(new File(sTmpDir + File.separator + apk));
ResourcesDecoder resourcesDecoder = new ResourcesDecoder(
Config.getDefaultConfig(),
new ExtFile(sTmpDir + File.separator + apk));
ResTable resTable = apkDecoder.getResTable();
ResTable resTable = resourcesDecoder.getResTable();
ResValue value = resTable.getResSpec(0x7f020000).getDefaultResource().getValue();
assertTrue("Not a ResArrayValue. Found: " + value.getClass(), value instanceof ResArrayValue);

View File

@ -16,11 +16,10 @@
*/
package brut.androlib.decode;
import brut.androlib.ApkBuilder;
import brut.androlib.ApkDecoder;
import brut.androlib.BaseTest;
import brut.androlib.TestUtils;
import brut.androlib.meta.MetaInfo;
import brut.androlib.apk.ApkInfo;
import brut.directory.ExtFile;
import brut.common.BrutException;
import brut.util.OS;
@ -58,8 +57,8 @@ public class DoubleExtensionUnknownFileTest extends BaseTest {
File outDir = new File(sTmpDir + File.separator + apk + ".out");
apkDecoder.decode(outDir);
MetaInfo metaInfo = MetaInfo.readMetaFile(decodedApk);
for (String string : metaInfo.doNotCompress) {
ApkInfo apkInfo = ApkInfo.load(decodedApk);
for (String string : apkInfo.doNotCompress) {
if (StringUtils.countMatches(string, ".") > 1) {
assertTrue(string.equalsIgnoreCase("assets/bin/Data/sharedassets1.assets.split0"));
}

View File

@ -16,11 +16,10 @@
*/
package brut.androlib.decode;
import brut.androlib.ApkBuilder;
import brut.androlib.ApkDecoder;
import brut.androlib.BaseTest;
import brut.androlib.TestUtils;
import brut.androlib.meta.MetaInfo;
import brut.androlib.apk.ApkInfo;
import brut.common.BrutException;
import brut.directory.ExtFile;
import brut.util.OS;
@ -57,7 +56,7 @@ public class MissingVersionManifestTest extends BaseTest {
File outDir = new File(sTmpDir + File.separator + apk + ".out");
apkDecoder.decode(outDir);
MetaInfo metaInfo = MetaInfo.readMetaFile(decodedApk);
assertNull(metaInfo.versionInfo.versionName);
ApkInfo apkInfo = ApkInfo.load(decodedApk);
assertNull(apkInfo.versionInfo.versionName);
}
}