Add support for opening classes.dex file from zip, jar, apk
Adding new ZipArchive class and test
src/zip_archive.h
src/zip_archive.cc
src/zip_archive_test.cc
build/Android.common.mk
Change from host only use of build dex file for libcore to using host
and target core.jar containing classes.dex files. This requires
setting up an ANDROID_DATA directory to containing an art-cache file
for the extracted dex files, similar to the dalvik-cache for odex
files. A unique ANDROID_DATA and art-cache is created and cleaned up
for each test run (similar to vogar).
src/common_test.h
Add dependency for libcore jar files to test targets to support
RuntimeTest use of core.jar
Android.mk
Extract common includes to ART_C_INCLUDES when adding zlib dependency
build/Android.common.mk
build/Android.libart.mk
build/Android.test.mk
Adding TODO regarding unordered map for ClassLinker::classes_ table.
src/class_linker.h
Adding DexFile::OpenZip (also changed OpenFile to take
src/dex_file.cc
src/dex_file.h
Adding kPageSize of 4096, validated by Runtime::Init
src/globals.h
src/runtime.cc
Updated to use kPageSize where it seemed appropriate.
src/jni_compiler.cc
src/jni_compiler_test.cc
src/space.cc
src/thread.cc
src/thread_x86.cc
Changed thread_list_ and class_linker_ to be declared in Runtime::Init
initialization order.
src/runtime.h
Change-Id: Id626abe5b6c1990e4f93598256ee0fae000818f6
diff --git a/src/zip_archive_test.cc b/src/zip_archive_test.cc
new file mode 100644
index 0000000..472d5eb
--- /dev/null
+++ b/src/zip_archive_test.cc
@@ -0,0 +1,71 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "common_test.h"
+#include "zip_archive.h"
+#include "gtest/gtest.h"
+
+namespace art {
+
+class ZipArchiveTest : public RuntimeTest {};
+
+class TmpFile {
+ public:
+ TmpFile() {
+ filename_.reset(strdup("TmpFile-XXXXXX"));
+ CHECK(filename_ != NULL);
+ fd_ = mkstemp(filename_.get());
+ CHECK_NE(-1, fd_);
+ }
+
+ ~TmpFile() {
+ int unlink_result = unlink(filename_.get());
+ CHECK_EQ(0, unlink_result);
+ int close_result = close(fd_);
+ CHECK_EQ(0, close_result);
+ }
+
+ const char* GetFilename() const {
+ return filename_.get();
+ }
+
+ int GetFd() const {
+ return fd_;
+ }
+
+ private:
+ scoped_ptr_malloc<char> filename_;
+ int fd_;
+};
+
+TEST_F(ZipArchiveTest, FindAndExtract) {
+ scoped_ptr<ZipArchive> zip_archive(ZipArchive::Open(GetLibCoreDexFileName()));
+ ASSERT_TRUE(zip_archive != false);
+ scoped_ptr<ZipEntry> zip_entry(zip_archive->Find("classes.dex"));
+ ASSERT_TRUE(zip_entry != false);
+
+ TmpFile tmp;
+ ASSERT_NE(-1, tmp.GetFd());
+ bool success = zip_entry->Extract(tmp.GetFd());
+ ASSERT_TRUE(success);
+ close(tmp.GetFd());
+
+ uint32_t computed_crc = crc32(0L, Z_NULL, 0);
+ int fd = open(tmp.GetFilename(), O_RDONLY);
+ ASSERT_NE(-1, fd);
+ const size_t kBufSize = 32768;
+ uint8_t buf[kBufSize];
+ while (true) {
+ ssize_t bytes_read = TEMP_FAILURE_RETRY(read(fd, buf, kBufSize));
+ if (bytes_read == 0) {
+ break;
+ }
+ computed_crc = crc32(computed_crc, buf, bytes_read);
+ }
+ EXPECT_EQ(zip_entry->GetCrc32(), computed_crc);
+}
+
+} // namespace art