diff options
author | Jon Noack <noackjr@google.com> | 2019-09-04 15:39:38 -0500 |
---|---|---|
committer | Jon Noack <noackjr@google.com> | 2019-09-06 06:49:28 -0500 |
commit | 4f12ceb2d9c446cb8129365753c1a0ad9aa5cbc5 (patch) | |
tree | 6e5d954d1eae13abd0b1148579f71e505ccbab7c | |
parent | 0af363100de92b20cbcdb19c17db2eec416a9a2e (diff) | |
download | multidex-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.java | 7 |
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++) { |