2012-01-19 19 views
20

Có một số dữ liệu trong ứng dụng Android mà tôi muốn sao lưu và khôi phục. Vì mục đích đó, tôi đã tạo triển khai tùy chỉnh BackupAgent.onRestore không được gọi cho tùy chọn BackupAgent

Trong manifest của tôi trong tôi đã bao gồm các đại lý sao lưu như bạn có thể xem dưới đây

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    android:installLocation="auto" 
    package="com.myapp" 
    android:versionCode="14" 
    android:versionName="1.13" > 

    <application 
     android:backupAgent="com.myapp.MyBackupAgent"> 

     <meta-data 
      android:name="com.google.android.backup.api_key" 
      android:value="my key" /> 

Tôi đã bao gồm phím api dịch vụ sao lưu, mặc dù tôi đang thử nghiệm với các giả lập (Android 2.2) và nó không nên cần thiết, bởi vì nó sử dụng phương tiện sao lưu cục bộ.

Để làm bài kiểm tra của các sao lưu và khôi phục Tôi đã làm như sau:

  • Khởi động giả lập với cài đặt ứng dụng của tôi.
  • Enable sao lưu

    adb shell bmgr phép đúng

  • Gọi một phần của mã của tôi là những phương pháp dataChanged trong lớp BackupManager được gọi.

  • Tiến hành bằng tay hoạt động sao lưu

    adb shell bmgr chạy

  • Checked trong nhật ký rằng phương pháp onBackup của tùy chỉnh của tôi BackupAgent được gọi.

  • Gỡ bỏ các ứng dụng
  • Cài đặt lại ứng dụng
  • Kiểm tra trong nhật ký nếu phương pháp onRestore được gọi.

Vấn đề là phương pháp onRestore dường như không được gọi và tôi không biết tại sao. Sau khi cài đặt lại ứng dụng hoặc kích hoạt khôi phục bằng tay với adb theo cách thủ công, tôi thấy những điều sau đây trong bảng điều khiển.

$adb shell bmgr restore com.myapp 
restoreStarting: 2 packages 
restoreFinished: 0 
done 

và điều này khác trong nhật ký

D/AndroidRuntime(8259): 
D/AndroidRuntime(8259): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<< 
D/AndroidRuntime(8259): CheckJNI is ON 
D/AndroidRuntime(8259): --- registering native functions --- 
D/BackupManagerService( 59): MSG_RUN_RESTORE [email protected] 
V/LocalTransport( 59): start restore 1 
V/LocalTransport( 59): nextRestorePackage() = @[email protected] 
V/LocalTransport( 59): getRestoreData() found 7 key files 
V/LocalTransport( 59):  ... key=com.android.providers.settings size=1208 
V/LocalTransport( 59):  ... key=com.myapp size=501 
V/LocalTransport( 59):  ... key=android size=1208 
V/LocalTransport( 59):  ... key=com.android.providers.userdictionary size=1208 
V/LocalTransport( 59):  ... key=com.android.browser size=1208 
V/LocalTransport( 59):  ... key=com.android.inputmethod.latin size=1208 
V/LocalTransport( 59):  ... [email protected]@ size=11 
V/LocalTransport( 59): no more packages to restore 
V/LocalTransport( 59): finishRestore() 
V/LocalTransport( 59): finishRestore() 
D/AndroidRuntime(8259): Shutting down VM 

nhưng tôi không thấy rằng các cuộc gọi đến onRestore được thực sự thực hiện (Tôi có một số báo cáo khai thác gỗ chỉ vào đầu của nó?

Điều này có bao giờ xảy ra với bạn không? Có bất kỳ lý do gì bởi phương pháp onRestore không được gọi, ngay cả trong số onBackup được gọi là?

+2

Tôi vừa thử nó với một chiếc điện thoại thích hợp, một chiếc Samsung Galaxy Nexus. Tôi đã tự bảo đảm rằng tôi đã bật sao lưu, giống như được mô tả trong liên kết sau: http://support.verizonwireless.com/clc/devices/knowledge_base.html?id=51309 và tôi thấy điều này trong nhật ký 'W/BackupManagerService (196): Sao lưu vượt qua nhưng e = true p = false', có nghĩa là được bật nhưng không được cấp phép. Tại sao nó không được cung cấp? – mollymay

+1

Tôi gặp vấn đề này ngay hôm nay. onBackup được gọi thành công mà không có ngoại lệ nhưng onRestore không được gọi khi ứng dụng được cài đặt lại. Bạn đã tìm ra lý do? Cảm ơn! – Loc

Trả lời

1

Theo kinh nghiệm của tôi, vì một lý do nào đó (mà Tôi chưa xác định được), các câu lệnh ghi nhật ký được thực hiện trong BackupAgents không hiển thị trong nhật ký. Tuy nhiên, tôi đã có thể xác nhận rằng phương pháp onRestore trong thực tế chạy đúng cách.

Trong câu hỏi của bạn, bạn chỉ ra rằng phương pháp onRestore "dường như không được gọi là" vì bạn không thể xem các nhật ký thích hợp. Thay vào đó, bạn có thể xác nhận rằng kết quả không thành công (tức là dữ liệu đó phải được khôi phục đúng không)?

+0

Đúng. Tôi nghĩ rằng OP nên kiểm tra điều này và lấy lại. –

+0

Theo kinh nghiệm của tôi, trong Android 5, các câu lệnh ghi nhật ký được gọi nhưng các điểm ngắt lỗi không được kích hoạt. Dường như quá trình khôi phục chạy trước khi trình gỡ lỗi được kết nối. Điều đó có thể tạo ra một số nhầm lẫn về những gì đang xảy ra khi thử nghiệm một ứng dụng. – arlomedia

1

Tôi đã gặp sự cố này và nguyên nhân gốc rễ là tôi đã có lỗi trong onBackup ngăn không cho nó hoàn thành, do đó onBackup được gọi nhưng onRestore thì không.Sửa lỗi ngoại lệ trong onBackup đã khiến onRestore được gọi.

Ngoài ra, các thông điệp tường trình trong onBackup và onRestore sẽ hiển thị trong nhật ký. Nếu bạn đặt bộ lọc nhật ký trên thẻ "sao lưu" và sử dụng thứ gì đó có bản sao lưu trong thẻ cho thẻ nhật ký của bạn. Bạn sẽ thấy đăng nhập từ hệ thống và của bạn. Đây là những gì tôi nhận được

09-08 17:06:56.581  294-352/system_process V/BackupServiceBinder﹕ doBackup() invoked 
09-08 17:06:56.591  294-352/system_process D/PerformBackupTask﹕ starting agent for backup of BackupRequest{pkg=android} 
09-08 17:06:56.591  294-352/system_process D/BackupManagerService﹕ awaiting agent for ApplicationInfo{40d5efc0 android} 
09-08 17:06:56.591  294-308/system_process D/BackupManagerService﹕ agentConnected pkg=android [email protected]8 
09-08 17:06:56.601  294-352/system_process V/BackupServiceBinder﹕ doBackup() invoked 
09-08 17:06:56.601  294-352/system_process D/BackupHelperDispatcher﹕ handling existing helper 'wallpaper' [email protected] 
09-08 17:06:56.621  294-352/system_process D/PerformBackupTask﹕ starting agent for backup of BackupRequest{pkg=com.catglo.sellpr} 
09-08 17:06:56.661  294-352/system_process D/BackupManagerService﹕ awaiting agent for ApplicationInfo{41074748 com.catglo.sellpr} 
09-08 17:06:56.781  294-514/system_process D/BackupManagerService﹕ agentConnected pkg=com.catglo.sellpr [email protected] 
09-08 17:06:56.791 2263-2274/com.catglo.sellpr V/BackupServiceBinder﹕ doBackup() invoked 
09-08 17:06:56.791 2263-2274/com.catglo.sellpr I/backup﹕ onBackup called 
09-08 17:06:57.251  294-352/system_process I/PerformBackupTask﹕ Backup pass finished. 

trong nhật ký trên com.catglo.sellpr là từ ứng dụng của tôi và dòng mà đọc com.catglo.sellpr I/sao lưu: onBackup gọi là thông điệp log trong mã của tôi . Đối với onRestore tôi nhận được

09-08 17:13:34.431  294-352/system_process D/BackupManagerService﹕ MSG_RUN_RESTORE [email protected] 
09-08 17:13:34.511  294-352/system_process V/BackupServiceBinder﹕ doRestore() invoked 
09-08 17:13:34.561  294-352/system_process D/BackupManagerService﹕ awaiting agent for ApplicationInfo{41074748 com.catglo.sellpr} 
09-08 17:13:34.561  294-427/system_process D/BackupManagerService﹕ agentConnected pkg=com.catglo.sellpr [email protected] 
09-08 17:13:34.571 2263-2276/com.catglo.sellpr V/BackupServiceBinder﹕ doRestore() invoked 
09-08 17:13:34.571 2263-2276/com.catglo.sellpr I/backup﹕ onRestore called 

Trước đó tôi có một ngoại lệ trong onBackup và đăng nhập của tôi từ onRestore chưa từng được gọi nhưng những thông điệp hệ thống liên quan để khôi phục lại được.

Ứng dụng sẽ không buộc Đóng vì ngoại lệ trong bản sao lưu.

Các vấn đề liên quan