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