2014-09-20 4 views
0

백업해야하는 사용자가 생성 한 파일이 많은 앱이 있습니다. 모든 컨텐츠는 db, 환경 설정 또는 4 개의 폴더 중 1 개에 저장됩니다. 각 폴더의 파일에 대해 FileBackupHelpers을 모두 생성하는 간단한 도우미 함수를 작성했습니다. 그러나 내 onCreate()FileBackupHelper에 대한 프레임 워크 코드를 실행 한 후 분석하여 경로를 추적하여 내 응용 프로그램을 손상시키는 것 같습니다.많은 수의 파일로 BackupAgentHelper가 충돌 함

다음

내 백업 에이전트에 대한 코드입니다 :

V/AABackupAgent﹕ GO! 
V/AABackupAgent﹕ DB file:AADataModel 
V/AABackupAgent﹕ path:/data/data/<packageNameRemovedToProtectClient>/databases/AADataModel.sqlite 
V/AABackupAgent﹕ Filebackup list size::551 for path:thingImage 
V/AABackupAgent﹕ should break up the paths in to 2 chunks! 
V/AABackupAgent﹕ adding helper for path:thingImage0 
V/AABackupAgent﹕ adding helper for path:thingImage1 
V/AABackupAgent﹕ Filebackup list size::1 for path:user 
V/AABackupAgent﹕ Filebackup list size::0 for path:categoryImage 
V/AABackupAgent﹕ Filebackup list size::551 for path:audio 
V/AABackupAgent﹕ should break up the paths in to 2 chunks! 
V/AABackupAgent﹕ adding helper for path:audio0 
V/AABackupAgent﹕ adding helper for path:audio1 
V/AABackupAgent﹕ onCreate Done! 
V/BackupServiceBinder﹕ doBackup() invoked 
D/BackupHelperDispatcher﹕ handling existing helper 'db' [email protected] 
D/BackupHelperDispatcher﹕ handling existing helper 'prefs' [email protected] 
D/BackupHelperDispatcher﹕ handling new helper '/storage/emulated/0/Android/data/<packageNameRemovedToProtectClient>/files/categoryImage' 
D/BackupHelperDispatcher﹕ handling new helper '/storage/emulated/0/Android/data/<packageNameRemovedToProtectClient>/files/user' 
D/BackupHelperDispatcher﹕ handling new helper 'audio0' 
E/dalvikvm﹕ JNI ERROR (app bug): local reference table overflow (max=512) 
W/dalvikvm﹕ JNI local reference table (0x7e2ff770) dump: 
W/dalvikvm﹕ Last 10 entries (of 512): 
W/dalvikvm﹕ 511: 0x426c0878 java.lang.String "/data/data/com.m... (132 chars) 
W/dalvikvm﹕ 510: 0x426c0830 java.lang.String "/data/data/com.m... (138 chars) 
W/dalvikvm﹕ 509: 0x426c0500 java.lang.String "/data/data/com.m... (127 chars) 
W/dalvikvm﹕ 508: 0x426c01d8 java.lang.String "/data/data/com.m... (131 chars) 
W/dalvikvm﹕ 507: 0x426ba7d8 java.lang.String "/data/data/com.m... (131 chars) 
W/dalvikvm﹕ 506: 0x426ba790 java.lang.String "/data/data/com.m... (137 chars) 
W/dalvikvm﹕ 505: 0x426bf488 java.lang.String "/data/data/com.m... (135 chars) 
W/dalvikvm﹕ 504: 0x426bf158 java.lang.String "/data/data/com.m... (130 chars) 
W/dalvikvm﹕ 503: 0x426bee38 java.lang.String "/data/data/com.m... (129 chars) 
W/dalvikvm﹕ 502: 0x426b94b0 java.lang.String "/data/data/com.m... (131 chars) 
W/dalvikvm﹕ Summary: 
W/dalvikvm﹕ 1 of java.lang.Class 
W/dalvikvm﹕ 507 of java.lang.String (507 unique instances) 
W/dalvikvm﹕ 2 of java.io.FileDescriptor (2 unique instances) 
W/dalvikvm﹕ 2 of java.lang.String[] (511 elements) (2 unique instances) 
E/dalvikvm﹕ Failed adding to JNI local ref table (has 512 entries) 
I/dalvikvm﹕ "Binder_3" prio=5 tid=20 RUNNABLE 
I/dalvikvm﹕ | group="main" sCount=0 dsCount=0 obj=0x42f4b218 self=0x777b2a98 
I/dalvikvm﹕ | sysTid=10236 nice=0 sched=0/0 cgrp=apps handle=1942542136 
I/dalvikvm﹕ | state=R schedstat=(18035885 5737305 43) utm=1 stm=0 core=3 
I/dalvikvm﹕ at android.app.backup.FileBackupHelperBase.performBackup_native(Native Method) 
I/dalvikvm﹕ at android.app.backup.FileBackupHelperBase.performBackup_checked(FileBackupHelperBase.java:76) 
I/dalvikvm﹕ at android.app.backup.FileBackupHelper.performBackup(FileBackupHelper.java:85) 
I/dalvikvm﹕ at android.app.backup.BackupHelperDispatcher.doOneBackup(BackupHelperDispatcher.java:95) 
I/dalvikvm﹕ at android.app.backup.BackupHelperDispatcher.performBackup(BackupHelperDispatcher.java:76) 
I/dalvikvm﹕ at android.app.backup.BackupAgentHelper.onBackup(BackupAgentHelper.java:66) 
I/dalvikvm﹕ at android.app.backup.BackupAgent$BackupServiceBinder.doBackup(BackupAgent.java:567) 
I/dalvikvm﹕ at android.app.IBackupAgent$Stub.onTransact(IBackupAgent.java:80) 
I/dalvikvm﹕ at android.os.Binder.execTransact(Binder.java:404) 
I/dalvikvm﹕ at dalvik.system.NativeStart.run(Native Method) 
I/dalvikvm﹕ [ 09-20 04:06:45.777 9815:10236 E/dalvikvm ] VM aborting 
A/libc﹕ Fatal signal 6 (SIGABRT) at 0x00002657 (code=-6), thread 10236 (Binder_3) 
W/ContextImpl﹕ Failed to ensure directory: /storage/extSdCard/Android/data/<packageNameRemovedToProtectClient>/files 
W/ContextImpl﹕ Failed to ensure directory: /storage/extSdCard/Android/data/<packageNameRemovedToProtectClient>/files 
V/AABackupAgent﹕ GO! 
V/AABackupAgent﹕ DB file:AADataModel 
V/AABackupAgent﹕ path:/data/data/<packageNameRemovedToProtectClient>/databases/AADataModel.sqlite 
V/AABackupAgent﹕ Filebackup list size::551 for path:thingImage 
V/AABackupAgent﹕ should break up the paths in to 2 chunks! 
V/AABackupAgent﹕ adding helper for path:thingImage0 
V/AABackupAgent﹕ adding helper for path:thingImage1 
V/AABackupAgent﹕ Filebackup list size::1 for path:user 
V/AABackupAgent﹕ Filebackup list size::0 for path:categoryImage 
V/AABackupAgent﹕ Filebackup list size::551 for path:audio 
V/AABackupAgent﹕ should break up the paths in to 2 chunks! 
V/AABackupAgent﹕ adding helper for path:audio0 
V/AABackupAgent﹕ adding helper for path:audio1 
V/AABackupAgent﹕ onCreate Done! 

감사합니다 당신이 줄 수있는 모든 도움에 미리 :

다음
package <packageNameRemovedToProtectClient>.service; 

import android.app.backup.BackupAgentHelper; 
import android.app.backup.FileBackupHelper; 
import android.app.backup.SharedPreferencesBackupHelper; 
import android.content.Context; 
import android.os.Environment; 
import android.util.Log; 

import <packageNameRemovedToProtectClient>.data.DBManager; 

import java.io.File; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.Vector; 

/** 
* Created by mclark4386 on 9/18/14. 
*/ 
public class AABackupAgent extends BackupAgentHelper { 
private static final String CLASS_NAME = AABackupAgent.class.getSimpleName(); 

private Context mContext; 

public AABackupAgent() { 
    super(); 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    mContext = this; 
    AssetManager.setupSingleton(mContext); 
    Log.v(CLASS_NAME,"GO!"); 
    this.addHelper("prefs", new SharedPreferencesBackupHelper(mContext, Service.PREFS_NAME)); 
    String dbfile = DBManager.filePath.replace(".sqlite", ""); 
    Log.v(CLASS_NAME,"DB file:"+dbfile); 
    File dataDirectory = Environment.getDataDirectory(); 
    File db = new File(dataDirectory,DBManager.fullDBPath); 
    Log.v(CLASS_NAME,"path:"+db.getAbsolutePath()); 
    this.addHelper("db", new FileBackupHelper(mContext, db.getAbsolutePath())); 
    AddFolderHelper(AssetManager.thingImageFolder.getAbsolutePath()); 
    AddFolderHelper(AssetManager.userFolder.getAbsolutePath()); 
    AddFolderHelper(AssetManager.categoryImageFolder.getAbsolutePath()); 
    AddFolderHelper(AssetManager.audioFolder.getAbsolutePath()); 
    Log.v(CLASS_NAME,"onCreate Done!"); 
} 

private void AddFolderHelper(String path){ 
    try{ 
     File folder = new File(path); 
     if (folder.isDirectory()){ 
      Log.v(CLASS_NAME,"Filebackup list size::"+folder.list().length+" for path:"+folder.getName()); 
      File[] listFiles = folder.listFiles(); 
      Vector<String> filepaths = new Vector<String>(listFiles.length); 
      for (int i = 0;i< listFiles.length;i++) 
       filepaths.add(listFiles[i].getAbsolutePath()); 
      if (filepaths.size()>512){ 
       int count = (filepaths.size()/511); 
       if(filepaths.size()%511 > 0)count++; 
       Log.v(CLASS_NAME,"should break up the paths in to "+count+" chunks!"); 
       String[] paths = new String[filepaths.size()]; 
       filepaths.toArray(paths); 
       String shortName = folder.getName(); 
       for (int i = 0; i < count; i++) { 
        Log.v(CLASS_NAME,"adding helper for path:"+shortName+i); 
        String[] pathRange = Arrays.copyOfRange(paths, 511 * i, (511 * i) + 511); 
        this.addHelper(shortName+i, new FileBackupHelper(mContext, pathRange)); 
       } 
      }else { 
       String[] paths = new String[filepaths.size()]; 
       filepaths.toArray(paths); 
       this.addHelper(path, new FileBackupHelper(mContext, paths)); 
      } 
     }else{ 
      this.addHelper(path, new FileBackupHelper(mContext, path)); 
     } 
    }catch (Exception e){ 
     Log.e(CLASS_NAME,"ERROR: AddFolderHelper:"); 
     e.printStackTrace(); 
    } 
} 
} 

는 로그 출력! 다른 정보가 필요하면 알려주십시오.

+0

BackupAgentHelper는 많은 데이터를 백업하고 복원 할 수있을만큼 강력합니다. 또한 안전 문제가 있으며 모든 장치에서 사용 가능한 것으로 보이지 않습니다. –

+0

그게 내가 정신적으로 또한 향하고있는 곳이다. 적절한 대체 방법을 제안 할 수 있다면 가장 가능성이 높습니다 ^^ –

+0

데이터의 크기는 어느 정도입니까? 사용자가 인터넷에서 데이터를 바로 백업하고 복원 할 수있는 방법을 제공하기 위해이 작업을 수행합니까? –

답변

1

여기에 내가 한 일의 세부 사항이 있습니다. 처음에 나는 당신과 똑같은 방식으로 시도했지만 BackupAgentHelper을 구현 했었지만 파일을 백업하고 복원하는 것만으로는 충분하지 않을 것이라는 것을 깨달았습니다. 정말 가벼운 데이터 나 사용자 환경 설정에서는 괜찮을 것이라고 생각합니다. 제 경우에는 SQLite 데이터베이스를 백업해야하고 많은 사진이 필요했습니다.

백업의 경우 :

  1. 첫 번째 단계 : 여기

    는 기본적으로 프로세스 I 설정 하나 AsyncTask 복사 및 외부 저장 장치에 동일한 폴더에 백업 할 다른 파일을 수집합니다.

  2. 두 번째 단계 : 다른 AsyncTask 전송 보관에 우편 (I 생각 나는 나중에 Google 드라이브와 함께 할 수 있음) 복원을 위해

: 다른 AsyncTask 모든 파일 함께

  • 세 번째 단계를 압축

    1. 첫 번째 단계는 : 1 AsyncTask Dropbox에서 기기로 우편 번호를 전송합니다.
    2. 두 번째 단계 : 다른 파일 AsyncTask 모든 파일의 압축을 풉니 다.
    3. 세 번째 단계 : 또 다른 AsyncTask은 파일을 이동합니다.

    이 방법을 사용하면 모든 것이 제 시간에 이루어 지므로 어떻게되는지 따라갈 수 있습니다. BackupAgentHelper을 사용하면 언제 어떻게 완료되는지 쉽게 알 수 없습니다.

    PS : Dropbox의 경우 Core API를 사용 했으므로 제공되는 라이브러리와 함께 좋은 프로젝트 예제 ("DBRoulette")를 제공합니다.

  • +0

    나는 Google 드라이브와 함께 이런 일을하고 있습니다. 다시 한 번 감사드립니다! –