diff options
author | 2025-02-04 17:05:38 -0800 | |
---|---|---|
committer | 2025-02-14 12:00:01 -0800 | |
commit | 8f647896aaacbd34fc313daa6f9d8a2a7f1b5cb0 (patch) | |
tree | eb4a2890714043c3fb443f57edf9e34bb9c12d74 | |
parent | c74e868be41ae32884d6e53a30d0f35aa48cd388 (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
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); + } } |