Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: add failing/passing sparse/not-sparse test #3201

Merged
merged 4 commits into from
Jul 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public ApkDecoder(Config config, File apkFile) {
this(config, new ExtFile(apkFile));
}

public void decode(File outDir) throws AndrolibException, IOException, DirectoryException {
public ApkInfo decode(File outDir) throws AndrolibException, IOException, DirectoryException {
try {
if (!mConfig.forceDelete && outDir.exists()) {
throw new OutDirExistsException();
Expand Down Expand Up @@ -145,6 +145,8 @@ public void decode(File outDir) throws AndrolibException, IOException, Directory
recordUncompressedFiles(apkInfo, resourcesDecoder.getResFileMapping(), mUncompressedFiles);
copyOriginalFiles(outDir);
writeApkInfo(apkInfo, outDir);

return apkInfo;
} finally {
try {
mApkFile.close();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,12 +126,6 @@ private ResPackage[] readResourceTable() throws IOException, AndrolibException {
addMissingResSpecs();
}

// We've detected sparse resources, lets record this so we can rebuild in that same format (sparse/not)
// with aapt2. aapt1 will ignore this.
if (! mResTable.getSparseResources()) {
mResTable.setSparseResources(true);
}

return pkgs.toArray(new ResPackage[0]);
}

Expand Down Expand Up @@ -276,6 +270,9 @@ private ResType readTableType() throws IOException, AndrolibException {

if ((typeFlags & 0x01) != 0) {
LOGGER.fine("Sparse type flags detected: " + mTypeSpec.getName());

// We've detected sparse resources, lets record this so we can rebuild in that same format
mResTable.setSparseResources(true);
}

HashMap<Integer, Integer> entryOffsetMap = new LinkedHashMap<>();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* Copyright (C) 2010 Ryszard Wiśniewski <brut.alll@gmail.com>
* Copyright (C) 2010 Connor Tumbleson <connor.tumbleson@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package brut.androlib.decode;

import brut.androlib.*;
import brut.androlib.apk.ApkInfo;
import brut.common.BrutException;
import brut.directory.ExtFile;
import brut.util.OS;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.File;
import java.io.IOException;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class SparseFlagTest extends BaseTest {

@Before
public void beforeClass() throws Exception {
TestUtils.cleanFrameworkFile();
sTmpDir = new ExtFile(OS.createTempDirectory());
sTestOrigDir = new ExtFile(sTmpDir, "sparse-orig");
sTestNewDir = new ExtFile(sTmpDir, "sparse-new");
LOGGER.info("Unpacking sparse.apk && not-sparse.apk...");
TestUtils.copyResourceDir(SparseFlagTest.class, "decode/sparse", sTestOrigDir);
}

@After
public void afterClass() throws BrutException {
OS.rmdir(sTmpDir);
}

@Test
public void decodeWithExpectationOfSparseResources() throws BrutException, IOException {
File testApk = new File(sTestOrigDir, "sparse.apk");

LOGGER.info("Decoding sparse.apk...");
Config config = Config.getDefaultConfig();

ApkDecoder apkDecoder = new ApkDecoder(config, testApk);
ApkInfo apkInfo = apkDecoder.decode(sTestNewDir);

assertTrue("Expecting sparse resources", apkInfo.sparseResources);

LOGGER.info("Building sparse.apk...");
new ApkBuilder(config, sTestNewDir).build(testApk);
}

@Test
public void decodeWithExpectationOfNoSparseResources() throws BrutException, IOException {
File testApk = new File(sTestOrigDir, "not-sparse.apk");

LOGGER.info("Decoding not-sparse.apk...");
Config config = Config.getDefaultConfig();

ApkDecoder apkDecoder = new ApkDecoder(config, testApk);
ApkInfo apkInfo = apkDecoder.decode(sTestNewDir);

assertFalse("Expecting not-sparse resources", apkInfo.sparseResources);

LOGGER.info("Building not-sparse.apk...");
new ApkBuilder(config, sTestNewDir).build(testApk);
}
}
Binary file not shown.
Binary file not shown.