@@ -197,14 +197,14 @@ class BackupManagerService extends IBackupManager.Stub {
197197 = new SparseArray <HashSet <ApplicationInfo >>();
198198 // set of backup services that have pending changes
199199 class BackupRequest {
200- public ApplicationInfo appInfo ;
200+ public String packageName ;
201201
202- BackupRequest (ApplicationInfo app ) {
203- appInfo = app ;
202+ BackupRequest (String pkgName ) {
203+ packageName = pkgName ;
204204 }
205205
206206 public String toString () {
207- return "BackupRequest{app =" + appInfo + "}" ;
207+ return "BackupRequest{pkg =" + packageName + "}" ;
208208 }
209209 }
210210 // Backups that we haven't started yet. Keys are package names.
@@ -877,6 +877,7 @@ private void initPackageTracking() {
877877 IntentFilter filter = new IntentFilter ();
878878 filter .addAction (Intent .ACTION_PACKAGE_ADDED );
879879 filter .addAction (Intent .ACTION_PACKAGE_REMOVED );
880+ filter .addAction (Intent .ACTION_PACKAGE_REPLACED );
880881 filter .addDataScheme ("package" );
881882 mContext .registerReceiver (mBroadcastReceiver , filter );
882883 // Register for events related to sdcard installation.
@@ -1174,7 +1175,8 @@ public void onReceive(Context context, Intent intent) {
11741175 Bundle extras = intent .getExtras ();
11751176 String pkgList [] = null ;
11761177 if (Intent .ACTION_PACKAGE_ADDED .equals (action ) ||
1177- Intent .ACTION_PACKAGE_REMOVED .equals (action )) {
1178+ Intent .ACTION_PACKAGE_REMOVED .equals (action ) ||
1179+ Intent .ACTION_PACKAGE_REPLACED .equals (action )) {
11781180 Uri uri = intent .getData ();
11791181 if (uri == null ) {
11801182 return ;
@@ -1183,15 +1185,22 @@ public void onReceive(Context context, Intent intent) {
11831185 if (pkgName != null ) {
11841186 pkgList = new String [] { pkgName };
11851187 }
1186- added = Intent .ACTION_PACKAGE_ADDED .equals (action );
1187- replacing = extras .getBoolean (Intent .EXTRA_REPLACING , false );
1188+ if (Intent .ACTION_PACKAGE_REPLACED .equals (action )) {
1189+ // use the existing "add with replacement" logic
1190+ if (MORE_DEBUG ) Slog .d (TAG , "PACKAGE_REPLACED, updating package " + pkgName );
1191+ added = replacing = true ;
1192+ } else {
1193+ added = Intent .ACTION_PACKAGE_ADDED .equals (action );
1194+ replacing = extras .getBoolean (Intent .EXTRA_REPLACING , false );
1195+ }
11881196 } else if (Intent .ACTION_EXTERNAL_APPLICATIONS_AVAILABLE .equals (action )) {
11891197 added = true ;
11901198 pkgList = intent .getStringArrayExtra (Intent .EXTRA_CHANGED_PACKAGE_LIST );
11911199 } else if (Intent .ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE .equals (action )) {
11921200 added = false ;
11931201 pkgList = intent .getStringArrayExtra (Intent .EXTRA_CHANGED_PACKAGE_LIST );
11941202 }
1203+
11951204 if (pkgList == null || pkgList .length == 0 ) {
11961205 return ;
11971206 }
@@ -1665,9 +1674,7 @@ public void run() {
16651674 if (status == BackupConstants .TRANSPORT_OK ) {
16661675 PackageManagerBackupAgent pmAgent = new PackageManagerBackupAgent (
16671676 mPackageManager , allAgentPackages ());
1668- BackupRequest pmRequest = new BackupRequest (new ApplicationInfo ());
1669- pmRequest .appInfo .packageName = PACKAGE_MANAGER_SENTINEL ;
1670- status = processOneBackup (pmRequest ,
1677+ status = processOneBackup (PACKAGE_MANAGER_SENTINEL ,
16711678 IBackupAgent .Stub .asInterface (pmAgent .onBind ()), mTransport );
16721679 }
16731680
@@ -1716,7 +1723,7 @@ public void run() {
17161723 if (status != BackupConstants .TRANSPORT_OK ) {
17171724 Slog .w (TAG , "Backup pass unsuccessful, restaging" );
17181725 for (BackupRequest req : mQueue ) {
1719- dataChangedImpl (req .appInfo . packageName );
1726+ dataChangedImpl (req .packageName );
17201727 }
17211728
17221729 // We also want to reset the backup schedule based on whatever
@@ -1750,29 +1757,31 @@ private int doQueuedBackups(IBackupTransport transport) {
17501757 // Verify that the requested app exists; it might be something that
17511758 // requested a backup but was then uninstalled. The request was
17521759 // journalled and rather than tamper with the journal it's safer
1753- // to sanity-check here.
1760+ // to sanity-check here. This also gives us the classname of the
1761+ // package's backup agent.
1762+ PackageInfo pkg ;
17541763 try {
1755- mPackageManager .getPackageInfo (request . appInfo .packageName , 0 );
1764+ pkg = mPackageManager .getPackageInfo (request .packageName , 0 );
17561765 } catch (NameNotFoundException e ) {
17571766 Slog .d (TAG , "Package does not exist; skipping" );
17581767 continue ;
17591768 }
17601769
17611770 IBackupAgent agent = null ;
17621771 try {
1763- mWakelock .setWorkSource (new WorkSource (request . appInfo .uid ));
1764- agent = bindToAgentSynchronous (request . appInfo ,
1772+ mWakelock .setWorkSource (new WorkSource (pkg . applicationInfo .uid ));
1773+ agent = bindToAgentSynchronous (pkg . applicationInfo ,
17651774 IApplicationThread .BACKUP_MODE_INCREMENTAL );
17661775 if (agent != null ) {
1767- int result = processOneBackup (request , agent , transport );
1776+ int result = processOneBackup (request . packageName , agent , transport );
17681777 if (result != BackupConstants .TRANSPORT_OK ) return result ;
17691778 }
17701779 } catch (SecurityException ex ) {
17711780 // Try for the next one.
17721781 Slog .d (TAG , "error in bind/backup" , ex );
17731782 } finally {
17741783 try { // unbind even on timeout, just in case
1775- mActivityManager .unbindBackupAgent (request . appInfo );
1784+ mActivityManager .unbindBackupAgent (pkg . applicationInfo );
17761785 } catch (RemoteException e ) {}
17771786 }
17781787 }
@@ -1782,9 +1791,8 @@ private int doQueuedBackups(IBackupTransport transport) {
17821791 return BackupConstants .TRANSPORT_OK ;
17831792 }
17841793
1785- private int processOneBackup (BackupRequest request , IBackupAgent agent ,
1794+ private int processOneBackup (String packageName , IBackupAgent agent ,
17861795 IBackupTransport transport ) {
1787- final String packageName = request .appInfo .packageName ;
17881796 if (DEBUG ) Slog .d (TAG , "processOneBackup doBackup() on " + packageName );
17891797
17901798 File savedStateName = new File (mStateDir , packageName );
@@ -4207,7 +4215,7 @@ private void dataChangedImpl(String packageName, HashSet<ApplicationInfo> target
42074215 if (app .packageName .equals (packageName )) {
42084216 // Add the caller to the set of pending backups. If there is
42094217 // one already there, then overwrite it, but no harm done.
4210- BackupRequest req = new BackupRequest (app );
4218+ BackupRequest req = new BackupRequest (packageName );
42114219 if (mPendingBackups .put (app .packageName , req ) == null ) {
42124220 // Journal this request in case of crash. The put()
42134221 // operation returned null when this package was not already
@@ -4218,7 +4226,7 @@ private void dataChangedImpl(String packageName, HashSet<ApplicationInfo> target
42184226 int numKeys = mPendingBackups .size ();
42194227 Slog .d (TAG , "Now awaiting backup for " + numKeys + " participants:" );
42204228 for (BackupRequest b : mPendingBackups .values ()) {
4221- Slog .d (TAG , " + " + b + " agent=" + b . appInfo . backupAgentName );
4229+ Slog .d (TAG , " + " + b );
42224230 }
42234231 }
42244232 }
0 commit comments