From b1a7ffef3a0007b6991b8338460f6aac8cbb11e8 Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Wed, 6 May 2009 18:06:21 -0700 Subject: [PATCH] More backup tests --- api/current.xml | 178 ++++++++++++++++++ .../java/android/backup/BackupDataOutput.java | 44 +++++ .../java/android/backup/FileBackupHelper.java | 68 +++++++ .../backup/SharedPreferencesBackupHelper.java | 40 ++++ core/jni/Android.mk | 3 +- core/jni/AndroidRuntime.cpp | 2 + core/jni/android_backup_FileBackupHelper.cpp | 79 ++++++++ core/jni/android_os_ParcelFileDescriptor.cpp | 31 ++- .../android/server/BackupManagerService.java | 28 ++- tests/backup/Android.mk | 4 +- tests/backup/AndroidManifest.xml | 2 +- .../backuptest/BackupTestActivity.java | 44 +++++ 12 files changed, 502 insertions(+), 21 deletions(-) create mode 100644 core/java/android/backup/BackupDataOutput.java create mode 100644 core/java/android/backup/FileBackupHelper.java create mode 100644 core/java/android/backup/SharedPreferencesBackupHelper.java create mode 100644 core/jni/android_backup_FileBackupHelper.cpp diff --git a/api/current.xml b/api/current.xml index c222d42d58e82..39e9b4d9ad608 100644 --- a/api/current.xml +++ b/api/current.xml @@ -21795,6 +21795,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#include + +namespace android +{ + +static jfieldID s_descriptorField; + +static int +performBackup_native(JNIEnv* env, jstring basePath, + jobject oldSnapshot, jobject newSnapshot, + jobject data, jobjectArray files) +{ + int err; + + // all parameters have already been checked against null + + int oldSnapshotFD = env->GetIntField(oldSnapshot, s_descriptorField); + int newSnapshotFD = env->GetIntField(newSnapshot, s_descriptorField); + int dataFD = env->GetIntField(data, s_descriptorField); + + char const* basePathUTF = env->GetStringUTFChars(basePath, NULL); + const int fileCount = env->GetArrayLength(files); + char const** filesUTF = (char const**)malloc(sizeof(char*)*fileCount); + for (int i=0; iGetStringUTFChars((jstring)env->GetObjectArrayElement(files, i), NULL); + } + + err = back_up_files(oldSnapshotFD, newSnapshotFD, dataFD, basePathUTF, filesUTF, fileCount); + + for (int i=0; iReleaseStringUTFChars((jstring)env->GetObjectArrayElement(files, i), filesUTF[i]); + } + free(filesUTF); + env->ReleaseStringUTFChars(basePath, basePathUTF); + + return err; +} + +static const JNINativeMethod g_methods[] = { + { "performBackup_native", + "(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;" + "Ljava/io/FileDescriptor;[Ljava/lang/String;)I", + (void*)performBackup_native }, +}; + +int register_android_backup_FileBackupHelper(JNIEnv* env) +{ + jclass clazz; + + clazz = env->FindClass("java/io/FileDescriptor"); + LOG_FATAL_IF(clazz == NULL, "Unable to find class java.io.FileDescriptor"); + s_descriptorField = env->GetFieldID(clazz, "descriptor", "I"); + LOG_FATAL_IF(s_descriptorField == NULL, + "Unable to find descriptor field in java.io.FileDescriptor"); + + return AndroidRuntime::registerNativeMethods(env, "android/backup/FileBackupHelper", + g_methods, NELEM(g_methods)); +} + +} diff --git a/core/jni/android_os_ParcelFileDescriptor.cpp b/core/jni/android_os_ParcelFileDescriptor.cpp index 971f87c2969cb..848a57adea4d0 100644 --- a/core/jni/android_os_ParcelFileDescriptor.cpp +++ b/core/jni/android_os_ParcelFileDescriptor.cpp @@ -1,19 +1,18 @@ -/* //device/libs/android_runtime/android_os_ParcelFileDescriptor.cpp -** -** Copyright 2008, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ //#define LOG_NDEBUG 0 diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index 63fc871e8ec96..e582fb15c603c 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -42,7 +42,9 @@ import android.util.SparseArray; import android.backup.IBackupManager; import java.io.File; +import java.io.FileDescriptor; import java.io.FileNotFoundException; +import java.io.PrintWriter; import java.lang.String; import java.util.HashSet; import java.util.List; @@ -51,7 +53,8 @@ class BackupManagerService extends IBackupManager.Stub { private static final String TAG = "BackupManagerService"; private static final boolean DEBUG = true; - private static final long COLLECTION_INTERVAL = 3 * 60 * 1000; + private static final long COLLECTION_INTERVAL = 1000; + //private static final long COLLECTION_INTERVAL = 3 * 60 * 1000; private static final int MSG_RUN_BACKUP = 1; @@ -338,8 +341,11 @@ class BackupManagerService extends IBackupManager.Stub { // Record that we need a backup pass for the caller. Since multiple callers // may share a uid, we need to note all candidates within that uid and schedule // a backup pass for each of them. + + Log.d(TAG, "dataChanged packageName=" + packageName); HashSet targets = mBackupParticipants.get(Binder.getCallingUid()); + Log.d(TAG, "targets=" + targets); if (targets != null) { synchronized (mQueueLock) { // Note that this client has made data changes that need to be backed up @@ -354,6 +360,7 @@ class BackupManagerService extends IBackupManager.Stub { } } + Log.d(TAG, "Scheduling backup for " + mPendingBackups.size() + " participants"); // Schedule a backup pass in a few minutes. As backup-eligible data // keeps changing, continue to defer the backup pass until things // settle down, to avoid extra overhead. @@ -380,4 +387,23 @@ class BackupManagerService extends IBackupManager.Stub { } } } + + + @Override + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + synchronized (mQueueLock) { + int N = mBackupParticipants.size(); + pw.println("Participants:"); + for (int i=0; i services = mBackupParticipants.valueAt(i); + for (ServiceInfo s: services) { + pw.print(" "); + pw.println(s.toString()); + } + } + } + } } diff --git a/tests/backup/Android.mk b/tests/backup/Android.mk index 35c05df59fb8e..2e3385f8b569e 100644 --- a/tests/backup/Android.mk +++ b/tests/backup/Android.mk @@ -21,7 +21,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := \ backup_helper_test.cpp -LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_TAGS := user LOCAL_MODULE := backup_helper_test LOCAL_SHARED_LIBRARIES := libutils @@ -31,7 +31,7 @@ include $(BUILD_EXECUTABLE) # ======================================== include $(CLEAR_VARS) -LOCAL_MODULE_TAGS := tests +LOCAL_MODULE_TAGS := user LOCAL_SRC_FILES := $(call all-subdir-java-files) diff --git a/tests/backup/AndroidManifest.xml b/tests/backup/AndroidManifest.xml index c26078bb60e84..eaeb5b72da94f 100644 --- a/tests/backup/AndroidManifest.xml +++ b/tests/backup/AndroidManifest.xml @@ -10,7 +10,7 @@ - + diff --git a/tests/backup/src/com/android/backuptest/BackupTestActivity.java b/tests/backup/src/com/android/backuptest/BackupTestActivity.java index 31aec39979099..de68cb7356caf 100644 --- a/tests/backup/src/com/android/backuptest/BackupTestActivity.java +++ b/tests/backup/src/com/android/backuptest/BackupTestActivity.java @@ -31,14 +31,58 @@ import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.IOException; +import java.io.PrintStream; +import java.text.DateFormat; +import java.util.Date; + public class BackupTestActivity extends ListActivity { static final String TAG = "BackupTestActivity"; static final String PREF_GROUP_SETTINGS = "settings"; static final String PREF_KEY = "pref"; + static final String FILE_NAME = "file.txt"; Test[] mTests = new Test[] { + new Test("Show File") { + void run() { + StringBuffer str = new StringBuffer(); + str.append("Text is:"); + BufferedReader reader = null; + try { + reader = new BufferedReader(new InputStreamReader(openFileInput(FILE_NAME))); + while (reader.ready()) { + str.append("\n"); + str.append(reader.readLine()); + } + } catch (IOException ex) { + str.append("ERROR: "); + str.append(ex.toString()); + } + Log.d(TAG, str.toString()); + Toast.makeText(BackupTestActivity.this, str, Toast.LENGTH_SHORT).show(); + } + }, + new Test("Append to File") { + void run() { + PrintStream output = null; + try { + output = new PrintStream(openFileOutput(FILE_NAME, MODE_APPEND)); + DateFormat formatter = DateFormat.getDateTimeInstance(); + output.println(formatter.format(new Date())); + output.close(); + } catch (IOException ex) { + if (output != null) { + output.close(); + } + } + BackupManager bm = new BackupManager(BackupTestActivity.this); + bm.dataChanged(); + } + }, new Test("Show Shared Pref") { void run() { SharedPreferences prefs = getSharedPreferences(PREF_GROUP_SETTINGS, MODE_PRIVATE);