Do not back up APKs of test-only apps, as we can not re-install them anyway

The flag to allow installation gets filtered out after we set it:
http://aosp.opersys.com/xref/android-11.0.0_r5/xref/frameworks/base/services/core/java/com/android/server/pm/PackageInstallerService.java#544
This commit is contained in:
Torsten Grote 2020-10-09 14:43:59 -03:00 committed by Chirayu Desai
parent 0a8a286826
commit 0971c5db19
5 changed files with 25 additions and 8 deletions

View file

@ -5,7 +5,6 @@ import android.app.backup.IBackupManager
import android.app.backup.IRestoreObserver import android.app.backup.IRestoreObserver
import android.app.backup.IRestoreSession import android.app.backup.IRestoreSession
import android.app.backup.RestoreSet import android.app.backup.RestoreSet
import android.content.pm.PackageManager
import android.os.RemoteException import android.os.RemoteException
import android.os.UserHandle import android.os.UserHandle
import android.util.Log import android.util.Log
@ -31,6 +30,7 @@ import com.stevesoltys.seedvault.restore.DisplayFragment.RESTORE_BACKUP
import com.stevesoltys.seedvault.restore.install.ApkRestore import com.stevesoltys.seedvault.restore.install.ApkRestore
import com.stevesoltys.seedvault.restore.install.InstallIntentCreator import com.stevesoltys.seedvault.restore.install.InstallIntentCreator
import com.stevesoltys.seedvault.restore.install.InstallResult import com.stevesoltys.seedvault.restore.install.InstallResult
import com.stevesoltys.seedvault.restore.install.isInstalled
import com.stevesoltys.seedvault.settings.SettingsManager import com.stevesoltys.seedvault.settings.SettingsManager
import com.stevesoltys.seedvault.transport.TRANSPORT_ID import com.stevesoltys.seedvault.transport.TRANSPORT_ID
import com.stevesoltys.seedvault.transport.restore.RestoreCoordinator import com.stevesoltys.seedvault.transport.restore.RestoreCoordinator
@ -244,12 +244,7 @@ internal class RestoreViewModel(
QUOTA_EXCEEDED -> FAILED_QUOTA_EXCEEDED QUOTA_EXCEEDED -> FAILED_QUOTA_EXCEEDED
UNKNOWN_ERROR -> FAILED UNKNOWN_ERROR -> FAILED
APK_AND_DATA -> { APK_AND_DATA -> {
try { if (app.packageManager.isInstalled(packageName)) FAILED else FAILED_NOT_INSTALLED
app.packageManager.getPackageInfo(packageName, 0)
FAILED
} catch (e: PackageManager.NameNotFoundException) {
FAILED_NOT_INSTALLED
}
} }
} }
} }

View file

@ -108,7 +108,6 @@ internal class ApkInstaller(private val context: Context) {
} }
// update status and offer result // update status and offer result
// TODO maybe don't back up statusMsg=INSTALL_FAILED_TEST_ONLY apps in the first place?
val status = if (success) SUCCEEDED else FAILED val status = if (success) SUCCEEDED else FAILED
return installResult.update(packageName) { it.copy(state = status) } return installResult.update(packageName) { it.copy(state = status) }
} }

View file

@ -53,6 +53,13 @@ class ApkBackup(
// do not back up when setting is not enabled // do not back up when setting is not enabled
if (!settingsManager.backupApks()) return null if (!settingsManager.backupApks()) return null
// do not back up test-only apps as we can't re-install them anyway
// see: https://commonsware.com/blog/2017/10/31/android-studio-3p0-flag-test-only.html
if (packageInfo.isTestOnly()) {
Log.d(TAG, "Package $packageName is test-only app. Not backing it up.")
return null
}
// do not back up system apps that haven't been updated // do not back up system apps that haven't been updated
if (packageInfo.isNotUpdatedSystemApp()) { if (packageInfo.isNotUpdatedSystemApp()) {
Log.d(TAG, "Package $packageName is vanilla system app. Not backing it up.") Log.d(TAG, "Package $packageName is vanilla system app. Not backing it up.")

View file

@ -5,6 +5,7 @@ import android.content.Context
import android.content.pm.ApplicationInfo.FLAG_ALLOW_BACKUP import android.content.pm.ApplicationInfo.FLAG_ALLOW_BACKUP
import android.content.pm.ApplicationInfo.FLAG_STOPPED import android.content.pm.ApplicationInfo.FLAG_STOPPED
import android.content.pm.ApplicationInfo.FLAG_SYSTEM import android.content.pm.ApplicationInfo.FLAG_SYSTEM
import android.content.pm.ApplicationInfo.FLAG_TEST_ONLY
import android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP import android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
@ -162,3 +163,8 @@ internal fun PackageInfo.isStopped(): Boolean {
if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return false if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return false
return applicationInfo.flags and FLAG_STOPPED != 0 return applicationInfo.flags and FLAG_STOPPED != 0
} }
internal fun PackageInfo.isTestOnly(): Boolean {
if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return false
return applicationInfo.flags and FLAG_TEST_ONLY != 0
}

View file

@ -1,6 +1,7 @@
package com.stevesoltys.seedvault.transport.backup package com.stevesoltys.seedvault.transport.backup
import android.content.pm.ApplicationInfo.FLAG_SYSTEM import android.content.pm.ApplicationInfo.FLAG_SYSTEM
import android.content.pm.ApplicationInfo.FLAG_TEST_ONLY
import android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP import android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP
import android.content.pm.InstallSourceInfo import android.content.pm.InstallSourceInfo
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
@ -65,6 +66,15 @@ internal class ApkBackupTest : BackupTest() {
assertNull(apkBackup.backupApkIfNecessary(packageInfo, UNKNOWN_ERROR, streamGetter)) assertNull(apkBackup.backupApkIfNecessary(packageInfo, UNKNOWN_ERROR, streamGetter))
} }
@Test
fun `does not back up test-only apps`() = runBlocking {
packageInfo.applicationInfo.flags = FLAG_TEST_ONLY
every { settingsManager.backupApks() } returns true
assertNull(apkBackup.backupApkIfNecessary(packageInfo, UNKNOWN_ERROR, streamGetter))
}
@Test @Test
fun `does not back up system apps`() = runBlocking { fun `does not back up system apps`() = runBlocking {
packageInfo.applicationInfo.flags = FLAG_SYSTEM packageInfo.applicationInfo.flags = FLAG_SYSTEM