Merge "Change package name of multi-dex instrumentation lib." into lmp-dev
diff --git a/library/src/android/support/multidex/MultiDexExtractor.java b/library/src/android/support/multidex/MultiDexExtractor.java
index b5973c5..27da6b3 100644
--- a/library/src/android/support/multidex/MultiDexExtractor.java
+++ b/library/src/android/support/multidex/MultiDexExtractor.java
@@ -253,10 +253,12 @@
      */
     private static void prepareDexDir(File dexDir, final String extractedFilePrefix)
             throws IOException {
-        dexDir.mkdirs();
-        if (!dexDir.isDirectory()) {
-            throw new IOException("Failed to create dex directory " + dexDir.getPath());
-        }
+        /* mkdirs() has some bugs, especially before jb-mr1 and we have only a maximum of one parent
+         * to create, lets stick to mkdir().
+         */
+        File cache = dexDir.getParentFile();
+        mkdirChecked(cache);
+        mkdirChecked(dexDir);
 
         // Clean possible old files
         FileFilter filter = new FileFilter() {
@@ -282,6 +284,24 @@
         }
     }
 
+    private static void mkdirChecked(File dir) throws IOException {
+        dir.mkdir();
+        if (!dir.isDirectory()) {
+            File parent = dir.getParentFile();
+            if (parent == null) {
+                Log.e(TAG, "Failed to create dir " + dir.getPath() + ". Parent file is null.");
+            } else {
+                Log.e(TAG, "Failed to create dir " + dir.getPath() +
+                        ". parent file is a dir " + parent.isDirectory() +
+                        ", a file " + parent.isFile() +
+                        ", exists " + parent.exists() +
+                        ", readable " + parent.canRead() +
+                        ", writable " + parent.canWrite());
+            }
+            throw new IOException("Failed to create cache directory " + dir.getPath());
+        }
+    }
+
     private static void extract(ZipFile apk, ZipEntry dexFile, File extractTo,
             String extractedFilePrefix) throws IOException, FileNotFoundException {