From 49a65e5526ed3a5353765b3e429c49543d1f3b8c Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Tue, 12 Jul 2011 14:14:01 -0700 Subject: [PATCH] Move extract native libraries to JNI code The built-in ZipFile class was quite a long time to find an unpack libraries. Move everything to using the libutils ZipFileRO class that goes quite a bit faster. Initial measurements are 6 times faster than the Java code. Also, read files off the disk and compare their CRC against the APK's CRC to see if we need to write the new file to disk. This also cuts down the bootup time by up to a second per APK that has native files. Change-Id: Ic464a7969a17368fb6a6b81d026888c4136c7603 --- include/utils/ZipFileRO.h | 15 +++++++ libs/utils/tests/Android.mk | 3 +- libs/utils/tests/ZipFileRO_test.cpp | 64 +++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 libs/utils/tests/ZipFileRO_test.cpp diff --git a/include/utils/ZipFileRO.h b/include/utils/ZipFileRO.h index 3a999797b..547e36a09 100644 --- a/include/utils/ZipFileRO.h +++ b/include/utils/ZipFileRO.h @@ -38,6 +38,7 @@ #include #include #include +#include namespace android { @@ -173,6 +174,20 @@ public: static bool inflateBuffer(int fd, const void* inBuf, size_t uncompLen, size_t compLen); + /* + * Utility function to convert ZIP's time format to a timespec struct. + */ + static inline void zipTimeToTimespec(long when, struct tm* timespec) { + const long date = when >> 16; + timespec->tm_year = ((date >> 9) & 0x7F) + 80; // Zip is years since 1980 + timespec->tm_mon = (date >> 5) & 0x0F; + timespec->tm_mday = date & 0x1F; + + timespec->tm_hour = (when >> 11) & 0x1F; + timespec->tm_min = (when >> 5) & 0x3F; + timespec->tm_sec = (when & 0x1F) << 1; + } + /* * Some basic functions for raw data manipulation. "LE" means * Little Endian. diff --git a/libs/utils/tests/Android.mk b/libs/utils/tests/Android.mk index 8726a536c..b97f52f5b 100644 --- a/libs/utils/tests/Android.mk +++ b/libs/utils/tests/Android.mk @@ -8,7 +8,8 @@ test_src_files := \ ObbFile_test.cpp \ Looper_test.cpp \ String8_test.cpp \ - Unicode_test.cpp + Unicode_test.cpp \ + ZipFileRO_test.cpp \ shared_libraries := \ libz \ diff --git a/libs/utils/tests/ZipFileRO_test.cpp b/libs/utils/tests/ZipFileRO_test.cpp new file mode 100644 index 000000000..7a1d0bd95 --- /dev/null +++ b/libs/utils/tests/ZipFileRO_test.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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 + * + * http://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. + */ + +#define LOG_TAG "ZipFileRO_test" +#include +#include + +#include + +#include +#include + +namespace android { + +class ZipFileROTest : public testing::Test { +protected: + virtual void SetUp() { + } + + virtual void TearDown() { + } +}; + +TEST_F(ZipFileROTest, ZipTimeConvertSuccess) { + struct tm t; + + // 2011-06-29 14:40:40 + long when = 0x3EDD7514; + + ZipFileRO::zipTimeToTimespec(when, &t); + + EXPECT_EQ(2011, t.tm_year + 1900) + << "Year was improperly converted."; + + EXPECT_EQ(6, t.tm_mon) + << "Month was improperly converted."; + + EXPECT_EQ(29, t.tm_mday) + << "Day was improperly converted."; + + EXPECT_EQ(14, t.tm_hour) + << "Hour was improperly converted."; + + EXPECT_EQ(40, t.tm_min) + << "Minute was improperly converted."; + + EXPECT_EQ(40, t.tm_sec) + << "Second was improperly converted."; +} + +}