-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added custom patch for multiple dex files
- Loading branch information
1 parent
081d27b
commit dcd7f06
Showing
3 changed files
with
108 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
99 changes: 99 additions & 0 deletions
99
library/src/main/java/org/firstinspires/ftc/robotcore/internal/opmode/MultiDexHelper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
package org.firstinspires.ftc.robotcore.internal.opmode; | ||
|
||
import android.content.Context; | ||
import android.content.SharedPreferences; | ||
import android.content.pm.ApplicationInfo; | ||
import android.content.pm.PackageManager; | ||
|
||
import java.io.File; | ||
import java.io.IOException; | ||
import java.util.ArrayList; | ||
import java.util.Enumeration; | ||
import java.util.List; | ||
|
||
import dalvik.system.DexFile; | ||
|
||
/** | ||
* Created by [email protected] on 14/11/13. | ||
*/ | ||
public class MultiDexHelper { | ||
private static final String EXTRACTED_NAME_EXT = ".classes"; | ||
private static final String EXTRACTED_SUFFIX = ".zip"; | ||
|
||
private static final String SECONDARY_FOLDER_NAME = "code_cache" + File.separator + "secondary-dexes"; | ||
|
||
private static final String PREFS_FILE = "multidex.version"; | ||
private static final String KEY_DEX_NUMBER = "dex.number"; | ||
|
||
private static SharedPreferences getMultiDexPreferences(Context context) { | ||
return context.getSharedPreferences(PREFS_FILE, Context.MODE_MULTI_PROCESS); | ||
} | ||
|
||
/** | ||
* get all the dex path | ||
* | ||
* @param context the application context | ||
* @return all the dex path | ||
* @throws PackageManager.NameNotFoundException | ||
* @throws IOException | ||
*/ | ||
public static List<String> getSourcePaths(Context context) throws PackageManager.NameNotFoundException, IOException { | ||
ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0); | ||
File sourceApk = new File(applicationInfo.sourceDir); | ||
File dexDir = new File(applicationInfo.dataDir, SECONDARY_FOLDER_NAME); | ||
|
||
List<String> sourcePaths = new ArrayList<>(); | ||
sourcePaths.add(applicationInfo.sourceDir); //add the default apk path | ||
|
||
//the prefix of extracted file, ie: test.classes | ||
String extractedFilePrefix = sourceApk.getName() + EXTRACTED_NAME_EXT; | ||
//the total dex numbers | ||
int totalDexNumber = getMultiDexPreferences(context).getInt(KEY_DEX_NUMBER, 1); | ||
|
||
for (int secondaryNumber = 2; secondaryNumber <= totalDexNumber; secondaryNumber++) { | ||
//for each dex file, ie: test.classes2.zip, test.classes3.zip... | ||
String fileName = extractedFilePrefix + secondaryNumber + EXTRACTED_SUFFIX; | ||
File extractedFile = new File(dexDir, fileName); | ||
if (extractedFile.isFile()) { | ||
sourcePaths.add(extractedFile.getAbsolutePath()); | ||
//we ignore the verify zip part | ||
} else { | ||
throw new IOException("Missing extracted secondary dex file '" + | ||
extractedFile.getPath() + "'"); | ||
} | ||
} | ||
|
||
return sourcePaths; | ||
} | ||
|
||
/** | ||
* get all the classes name in "classes.dex", "classes2.dex", .... | ||
* | ||
* @param context the application context | ||
* @return all the classes name | ||
* @throws PackageManager.NameNotFoundException | ||
* @throws IOException | ||
*/ | ||
public static List<String> getAllClasses(Context context) throws PackageManager.NameNotFoundException, IOException { | ||
List<String> classNames = new ArrayList<>(); | ||
for (String path : getSourcePaths(context)) { | ||
try { | ||
DexFile dexfile; | ||
if (path.endsWith(EXTRACTED_SUFFIX)) { | ||
//NOT use new DexFile(path), because it will throw "permission error in /data/dalvik-cache" | ||
dexfile = DexFile.loadDex(path, path + ".tmp", 0); | ||
} else { | ||
dexfile = new DexFile(path); | ||
} | ||
Enumeration<String> dexEntries = dexfile.entries(); | ||
while (dexEntries.hasMoreElements()) { | ||
classNames.add(dexEntries.nextElement()); | ||
} | ||
} catch (IOException e) { | ||
throw new IOException("Error at loading dex file '" + | ||
path + "'"); | ||
} | ||
} | ||
return classNames; | ||
} | ||
} |