zipalign: Allow specifiying the target page size
Allow apps to specify the target page size for aligning their
uncompressed shared libraries.
This allows apps that want to support larger page sizes to do
so by specifiying the -P <pagesize_kb> flag.
However, apps built for 4k-only devices are unaffected as they
can continue to use -p flag for 4kB page alignment of uncompressed
shared libraries.
Bug: 276963821
Test: atest -c zipalign_tests
Change-Id: I890db067b8f898045f73e86788662f94a48af772
Signed-off-by: Kalesh Singh <kaleshsingh@google.com>
diff --git a/tools/zipalign/tests/src/align_test.cpp b/tools/zipalign/tests/src/align_test.cpp
index 09be445..07ad7cc 100644
--- a/tools/zipalign/tests/src/align_test.cpp
+++ b/tools/zipalign/tests/src/align_test.cpp
@@ -48,11 +48,12 @@
TEST(Align, Unaligned) {
const std::string src = GetTestPath("unaligned.zip");
const std::string dst = GetTempPath("unaligned_out.zip");
+ int pageSize = 4096;
- int processed = process(src.c_str(), dst.c_str(), 4, true, false, false);
+ int processed = process(src.c_str(), dst.c_str(), 4, true, false, false, pageSize);
ASSERT_EQ(0, processed);
- int verified = verify(dst.c_str(), 4, true, false);
+ int verified = verify(dst.c_str(), 4, true, false, pageSize);
ASSERT_EQ(0, verified);
}
@@ -60,18 +61,19 @@
const std::string src = GetTestPath("unaligned.zip");
const std::string tmp = GetTempPath("da_aligned.zip");
const std::string dst = GetTempPath("da_d_aligner.zip");
+ int pageSize = 4096;
- int processed = process(src.c_str(), tmp.c_str(), 4, true, false, false);
+ int processed = process(src.c_str(), tmp.c_str(), 4, true, false, false, pageSize);
ASSERT_EQ(0, processed);
- int verified = verify(tmp.c_str(), 4, true, false);
+ int verified = verify(tmp.c_str(), 4, true, false, pageSize);
ASSERT_EQ(0, verified);
// Align the result of the previous run. Essentially double aligning.
- processed = process(tmp.c_str(), dst.c_str(), 4, true, false, false);
+ processed = process(tmp.c_str(), dst.c_str(), 4, true, false, false, pageSize);
ASSERT_EQ(0, processed);
- verified = verify(dst.c_str(), 4, true, false);
+ verified = verify(dst.c_str(), 4, true, false, pageSize);
ASSERT_EQ(0, verified);
// Nothing should have changed between tmp and dst.
@@ -90,11 +92,12 @@
TEST(Align, Holes) {
const std::string src = GetTestPath("holes.zip");
const std::string dst = GetTempPath("holes_out.zip");
+ int pageSize = 4096;
- int processed = process(src.c_str(), dst.c_str(), 4, true, false, true);
+ int processed = process(src.c_str(), dst.c_str(), 4, true, false, true, pageSize);
ASSERT_EQ(0, processed);
- int verified = verify(dst.c_str(), 4, false, true);
+ int verified = verify(dst.c_str(), 4, false, true, pageSize);
ASSERT_EQ(0, verified);
}
@@ -102,28 +105,85 @@
TEST(Align, DifferenteOrders) {
const std::string src = GetTestPath("diffOrders.zip");
const std::string dst = GetTempPath("diffOrders_out.zip");
+ int pageSize = 4096;
- int processed = process(src.c_str(), dst.c_str(), 4, true, false, true);
+ int processed = process(src.c_str(), dst.c_str(), 4, true, false, true, pageSize);
ASSERT_EQ(0, processed);
- int verified = verify(dst.c_str(), 4, false, true);
+ int verified = verify(dst.c_str(), 4, false, true, pageSize);
ASSERT_EQ(0, verified);
}
TEST(Align, DirectoryEntryDoNotRequireAlignment) {
const std::string src = GetTestPath("archiveWithOneDirectoryEntry.zip");
- int verified = verify(src.c_str(), 4, false, true);
+ int pageSize = 4096;
+ int verified = verify(src.c_str(), 4, false, true, pageSize);
ASSERT_EQ(0, verified);
}
TEST(Align, DirectoryEntry) {
const std::string src = GetTestPath("archiveWithOneDirectoryEntry.zip");
const std::string dst = GetTempPath("archiveWithOneDirectoryEntry_out.zip");
+ int pageSize = 4096;
- int processed = process(src.c_str(), dst.c_str(), 4, true, false, true);
+ int processed = process(src.c_str(), dst.c_str(), 4, true, false, true, pageSize);
ASSERT_EQ(0, processed);
ASSERT_EQ(true, sameContent(src, dst));
- int verified = verify(dst.c_str(), 4, false, true);
+ int verified = verify(dst.c_str(), 4, false, true, pageSize);
+ ASSERT_EQ(0, verified);
+}
+
+class UncompressedSharedLibsTest : public ::testing::Test {
+ protected:
+ static void SetUpTestSuite() {
+ src = GetTestPath("apkWithUncompressedSharedLibs.zip");
+ dst = GetTempPath("apkWithUncompressedSharedLibs_out.zip");
+ }
+
+ static std::string src;
+ static std::string dst;
+};
+
+std::string UncompressedSharedLibsTest::src;
+std::string UncompressedSharedLibsTest::dst;
+
+TEST_F(UncompressedSharedLibsTest, Unaligned) {
+ int pageSize = 4096;
+
+ int processed = process(src.c_str(), dst.c_str(), 4, true, false, false, pageSize);
+ ASSERT_EQ(0, processed);
+
+ int verified = verify(dst.c_str(), 4, true, true, pageSize);
+ ASSERT_NE(0, verified); // .so's not page-aligned
+}
+
+TEST_F(UncompressedSharedLibsTest, AlignedPageSize4kB) {
+ int pageSize = 4096;
+
+ int processed = process(src.c_str(), dst.c_str(), 4, true, false, true, pageSize);
+ ASSERT_EQ(0, processed);
+
+ int verified = verify(dst.c_str(), 4, true, true, pageSize);
+ ASSERT_EQ(0, verified);
+}
+
+TEST_F(UncompressedSharedLibsTest, AlignedPageSize16kB) {
+ int pageSize = 16384;
+
+ int processed = process(src.c_str(), dst.c_str(), 4, true, false, true, pageSize);
+ ASSERT_EQ(0, processed);
+
+ int verified = verify(dst.c_str(), 4, true, true, pageSize);
+ ASSERT_EQ(0, verified);
+}
+
+TEST_F(UncompressedSharedLibsTest, AlignedPageSize64kB) {
+ int pageSize = 65536;
+
+ int processed = process(src.c_str(), dst.c_str(), 4, true, false, true, pageSize);
+ ASSERT_EQ(0, processed);
+
+ int verified = verify(dst.c_str(), 4, true, true, pageSize);
ASSERT_EQ(0, verified);
}