From 4f12ceb2d9c446cb8129365753c1a0ad9aa5cbc5 Mon Sep 17 00:00:00 2001 From: Jon Noack Date: Wed, 4 Sep 2019 15:39:38 -0500 Subject: 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 --- library/src/androidx/multidex/MultiDexExtractor.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'library') 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 files = new ArrayList(totalDexNumber - 1); for (int secondaryNumber = 2; secondaryNumber <= totalDexNumber; secondaryNumber++) { -- cgit v1.2.3