diff options
| author | 2016-02-17 18:00:48 -0800 | |
|---|---|---|
| committer | 2016-02-18 20:47:36 +0000 | |
| commit | 43fbc5f898a488dcfa9ecf3030f05f27ce5428f9 (patch) | |
| tree | e1eb414a8296db2b0956f2f8b68a77d7b382127d | |
| parent | 24f62ea63482e6c5d5ba3357951e13e25221eb2e (diff) | |
Add android:backupInForeground
An app can now declare that it really needs to be backed up
whenever possible even if it is currently engaged in foreground-
equivalent work. Only applies to full-data backup clients: key/value
backups are not intrusive on normal lifecycle so they can already
happen in such circumstances.
Bug 26790411
Change-Id: Ia0ebcc7a53da888ae9ae4d63cd4bcab6e3a2e866
| -rw-r--r-- | api/current.txt | 1 | ||||
| -rw-r--r-- | api/system-current.txt | 1 | ||||
| -rw-r--r-- | api/test-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/content/pm/ApplicationInfo.java | 8 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageParser.java | 10 | ||||
| -rw-r--r-- | core/res/res/values/attrs_manifest.xml | 12 | ||||
| -rw-r--r-- | core/res/res/values/public.xml | 1 | ||||
| -rw-r--r-- | services/backup/java/com/android/server/backup/BackupManagerService.java | 6 |
8 files changed, 37 insertions, 3 deletions
diff --git a/api/current.txt b/api/current.txt index 1ebec4e56d4d..96900cd4a0b7 100644 --- a/api/current.txt +++ b/api/current.txt @@ -300,6 +300,7 @@ package android { field public static final int backgroundTint = 16843883; // 0x101046b field public static final int backgroundTintMode = 16843884; // 0x101046c field public static final int backupAgent = 16843391; // 0x101027f + field public static final int backupInForeground = 16844059; // 0x101051b field public static final int banner = 16843762; // 0x10103f2 field public static final int baseline = 16843548; // 0x101031c field public static final int baselineAlignBottom = 16843042; // 0x1010122 diff --git a/api/system-current.txt b/api/system-current.txt index 55df364e4da9..8c4e3dc8fdb8 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -395,6 +395,7 @@ package android { field public static final int backgroundTint = 16843883; // 0x101046b field public static final int backgroundTintMode = 16843884; // 0x101046c field public static final int backupAgent = 16843391; // 0x101027f + field public static final int backupInForeground = 16844059; // 0x101051b field public static final int banner = 16843762; // 0x10103f2 field public static final int baseline = 16843548; // 0x101031c field public static final int baselineAlignBottom = 16843042; // 0x1010122 diff --git a/api/test-current.txt b/api/test-current.txt index 8fcb9bdc72ee..68c51a59d398 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -300,6 +300,7 @@ package android { field public static final int backgroundTint = 16843883; // 0x101046b field public static final int backgroundTintMode = 16843884; // 0x101046c field public static final int backupAgent = 16843391; // 0x101027f + field public static final int backupInForeground = 16844059; // 0x101051b field public static final int banner = 16843762; // 0x10103f2 field public static final int baseline = 16843548; // 0x101031c field public static final int baselineAlignBottom = 16843042; // 0x1010122 diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 90824820d0eb..ad174f6da061 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -523,6 +523,14 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public static final int PRIVATE_FLAG_RESIZEABLE_ACTIVITIES = 1 << 11; /** + * Value for {@link #privateFlags}: {@code true} means the OS should go ahead and + * run full-data backup operations for the app even when it is in a + * foreground-equivalent run state. Defaults to {@code false} if unspecified. + * @hide + */ + public static final int PRIVATE_FLAG_BACKUP_IN_FOREGROUND = 1 << 12; + + /** * Private/hidden flags. See {@code PRIVATE_FLAG_...} constants. * {@hide} */ diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index f6ae020c1240..ce6ddfd31d19 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -2669,8 +2669,9 @@ public class PackageParser { if (allowBackup) { ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; - // backupAgent, killAfterRestore, fullBackupContent and restoreAnyVersion are only - // relevant if backup is possible for the given application. + // backupAgent, killAfterRestore, fullBackupContent, backupInForeground, + // and restoreAnyVersion are only relevant if backup is possible for the + // given application. String backupAgent = sa.getNonConfigurationString( com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, Configuration.NATIVE_CONFIG_VERSION); @@ -2696,6 +2697,11 @@ public class PackageParser { false)) { ai.flags |= ApplicationInfo.FLAG_FULL_BACKUP_ONLY; } + if (sa.getBoolean( + com.android.internal.R.styleable.AndroidManifestApplication_backupInForeground, + false)) { + ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND; + } } TypedValue v = sa.peekValue( diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index f91bcd0bdeea..4b81987f353e 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -914,6 +914,17 @@ <p>The default value of this attribute is <code>false</code>. --> <attr name="restoreAnyVersion" format="boolean" /> + <!-- Indicates that full-data backup operations for this application may + be performed even if the application is in a foreground-equivalent + state. <em>Use with caution!</em> Setting this flag to <code>true</code> + can impact app behavior while the user is interacting with the device. + + <p>If unspecified, the default value of this attribute is <code>false</code>, + which means that the OS will avoid backing up the application while it is + running in the foreground (such as a music app that is actively playing + music via a service in the startForeground() state). --> + <attr name="backupInForeground" format="boolean" /> + <!-- The default install location defined by an application. --> <attr name="installLocation"> <!-- Let the system decide ideal install location --> @@ -1247,6 +1258,7 @@ <attr name="killAfterRestore" /> <attr name="restoreNeedsApplication" /> <attr name="restoreAnyVersion" /> + <attr name="backupInForeground" /> <attr name="neverEncrypt" /> <!-- Request that your application's processes be created with a large Dalvik heap. This applies to <em>all</em> processes diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 894fd3721112..13812630a0d1 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2701,6 +2701,7 @@ <public type="attr" name="hotSpotX" /> <public type="attr" name="hotSpotY" /> <public type="attr" name="version" /> + <public type="attr" name="backupInForeground" /> <public type="style" name="Theme.Material.Light.DialogWhenLarge.DarkActionBar" /> <public type="style" name="Widget.Material.SeekBar.Discrete" /> diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index a4fc2ecdc520..e32d89c0d36a 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -16,6 +16,8 @@ package com.android.server.backup; +import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND; + import android.app.ActivityManagerNative; import android.app.AlarmManager; import android.app.AppGlobals; @@ -4929,7 +4931,9 @@ public class BackupManagerService { continue; } - headBusy = mActivityManager.isAppForeground(appInfo.applicationInfo.uid); + final int privFlags = appInfo.applicationInfo.privateFlags; + headBusy = (privFlags & PRIVATE_FLAG_BACKUP_IN_FOREGROUND) == 0 + && mActivityManager.isAppForeground(appInfo.applicationInfo.uid); if (headBusy) { final long nextEligible = System.currentTimeMillis() |