diff options
author | 2021-09-14 14:18:31 -0700 | |
---|---|---|
committer | 2021-09-14 15:20:42 -0700 | |
commit | df73d1b4733b8b3cdfd96199018455026ba8d9d2 (patch) | |
tree | c7b06a6ca03da4f8b07937306cd9d474ec6685b4 | |
parent | 1011d45f5b5230fdc031f654f701e511dd4d935c (diff) |
Zipalign: Avoid unnecessary padding
Problem: Aligned entry always get padded to the next aligned slot.
Solution: Fix alignment test.
Bug: 199932309
Test: align_test.cpp
Change-Id: I1e61c67dcf45454dd782d0fcc6903f7e71954083
-rw-r--r-- | tools/zipalign/ZipFile.cpp | 2 | ||||
-rw-r--r-- | tools/zipalign/tests/src/align_test.cpp | 29 |
2 files changed, 30 insertions, 1 deletions
diff --git a/tools/zipalign/ZipFile.cpp b/tools/zipalign/ZipFile.cpp index 6037d595da..f2f65a63bc 100644 --- a/tools/zipalign/ZipFile.cpp +++ b/tools/zipalign/ZipFile.cpp @@ -530,7 +530,7 @@ status_t ZipFile::alignEntry(android::ZipEntry* pEntry, uint32_t alignTo){ // If the alignment is not what was requested, add some padding in the extra // so the payload ends up where is requested. uint64_t alignDiff = alignTo - (expectedPayloadOffset % alignTo); - if (alignDiff == 0) + if (alignDiff == alignTo) return OK; return pEntry->addPadding(alignDiff); diff --git a/tools/zipalign/tests/src/align_test.cpp b/tools/zipalign/tests/src/align_test.cpp index c79e791e41..96d4f7365f 100644 --- a/tools/zipalign/tests/src/align_test.cpp +++ b/tools/zipalign/tests/src/align_test.cpp @@ -9,6 +9,7 @@ #include <android-base/file.h> using namespace android; +using namespace base; static std::string GetTestPath(const std::string& filename) { static std::string test_data_dir = android::base::GetExecutableDirectory() + "/tests/data/"; @@ -26,6 +27,34 @@ TEST(Align, Unaligned) { ASSERT_EQ(0, verified); } +TEST(Align, DoubleAligment) { + const std::string src = GetTestPath("unaligned.zip"); + const std::string tmp = GetTestPath("da_aligned.zip"); + const std::string dst = GetTestPath("da_d_aligner.zip"); + + int processed = process(src.c_str(), tmp.c_str(), 4, true, false, 4096); + ASSERT_EQ(0, processed); + + int verified = verify(tmp.c_str(), 4, true, false); + 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, 4096); + ASSERT_EQ(0, processed); + + verified = verify(dst.c_str(), 4, true, false); + ASSERT_EQ(0, verified); + + // Nothing should have changed between tmp and dst. + std::string tmp_content; + ASSERT_EQ(true, ReadFileToString(tmp, &tmp_content)); + + std::string dst_content; + ASSERT_EQ(true, ReadFileToString(dst, &dst_content)); + + ASSERT_EQ(tmp_content, dst_content); +} + // Align a zip featuring a hole at the beginning. The // hole in the archive is a delete entry in the Central // Directory. |