diff options
| author | 2025-03-17 23:00:35 +0800 | |
|---|---|---|
| committer | 2025-03-18 17:55:59 +0800 | |
| commit | 85490371c0bb2b8772cbb21e7b6bea6086d3c5bc (patch) | |
| tree | 8197b6577511a6055fab2f657e2204112750084e | |
| parent | b08353eb9f89a03475eec68581d2d2627bcd235e (diff) | |
Fix NullPointerException in PackageUtil.getPackageInfo
Fix issue and code refactor
Bug: 397021179
Flag: EXEMPT Bug fix
Test: atest CtsPackageInstallerCUJInstallationTestCases
Test: atest CtsPackageInstallTestCases
Change-Id: Idf6891fff632744caa0c5deb1868fca160145ac9
| -rw-r--r-- | packages/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java | 32 | ||||
| -rw-r--r-- | packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt | 20 |
2 files changed, 41 insertions, 11 deletions
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java b/packages/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java index bcc737a351a9..d05aaaa6e389 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java @@ -52,8 +52,11 @@ import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Arrays; import java.util.Objects; +import java.util.stream.Stream; /** * This is a utility class for defining some utility methods and constants @@ -69,7 +72,8 @@ public class PackageUtil { //intent attribute strings related to uninstall public static final String INTENT_ATTR_PACKAGE_NAME=PREFIX+"PackageName"; private static final String DOWNLOADS_AUTHORITY = "downloads"; - private static final String SPLIT_BASE_APK_END_WITH = "base.apk"; + private static final String SPLIT_BASE_APK_SUFFIX = "base.apk"; + private static final String SPLIT_APK_SUFFIX = ".apk"; /** * Utility method to get package information for a given {@link File} @@ -77,11 +81,20 @@ public class PackageUtil { @Nullable public static PackageInfo getPackageInfo(Context context, File sourceFile, int flags) { String filePath = sourceFile.getAbsolutePath(); - if (filePath.endsWith(SPLIT_BASE_APK_END_WITH)) { + if (filePath.endsWith(SPLIT_BASE_APK_SUFFIX)) { File dir = sourceFile.getParentFile(); - if (dir.listFiles().length > 1) { - // split apks, use file directory to get archive info - filePath = dir.getPath(); + try (Stream<Path> list = Files.list(dir.toPath())) { + long count = list + .filter((name) -> name.endsWith(SPLIT_APK_SUFFIX)) + .limit(2) + .count(); + if (count > 1) { + // split apks, use file directory to get archive info + filePath = dir.getPath(); + } + } catch (Exception ignored) { + // No access to the parent directory, proceed to read app snippet + // from the base apk only } } try { @@ -240,9 +253,10 @@ public class PackageUtil { appInfo.publicSourceDir = archiveFilePath; if (appInfo.splitNames != null && appInfo.splitSourceDirs == null) { - final File[] files = sourceFile.getParentFile().listFiles(); + final File[] files = sourceFile.getParentFile().listFiles( + (dir, name) -> name.endsWith(SPLIT_APK_SUFFIX)); final String[] splits = Arrays.stream(appInfo.splitNames) - .map(i -> findFilePath(files, i + ".apk")) + .map(i -> findFilePath(files, i + SPLIT_APK_SUFFIX)) .filter(Objects::nonNull) .toArray(String[]::new); @@ -283,7 +297,9 @@ public class PackageUtil { } private static String findFilePath(File[] files, String postfix) { - for (File file : files) { + final int length = files != null ? files.length : 0; + for (int i = 0; i < length; i++) { + File file = files[i]; final String path = file.getAbsolutePath(); if (path.endsWith(postfix)) { return path; diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt index e8477ef261a8..b84b903ac1cb 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt +++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt @@ -41,6 +41,8 @@ import android.util.Log import com.android.packageinstaller.v2.model.PackageUtil.getAppSnippet import java.io.ByteArrayOutputStream import java.io.File +import java.nio.file.Files +import java.nio.file.Path import kotlinx.parcelize.Parceler import kotlinx.parcelize.Parcelize @@ -48,6 +50,7 @@ object PackageUtil { private val LOG_TAG = InstallRepository::class.java.simpleName private const val DOWNLOADS_AUTHORITY = "downloads" private const val SPLIT_BASE_APK_SUFFIX = "base.apk" + private const val SPLIT_APK_SUFFIX = ".apk" const val localLogv = false const val ARGS_ABORT_REASON: String = "abort_reason" @@ -440,9 +443,20 @@ object PackageUtil { var filePath = sourceFile.absolutePath if (filePath.endsWith(SPLIT_BASE_APK_SUFFIX)) { val dir = sourceFile.parentFile - if ((dir?.listFiles()?.size ?: 0) > 1) { - // split apks, use file directory to get archive info - filePath = dir.path + try { + Files.list(dir.toPath()).use { list -> + val count: Long = list + .filter { name: Path -> name.endsWith(SPLIT_APK_SUFFIX) } + .limit(2) + .count() + if (count > 1) { + // split apks, use file directory to get archive info + filePath = dir.path + } + } + } catch (ignored: Exception) { + // No access to the parent directory, proceed to read app snippet + // from the base apk only } } return try { |