summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Felipe Leme <felipeal@google.com> 2025-02-04 17:05:38 -0800
committer Felipe Leme <felipeal@google.com> 2025-02-14 12:00:01 -0800
commit8f647896aaacbd34fc313daa6f9d8a2a7f1b5cb0 (patch)
treeeb4a2890714043c3fb443f57edf9e34bb9c12d74
parentc74e868be41ae32884d6e53a30d0f35aa48cd388 (diff)
Improved logging and dump() on LocalTransport.
- Implemented LocalTransportService.dump() - Implemented some missing toString() methods - Added some extra logging statements You can check it by running the following command in one terminal: some examples on how to use it: $ watch -n 1 '(adb shell dumpsys activity service com.android.localtransport/.LocalTransportService | tee -a ~/tmp/dumpsys.log)' Then in another: $ adb shell 'settings put secure backup_local_transport_parameters "log_agent_results=true"' $ adb shell bmgr backupnow android $ adb shell bmgr run Test: m -j LocalTransport && adb install $OUT/system/priv-app/LocalTransport/LocalTransport.apk # then commands above Bug: 394173116 Flag: EXEMPT changes on debugging components only Change-Id: I11d239f9b2a70de8f94ff7f9f6df0be79fc69d36
-rw-r--r--packages/LocalTransport/src/com/android/localtransport/LocalTransport.java131
-rw-r--r--packages/LocalTransport/src/com/android/localtransport/LocalTransportParameters.java31
-rw-r--r--packages/LocalTransport/src/com/android/localtransport/LocalTransportService.java31
3 files changed, 175 insertions, 18 deletions
diff --git a/packages/LocalTransport/src/com/android/localtransport/LocalTransport.java b/packages/LocalTransport/src/com/android/localtransport/LocalTransport.java
index 1af3bc898306..79c9de49ea4c 100644
--- a/packages/LocalTransport/src/com/android/localtransport/LocalTransport.java
+++ b/packages/LocalTransport/src/com/android/localtransport/LocalTransport.java
@@ -39,6 +39,7 @@ import android.system.Os;
import android.system.StructStat;
import android.util.ArrayMap;
import android.util.Base64;
+import android.util.Dumpable;
import android.util.Log;
import com.android.tools.r8.keepanno.annotations.KeepTarget;
@@ -52,18 +53,24 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* Backup transport for stashing stuff into a known location on disk, and
* later restoring from there. For testing only.
+ *
+ * <p>Note: the quickest way to build and sync this class is:
+ * {@code m LocalTransport && adb install $OUT/system/priv-app/LocalTransport/LocalTransport.apk}
*/
public class LocalTransport extends BackupTransport {
- private static final String TAG = "LocalTransport";
- private static final boolean DEBUG = false;
+ static final String TAG = "LocalTransport";
+ static final boolean DEBUG = false;
private static final String TRANSPORT_DIR_NAME
= "com.android.localtransport.LocalTransport";
@@ -124,6 +131,7 @@ public class LocalTransport extends BackupTransport {
}
public LocalTransport(Context context, LocalTransportParameters parameters) {
+ Log.i(TAG, "Creating LocalTransport for user " + context.getUserId());
mContext = context;
mParameters = parameters;
makeDataDirs();
@@ -910,25 +918,70 @@ public class LocalTransport extends BackupTransport {
return mMonitor;
}
- private class TestBackupManagerMonitor extends BackupManagerMonitor {
+ private class TestBackupManagerMonitor extends BackupManagerMonitor implements Dumpable {
+
+ private final List<DataTypeResult> mReceivedResults = new ArrayList<>();
+ private int mNumberReceivedEvents;
+
@Override
public void onEvent(Bundle event) {
- if (event == null || !mParameters.logAgentResults()) {
+ if (event == null) {
+ if (DEBUG) {
+ Log.w(TAG, "onEvent() called with null");
+ }
return;
}
-
- if (event.getInt(BackupManagerMonitor.EXTRA_LOG_EVENT_ID)
- == BackupManagerMonitor.LOG_EVENT_ID_AGENT_LOGGING_RESULTS) {
+ int eventId = event.getInt(BackupManagerMonitor.EXTRA_LOG_EVENT_ID);
+ if (eventId != BackupManagerMonitor.LOG_EVENT_ID_AGENT_LOGGING_RESULTS) {
+ if (DEBUG) Log.v(TAG, "ignoring event with id " + eventId);
+ return;
+ }
+ mNumberReceivedEvents++;
+ boolean logResults = mParameters.logAgentResults();
+ ArrayList<DataTypeResult> results = event.getParcelableArrayList(
+ BackupManagerMonitor.EXTRA_LOG_AGENT_LOGGING_RESULTS,
+ DataTypeResult.class);
+ int size = results.size();
+ if (size == 0) {
+ if (logResults) {
+ Log.i(TAG, "no agent_logging_results on event #" + mNumberReceivedEvents);
+ }
+ return;
+ }
+ if (logResults) {
Log.i(TAG, "agent_logging_results {");
- ArrayList<DataTypeResult> results = event.getParcelableArrayList(
- BackupManagerMonitor.EXTRA_LOG_AGENT_LOGGING_RESULTS,
- DataTypeResult.class);
- for (DataTypeResult result : results) {
+ }
+ for (int i = 0; i < size; i++) {
+ var result = results.get(i);
+ mReceivedResults.add(result);
+ if (logResults) {
Log.i(TAG, "\t" + BackupRestoreEventLogger.toString(result));
}
+ }
+ if (logResults) {
Log.i(TAG, "}");
}
}
+
+ @Override
+ public void dump(PrintWriter pw, String[] args) {
+ pw.println("TestBackupManagerMonitor");
+ pw.printf("%d events received", mNumberReceivedEvents);
+ if (mNumberReceivedEvents == 0) {
+ pw.println();
+ return;
+ }
+ int size = mReceivedResults.size();
+ if (size == 0) {
+ pw.println("; no results on them");
+ return;
+ }
+ pw.printf("; %d results on them:\n", size);
+ for (int i = 0; i < size; i++) {
+ DataTypeResult result = mReceivedResults.get(i);
+ pw.printf(" #%d: %s\n", i, BackupRestoreEventLogger.toString(result));
+ }
+ }
}
@NonNull
@@ -941,4 +994,60 @@ public class LocalTransport extends BackupTransport {
}
return mParameters.noRestrictedModePackages();
}
+
+ @Override
+ public String toString() {
+ try {
+ try (StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) {
+ dump(pw, /* args= */ null);
+ pw.flush();
+ return sw.toString();
+ }
+ } catch (IOException e) {
+ // Shouldn't happen...
+ Log.e(TAG, "toString(): failed to dump", e);
+ return super.toString();
+ }
+ }
+
+ void dump(PrintWriter pw, String[] args) {
+ pw.printf("mDataDir: %s\n", mDataDir);
+ pw.printf("mCurrentSetDir: %s\n", mCurrentSetDir);
+ pw.printf("mCurrentSetIncrementalDir: %s\n", mCurrentSetIncrementalDir);
+ pw.printf("mCurrentSetFullDir: %s\n", mCurrentSetFullDir);
+
+ pw.printf("mRestorePackages: %s\n", Arrays.toString(mRestorePackages));
+ pw.printf("mRestorePackage: %d\n", mRestorePackage);
+ pw.printf("mRestoreType: %d\n", mRestoreType);
+ pw.printf("mRestoreSetDir: %s\n", mRestoreSetDir);
+ pw.printf("mRestoreSetIncrementalDir: %s\n", mRestoreSetIncrementalDir);
+ pw.printf("mRestoreSetFullDir: %s\n", mRestoreSetFullDir);
+
+ pw.printf("mFullTargetPackage: %s\n", mFullTargetPackage);
+ pw.printf("mSocket: %s\n", mSocket);
+ pw.printf("mSocketInputStream: %s\n", mSocketInputStream);
+ pw.printf("mFullBackupOutputStream: %s\n", mFullBackupOutputStream);
+ dumpByteArray(pw, "mFullBackupBuffer", mFullBackupBuffer);
+ pw.printf("mFullBackupSize: %d\n", mFullBackupSize);
+
+ pw.printf("mCurFullRestoreStream: %s\n", mCurFullRestoreStream);
+ dumpByteArray(pw, "mFullRestoreBuffer", mFullRestoreBuffer);
+ if (mParameters == null) {
+ pw.println("No LocalTransportParameters");
+ } else {
+ pw.println(mParameters);
+ }
+ if (mMonitor instanceof Dumpable) {
+ ((Dumpable) mMonitor).dump(pw, args);
+ }
+
+ pw.printf("currentDestinationString(): %s\n", currentDestinationString());
+ pw.printf("dataManagementIntent(): %s\n", dataManagementIntent());
+ pw.printf("dataManagementIntentLabel(): %s\n", dataManagementIntentLabel());
+ pw.printf("transportDirName(): %s\n", transportDirName());
+ }
+
+ private void dumpByteArray(PrintWriter pw, String name, byte[] array) {
+ pw.printf("%s size: %d\n", name, (array == null ? 0 : array.length));
+ }
}
diff --git a/packages/LocalTransport/src/com/android/localtransport/LocalTransportParameters.java b/packages/LocalTransport/src/com/android/localtransport/LocalTransportParameters.java
index c980913f80c6..c7cfc5b4d304 100644
--- a/packages/LocalTransport/src/com/android/localtransport/LocalTransportParameters.java
+++ b/packages/LocalTransport/src/com/android/localtransport/LocalTransportParameters.java
@@ -16,11 +16,15 @@
package com.android.localtransport;
+import static com.android.localtransport.LocalTransport.DEBUG;
+import static com.android.localtransport.LocalTransport.TAG;
+
import android.content.ContentResolver;
import android.os.Handler;
import android.provider.Settings;
import android.util.KeyValueListParser;
import android.util.KeyValueSettingObserver;
+import android.util.Log;
import java.util.Arrays;
import java.util.List;
@@ -76,15 +80,30 @@ public class LocalTransportParameters extends KeyValueSettingObserver {
}
public String getSettingValue(ContentResolver resolver) {
- return Settings.Secure.getString(resolver, SETTING);
+ String value = Settings.Secure.getString(resolver, SETTING);
+ if (DEBUG) {
+ Log.d(TAG, "LocalTransportParameters.getSettingValue(): returning " + value);
+ }
+ return value;
}
public void update(KeyValueListParser parser) {
- mFakeEncryptionFlag = parser.getBoolean(KEY_FAKE_ENCRYPTION_FLAG, false);
- mIsNonIncrementalOnly = parser.getBoolean(KEY_NON_INCREMENTAL_ONLY, false);
- mIsDeviceTransfer = parser.getBoolean(KEY_IS_DEVICE_TRANSFER, false);
- mIsEncrypted = parser.getBoolean(KEY_IS_ENCRYPTED, false);
- mLogAgentResults = parser.getBoolean(KEY_LOG_AGENT_RESULTS, /* def */ false);
+ mFakeEncryptionFlag = parser.getBoolean(KEY_FAKE_ENCRYPTION_FLAG, /* def= */ false);
+ mIsNonIncrementalOnly = parser.getBoolean(KEY_NON_INCREMENTAL_ONLY, /* def= */ false);
+ mIsDeviceTransfer = parser.getBoolean(KEY_IS_DEVICE_TRANSFER, /* def= */ false);
+ mIsEncrypted = parser.getBoolean(KEY_IS_ENCRYPTED, /* def= */ false);
+ mLogAgentResults = parser.getBoolean(KEY_LOG_AGENT_RESULTS, /* def= */ false);
mNoRestrictedModePackages = parser.getString(KEY_NO_RESTRICTED_MODE_PACKAGES, /* def */ "");
}
+
+ @Override
+ public String toString() {
+ return "LocalTransportParameters[mFakeEncryptionFlag=" + mFakeEncryptionFlag
+ + ", mIsNonIncrementalOnly=" + mIsNonIncrementalOnly
+ + ", mIsDeviceTransfer=" + mIsDeviceTransfer
+ + ", mIsEncrypted=" + mIsEncrypted
+ + ", mLogAgentResults=" + mLogAgentResults
+ + ", noRestrictedModePackages()=" + noRestrictedModePackages()
+ + "]";
+ }
}
diff --git a/packages/LocalTransport/src/com/android/localtransport/LocalTransportService.java b/packages/LocalTransport/src/com/android/localtransport/LocalTransportService.java
index ac4f418b68f6..2f6c57a7b207 100644
--- a/packages/LocalTransport/src/com/android/localtransport/LocalTransportService.java
+++ b/packages/LocalTransport/src/com/android/localtransport/LocalTransportService.java
@@ -16,15 +16,28 @@
package com.android.localtransport;
+import static com.android.localtransport.LocalTransport.DEBUG;
+import static com.android.localtransport.LocalTransport.TAG;
+
+import android.annotation.Nullable;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
+import android.util.Log;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
public class LocalTransportService extends Service {
- private static LocalTransport sTransport = null;
+
+ @Nullable
+ private static LocalTransport sTransport;
@Override
public void onCreate() {
+ if (DEBUG) {
+ Log.d(TAG, "LocalTransportService.onCreate()");
+ }
if (sTransport == null) {
LocalTransportParameters parameters =
new LocalTransportParameters(getMainThreadHandler(), getContentResolver());
@@ -35,11 +48,27 @@ public class LocalTransportService extends Service {
@Override
public void onDestroy() {
+ if (DEBUG) {
+ Log.d(TAG, "LocalTransportService.onDestroy()");
+ }
sTransport.getParameters().stop();
}
@Override
public IBinder onBind(Intent intent) {
+ if (DEBUG) {
+ Log.d(TAG, "LocalTransportService.onBind(" + intent + "): parameters="
+ + sTransport.getParameters());
+ }
return sTransport.getBinder();
}
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (sTransport == null) {
+ pw.println("No sTransport");
+ return;
+ }
+ sTransport.dump(pw, args);
+ }
}