summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Noack <noackjr@google.com>2019-09-04 15:39:38 -0500
committerJon Noack <noackjr@google.com>2019-09-06 06:49:28 -0500
commit4f12ceb2d9c446cb8129365753c1a0ad9aa5cbc5 (patch)
tree6e5d954d1eae13abd0b1148579f71e505ccbab7c
parent0af363100de92b20cbcdb19c17db2eec416a9a2e (diff)
downloadmultidex-4f12ceb2d9c446cb8129365753c1a0ad9aa5cbc5.tar.gz
Force re-extraction if dex number is invalid
The dex number is considered invalid if it is not found in SharedPreferences or the persisted value is less than 1. My only theory for how this could occur is SharedPreferences corruption. In this scenario prior to this change, MultiDex would think there were no secondary dex files to extract and the application would crash at runtime with ClassNotFoundException. Bug: 62483082 Change-Id: If3671b53b06bb2fb97a9dd82858a6f43b0e1dc1c Test: mmma -j frameworks/multidex
-rw-r--r--library/src/androidx/multidex/MultiDexExtractor.java7
1 files changed, 6 insertions, 1 deletions
diff --git a/library/src/androidx/multidex/MultiDexExtractor.java b/library/src/androidx/multidex/MultiDexExtractor.java
index 2b96113..a63d724 100644
--- a/library/src/androidx/multidex/MultiDexExtractor.java
+++ b/library/src/androidx/multidex/MultiDexExtractor.java
@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.util.Log;
+
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
@@ -177,7 +178,11 @@ final class MultiDexExtractor implements Closeable {
final String extractedFilePrefix = sourceApk.getName() + EXTRACTED_NAME_EXT;
SharedPreferences multiDexPreferences = getMultiDexPreferences(context);
- int totalDexNumber = multiDexPreferences.getInt(prefsKeyPrefix + KEY_DEX_NUMBER, 1);
+ int totalDexNumber = multiDexPreferences.getInt(prefsKeyPrefix + KEY_DEX_NUMBER, 0);
+ if (totalDexNumber < 1) {
+ // Guard against SharedPreferences corruption
+ throw new IOException("Invalid dex number: " + totalDexNumber);
+ }
final List<ExtractedDex> files = new ArrayList<ExtractedDex>(totalDexNumber - 1);
for (int secondaryNumber = 2; secondaryNumber <= totalDexNumber; secondaryNumber++) {