Eliminate dependencies on Checkin, replacing checkin events with EventLog
events (and in one case, a DropBox entry).
Add a simple intent that triggers master-clear (and toggle EFS), given the
right permissions.
Bug: 2264596
Bug: 2350452
Bug: 2264596
diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java
index f435ebc..dc41ff9 100644
--- a/services/java/com/android/server/BatteryService.java
+++ b/services/java/com/android/server/BatteryService.java
@@ -27,11 +27,11 @@
import android.os.BatteryManager;
import android.os.Binder;
import android.os.IBinder;
+import android.os.DropBoxManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UEventObserver;
-import android.provider.Checkin;
import android.provider.Settings;
import android.util.EventLog;
import android.util.Log;
@@ -363,50 +363,39 @@
}
private final void logBatteryStats() {
-
IBinder batteryInfoService = ServiceManager.getService(BATTERY_STATS_SERVICE_NAME);
- if (batteryInfoService != null) {
- byte[] buffer = new byte[DUMP_MAX_LENGTH];
- File dumpFile = null;
- FileOutputStream dumpStream = null;
- try {
- // dump the service to a file
- dumpFile = new File(DUMPSYS_DATA_PATH + BATTERY_STATS_SERVICE_NAME + ".dump");
- dumpStream = new FileOutputStream(dumpFile);
- batteryInfoService.dump(dumpStream.getFD(), DUMPSYS_ARGS);
- dumpStream.getFD().sync();
+ if (batteryInfoService == null) return;
- // read dumped file above into buffer truncated to DUMP_MAX_LENGTH
- // and insert into events table.
- int length = (int) Math.min(dumpFile.length(), DUMP_MAX_LENGTH);
- FileInputStream fileInputStream = new FileInputStream(dumpFile);
- int nread = fileInputStream.read(buffer, 0, length);
- if (nread > 0) {
- Checkin.logEvent(mContext.getContentResolver(),
- Checkin.Events.Tag.BATTERY_DISCHARGE_INFO,
- new String(buffer, 0, nread));
- if (LOCAL_LOGV) Log.v(TAG, "dumped " + nread + "b from " +
- batteryInfoService + "to log");
- if (LOCAL_LOGV) Log.v(TAG, "actual dump:" + new String(buffer, 0, nread));
+ DropBoxManager db = (DropBoxManager) mContext.getSystemService(Context.DROPBOX_SERVICE);
+ if (db == null || !db.isTagEnabled("BATTERY_DISCHARGE_INFO")) return;
+
+ File dumpFile = null;
+ FileOutputStream dumpStream = null;
+ try {
+ // dump the service to a file
+ dumpFile = new File(DUMPSYS_DATA_PATH + BATTERY_STATS_SERVICE_NAME + ".dump");
+ dumpStream = new FileOutputStream(dumpFile);
+ batteryInfoService.dump(dumpStream.getFD(), DUMPSYS_ARGS);
+ dumpStream.getFD().sync();
+
+ // add dump file to drop box
+ db.addFile("BATTERY_DISCHARGE_INFO", dumpFile, DropBoxManager.IS_TEXT);
+ } catch (RemoteException e) {
+ Log.e(TAG, "failed to dump battery service", e);
+ } catch (IOException e) {
+ Log.e(TAG, "failed to write dumpsys file", e);
+ } finally {
+ // make sure we clean up
+ if (dumpStream != null) {
+ try {
+ dumpStream.close();
+ } catch (IOException e) {
+ Log.e(TAG, "failed to close dumpsys output stream");
}
- } catch (RemoteException e) {
- Log.e(TAG, "failed to dump service '" + BATTERY_STATS_SERVICE_NAME +
- "':" + e);
- } catch (IOException e) {
- Log.e(TAG, "failed to write dumpsys file: " + e);
- } finally {
- // make sure we clean up
- if (dumpStream != null) {
- try {
- dumpStream.close();
- } catch (IOException e) {
- Log.e(TAG, "failed to close dumpsys output stream");
- }
- }
- if (dumpFile != null && !dumpFile.delete()) {
- Log.e(TAG, "failed to delete temporary dumpsys file: "
- + dumpFile.getAbsolutePath());
- }
+ }
+ if (dumpFile != null && !dumpFile.delete()) {
+ Log.e(TAG, "failed to delete temporary dumpsys file: "
+ + dumpFile.getAbsolutePath());
}
}
}
diff --git a/services/java/com/android/server/FallbackCheckinService.java b/services/java/com/android/server/FallbackCheckinService.java
index fc0ab69..195eb63 100644
--- a/services/java/com/android/server/FallbackCheckinService.java
+++ b/services/java/com/android/server/FallbackCheckinService.java
@@ -39,40 +39,6 @@
mContext = context;
}
- public void masterClear() {
- if (mContext.checkCallingOrSelfPermission("android.permission.MASTER_CLEAR") !=
- PackageManager.PERMISSION_GRANTED) {
- Log.e(TAG, "Permission Denial: can't invoke masterClear from "
- + "pid=" + Binder.getCallingPid() + ", "
- + "uid=" + Binder.getCallingUid());
- return;
- }
-
- // Save the android ID so the new system can get it erased.
- try {
- RecoverySystem.rebootWipeUserData(mContext);
- } catch (IOException e) {
- Log.e(TAG, "Reboot for masterClear() failed", e);
- }
- }
-
- public void masterClearAndToggleEFS(boolean efsEnabled) {
- if (mContext.checkCallingOrSelfPermission("android.permission.MASTER_CLEAR") !=
- PackageManager.PERMISSION_GRANTED) {
- Log.e(TAG, "Permission Denial: can't invoke masterClearAndToggleEFS from "
- + "pid=" + Binder.getCallingPid() + ", "
- + "uid=" + Binder.getCallingUid());
- return;
- }
-
- // Save the android ID so the new system can get it erased.
- try {
- RecoverySystem.rebootToggleEFS(mContext, efsEnabled);
- } catch (IOException e) {
- Log.e(TAG, "Reboot for toggle EFS failed", e);
- }
- }
-
public void getParentalControlState(IParentalControlCallback p, String requestingApp)
throws android.os.RemoteException {
ParentalControlState state = new ParentalControlState();
diff --git a/services/java/com/android/server/MasterClearReceiver.java b/services/java/com/android/server/MasterClearReceiver.java
index 3c366da..ab0eb81 100644
--- a/services/java/com/android/server/MasterClearReceiver.java
+++ b/services/java/com/android/server/MasterClearReceiver.java
@@ -16,16 +16,15 @@
package com.android.server;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.BroadcastReceiver;
-import android.os.RemoteException;
-import android.os.ICheckinService;
-import android.os.ServiceManager;
+import android.os.RecoverySystem;
import android.util.Log;
-public class MasterClearReceiver extends BroadcastReceiver {
+import java.io.IOException;
+public class MasterClearReceiver extends BroadcastReceiver {
private static final String TAG = "MasterClear";
@Override
@@ -36,18 +35,17 @@
return;
}
}
- Log.w(TAG, "!!! FACTORY RESETTING DEVICE !!!");
- ICheckinService service =
- ICheckinService.Stub.asInterface(
- ServiceManager.getService("checkin"));
- if (service != null) {
- try {
- // This RPC should never return.
- service.masterClear();
- } catch (RemoteException e) {
- Log.w("MasterClear",
- "Unable to invoke ICheckinService.masterClear()");
+
+ try {
+ Log.w(TAG, "!!! FACTORY RESET !!!");
+ if (intent.hasExtra("enableEFS")) {
+ RecoverySystem.rebootToggleEFS(context, intent.getBooleanExtra("enableEFS", false));
+ } else {
+ RecoverySystem.rebootWipeUserData(context);
}
+ Log.wtf(TAG, "Still running after master clear?!");
+ } catch (IOException e) {
+ Log.e(TAG, "Can't perform master clear/factory reset", e);
}
}
}
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 87ed252..d0f6a7c 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -92,7 +92,6 @@
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.SystemProperties;
-import android.provider.Checkin;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Config;
@@ -966,7 +965,6 @@
static final int IM_FEELING_LUCKY_MSG = 15;
static final int LAUNCH_TIMEOUT_MSG = 16;
static final int DESTROY_TIMEOUT_MSG = 17;
- static final int SERVICE_ERROR_MSG = 18;
static final int RESUME_TOP_ACTIVITY_MSG = 19;
static final int PROC_START_TIMEOUT_MSG = 20;
static final int DO_PENDING_ACTIVITY_LAUNCHES_MSG = 21;
@@ -1161,13 +1159,6 @@
}
}
} break;
- case SERVICE_ERROR_MSG: {
- ServiceRecord srv = (ServiceRecord)msg.obj;
- // This needs to be *un*synchronized to avoid deadlock.
- Checkin.logEvent(mContext.getContentResolver(),
- Checkin.Events.Tag.SYSTEM_SERVICE_LOOPING,
- srv.name.toShortString());
- } break;
case RESUME_TOP_ACTIVITY_MSG: {
synchronized (ActivityManagerService.this) {
resumeTopActivityLocked(null);
@@ -10767,11 +10758,6 @@
EventLog.writeEvent(EventLogTags.AM_SCHEDULE_SERVICE_RESTART,
r.shortName, r.restartDelay);
- Message msg = Message.obtain();
- msg.what = SERVICE_ERROR_MSG;
- msg.obj = r;
- mHandler.sendMessage(msg);
-
return canceled;
}