diff options
author | Yohann Roussel <yroussel@google.com> | 2013-11-13 14:04:25 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-11-13 14:04:25 +0000 |
commit | 4be173048a01fb57f3c26b85fbff3c2bcf9a1267 (patch) | |
tree | e9f60403eeebe73c53f64639dee79fc48010070f /library/src | |
parent | edf0717d4203bd7e9c9435019e3c256d564b4583 (diff) | |
parent | d9eda5550540306f2037e2db2aba2919fda90057 (diff) | |
download | multidex-4be173048a01fb57f3c26b85fbff3c2bcf9a1267.tar.gz |
Merge "Control modTime of extracted files."
Diffstat (limited to 'library/src')
-rw-r--r-- | library/src/android/support/multidex/MultiDexExtractor.java | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/library/src/android/support/multidex/MultiDexExtractor.java b/library/src/android/support/multidex/MultiDexExtractor.java index bcd9c4d..04c3932 100644 --- a/library/src/android/support/multidex/MultiDexExtractor.java +++ b/library/src/android/support/multidex/MultiDexExtractor.java @@ -16,15 +16,11 @@ package android.support.multidex; -import android.content.Context; -import android.content.pm.ApplicationInfo; -import android.util.Log; - import java.io.Closeable; import java.io.File; +import java.io.FileFilter; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -33,6 +29,10 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.util.Log; + /** * Exposes application secondary dex files as files in the application data * directory. @@ -67,10 +67,12 @@ final class MultiDexExtractor { static List<File> load(Context context, ApplicationInfo applicationInfo, File dexDir) throws IOException { - String extractedFilePrefix = new File(applicationInfo.sourceDir).getName() + File sourceApk = new File(applicationInfo.sourceDir); + long lastModified = sourceApk.lastModified(); + String extractedFilePrefix = sourceApk.getName() + EXTRACTED_NAME_EXT; - prepareDexDir(dexDir, extractedFilePrefix); + prepareDexDir(dexDir, extractedFilePrefix, lastModified); final List<File> files = new ArrayList<File>(); ZipFile apk = new ZipFile(applicationInfo.sourceDir); @@ -85,7 +87,8 @@ final class MultiDexExtractor { files.add(extractedFile); if (!extractedFile.isFile()) { - extract(context, apk, dexFile, extractedFile, extractedFilePrefix); + extract(context, apk, dexFile, extractedFile, extractedFilePrefix, + lastModified); } secondaryNumber++; dexFile = apk.getEntry(DEX_PREFIX + secondaryNumber + DEX_SUFFIX); @@ -101,18 +104,20 @@ final class MultiDexExtractor { return files; } - private static void prepareDexDir(File dexDir, final String extractedFilePrefix) - throws IOException { + private static void prepareDexDir(File dexDir, final String extractedFilePrefix, + final long sourceLastModified) throws IOException { dexDir.mkdir(); if (!dexDir.isDirectory()) { throw new IOException("Failed to create dex directory " + dexDir.getPath()); } // Clean possible old files - FilenameFilter filter = new FilenameFilter() { + FileFilter filter = new FileFilter() { + @Override - public boolean accept(File dir, String name) { - return !name.startsWith(extractedFilePrefix); + public boolean accept(File pathname) { + return (!pathname.getName().startsWith(extractedFilePrefix)) + || (pathname.lastModified() < sourceLastModified); } }; File[] files = dexDir.listFiles(filter); @@ -129,7 +134,8 @@ final class MultiDexExtractor { private static void extract( Context context, ZipFile apk, ZipEntry dexFile, File extractTo, - String extractedFilePrefix) throws IOException, FileNotFoundException { + String extractedFilePrefix, long sourceLastModified) + throws IOException, FileNotFoundException { InputStream in = apk.getInputStream(dexFile); ZipOutputStream out = null; @@ -153,6 +159,10 @@ final class MultiDexExtractor { } finally { closeQuietly(out); } + if (!tmp.setLastModified(sourceLastModified)) { + Log.e(TAG, "Failed to set time of \"" + tmp.getAbsolutePath() + "\"." + + " This may cause problems with later updates of the apk."); + } Log.i(TAG, "Renaming to " + extractTo.getPath()); if (!tmp.renameTo(extractTo)) { throw new IOException("Failed to rename \"" + tmp.getAbsolutePath() + "\" to \"" + |