Merge commit '9073dc69b110cbd0d4bebd128ed6cc2b24a16695' * commit '9073dc69b110cbd0d4bebd128ed6cc2b24a16695': Expand apps' control over the settings restore process
This commit is contained in:
@@ -1118,6 +1118,15 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
|
||||
mi.writeToParcel(reply, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
case KILL_APPLICATION_PROCESS_TRANSACTION: {
|
||||
data.enforceInterface(IActivityManager.descriptor);
|
||||
String processName = data.readString();
|
||||
int uid = data.readInt();
|
||||
killApplicationProcess(processName, uid);
|
||||
reply.writeNoException();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return super.onTransact(code, data, reply, flags);
|
||||
@@ -2448,6 +2457,18 @@ class ActivityManagerProxy implements IActivityManager
|
||||
data.recycle();
|
||||
reply.recycle();
|
||||
}
|
||||
|
||||
|
||||
public void killApplicationProcess(String processName, int uid) throws RemoteException {
|
||||
Parcel data = Parcel.obtain();
|
||||
Parcel reply = Parcel.obtain();
|
||||
data.writeInterfaceToken(IActivityManager.descriptor);
|
||||
data.writeString(processName);
|
||||
data.writeInt(uid);
|
||||
mRemote.transact(KILL_APPLICATION_PROCESS_TRANSACTION, data, reply, 0);
|
||||
reply.readException();
|
||||
data.recycle();
|
||||
reply.recycle();
|
||||
}
|
||||
|
||||
private IBinder mRemote;
|
||||
}
|
||||
|
||||
@@ -1463,6 +1463,10 @@ public final class ActivityThread {
|
||||
queueOrSendMessage(H.EXIT_APPLICATION, null);
|
||||
}
|
||||
|
||||
public final void scheduleSuicide() {
|
||||
queueOrSendMessage(H.SUICIDE, null);
|
||||
}
|
||||
|
||||
public void requestThumbnail(IBinder token) {
|
||||
queueOrSendMessage(H.REQUEST_THUMBNAIL, token);
|
||||
}
|
||||
@@ -1752,7 +1756,8 @@ public final class ActivityThread {
|
||||
public static final int RELAUNCH_ACTIVITY = 126;
|
||||
public static final int PROFILER_CONTROL = 127;
|
||||
public static final int CREATE_BACKUP_AGENT = 128;
|
||||
public static final int DESTROY_BACKUP_AGENT = 129;
|
||||
public static final int DESTROY_BACKUP_AGENT = 129;
|
||||
public static final int SUICIDE = 130;
|
||||
String codeToString(int code) {
|
||||
if (localLOGV) {
|
||||
switch (code) {
|
||||
@@ -1786,6 +1791,7 @@ public final class ActivityThread {
|
||||
case PROFILER_CONTROL: return "PROFILER_CONTROL";
|
||||
case CREATE_BACKUP_AGENT: return "CREATE_BACKUP_AGENT";
|
||||
case DESTROY_BACKUP_AGENT: return "DESTROY_BACKUP_AGENT";
|
||||
case SUICIDE: return "SUICIDE";
|
||||
}
|
||||
}
|
||||
return "(unknown)";
|
||||
@@ -1894,6 +1900,11 @@ public final class ActivityThread {
|
||||
case DESTROY_BACKUP_AGENT:
|
||||
handleDestroyBackupAgent((CreateBackupAgentData)msg.obj);
|
||||
break;
|
||||
case SUICIDE:
|
||||
{
|
||||
Process.killProcess(Process.myPid());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -258,6 +258,13 @@ public abstract class ApplicationThreadNative extends Binder
|
||||
return true;
|
||||
}
|
||||
|
||||
case SCHEDULE_SUICIDE_TRANSACTION:
|
||||
{
|
||||
data.enforceInterface(IApplicationThread.descriptor);
|
||||
scheduleSuicide();
|
||||
return true;
|
||||
}
|
||||
|
||||
case REQUEST_THUMBNAIL_TRANSACTION:
|
||||
{
|
||||
data.enforceInterface(IApplicationThread.descriptor);
|
||||
@@ -652,7 +659,15 @@ class ApplicationThreadProxy implements IApplicationThread {
|
||||
IBinder.FLAG_ONEWAY);
|
||||
data.recycle();
|
||||
}
|
||||
|
||||
|
||||
public final void scheduleSuicide() throws RemoteException {
|
||||
Parcel data = Parcel.obtain();
|
||||
data.writeInterfaceToken(IApplicationThread.descriptor);
|
||||
mRemote.transact(SCHEDULE_SUICIDE_TRANSACTION, data, null,
|
||||
IBinder.FLAG_ONEWAY);
|
||||
data.recycle();
|
||||
}
|
||||
|
||||
public final void requestThumbnail(IBinder token)
|
||||
throws RemoteException {
|
||||
Parcel data = Parcel.obtain();
|
||||
|
||||
@@ -158,6 +158,7 @@ public interface IActivityManager extends IInterface {
|
||||
throws RemoteException;
|
||||
public void backupAgentCreated(String packageName, IBinder agent) throws RemoteException;
|
||||
public void unbindBackupAgent(ApplicationInfo appInfo) throws RemoteException;
|
||||
public void killApplicationProcess(String processName, int uid) throws RemoteException;
|
||||
|
||||
public boolean startInstrumentation(ComponentName className, String profileFile,
|
||||
int flags, Bundle arguments, IInstrumentationWatcher watcher)
|
||||
@@ -433,4 +434,5 @@ public interface IActivityManager extends IInterface {
|
||||
int KILL_APPLICATION_WITH_UID_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+95;
|
||||
int CLOSE_SYSTEM_DIALOGS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+96;
|
||||
int GET_PROCESS_MEMORY_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+97;
|
||||
int KILL_APPLICATION_PROCESS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+98;
|
||||
}
|
||||
|
||||
@@ -83,6 +83,7 @@ public interface IApplicationThread extends IInterface {
|
||||
IInstrumentationWatcher testWatcher, int debugMode, boolean restrictedBackupMode,
|
||||
Configuration config, Map<String, IBinder> services) throws RemoteException;
|
||||
void scheduleExit() throws RemoteException;
|
||||
void scheduleSuicide() throws RemoteException;
|
||||
void requestThumbnail(IBinder token) throws RemoteException;
|
||||
void scheduleConfigurationChanged(Configuration config) throws RemoteException;
|
||||
void updateTimeZone() throws RemoteException;
|
||||
@@ -133,4 +134,5 @@ public interface IApplicationThread extends IInterface {
|
||||
int SCHEDULE_CREATE_BACKUP_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+29;
|
||||
int SCHEDULE_DESTROY_BACKUP_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+30;
|
||||
int GET_MEMORY_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+31;
|
||||
int SCHEDULE_SUICIDE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+32;
|
||||
}
|
||||
|
||||
@@ -184,7 +184,29 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
|
||||
* {@hide}
|
||||
*/
|
||||
public static final int FLAG_ALLOW_BACKUP = 1<<14;
|
||||
|
||||
|
||||
/**
|
||||
* Value for {@link #flags}: this is false if the application has set
|
||||
* its android:killAfterRestore to false, true otherwise.
|
||||
*
|
||||
* <p>If android:allowBackup is set to false or no android:backupAgent
|
||||
* is specified, this flag will be ignored.
|
||||
*
|
||||
* {@hide}
|
||||
*/
|
||||
public static final int FLAG_KILL_AFTER_RESTORE = 1<<15;
|
||||
|
||||
/**
|
||||
* Value for {@link #flags}: this is true if the application has set
|
||||
* its android:restoreNeedsApplication to true, false otherwise.
|
||||
*
|
||||
* <p>If android:allowBackup is set to false or no android:backupAgent
|
||||
* is specified, this flag will be ignored.
|
||||
*
|
||||
* {@hide}
|
||||
*/
|
||||
public static final int FLAG_RESTORE_NEEDS_APPLICATION = 1<<16;
|
||||
|
||||
/**
|
||||
* Flags associated with the application. Any combination of
|
||||
* {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE},
|
||||
@@ -193,7 +215,8 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
|
||||
* {@link #FLAG_ALLOW_CLEAR_USER_DATA}, {@link #FLAG_UPDATED_SYSTEM_APP},
|
||||
* {@link #FLAG_TEST_ONLY}, {@link #FLAG_SUPPORTS_SMALL_SCREENS},
|
||||
* {@link #FLAG_SUPPORTS_NORMAL_SCREENS},
|
||||
* {@link #FLAG_SUPPORTS_LARGE_SCREENS}, {@link #FLAG_RESIZEABLE_FOR_SCREENS}.
|
||||
* {@link #FLAG_SUPPORTS_LARGE_SCREENS}, {@link #FLAG_RESIZEABLE_FOR_SCREENS},
|
||||
* {@link #FLAG_SUPPORTS_SCREEN_DENSITIES}.
|
||||
*/
|
||||
public int flags = 0;
|
||||
|
||||
|
||||
@@ -1296,12 +1296,26 @@ public class PackageParser {
|
||||
com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true);
|
||||
if (allowBackup) {
|
||||
ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
|
||||
|
||||
// backupAgent, killAfterRestore, and restoreNeedsApplication are only relevant
|
||||
// if backup is possible for the given application.
|
||||
String backupAgent = sa.getNonResourceString(
|
||||
com.android.internal.R.styleable.AndroidManifestApplication_backupAgent);
|
||||
if (backupAgent != null) {
|
||||
ai.backupAgentName = buildClassName(pkgName, backupAgent, outError);
|
||||
Log.v(TAG, "android:backupAgent = " + ai.backupAgentName
|
||||
+ " from " + pkgName + "+" + backupAgent);
|
||||
|
||||
if (sa.getBoolean(
|
||||
com.android.internal.R.styleable.AndroidManifestApplication_killAfterRestore,
|
||||
true)) {
|
||||
ai.flags |= ApplicationInfo.FLAG_KILL_AFTER_RESTORE;
|
||||
}
|
||||
if (sa.getBoolean(
|
||||
com.android.internal.R.styleable.AndroidManifestApplication_restoreNeedsApplication,
|
||||
false)) {
|
||||
ai.flags |= ApplicationInfo.FLAG_RESTORE_NEEDS_APPLICATION;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user