Android data/data/パッケージ配下のデータを公開ディレクトリへコピー

開発中アプリの内部データをデバッグしたい時に
data/data/パッケージ配下の全データを公開ディレクトリへコピーするコード

DebugUtil.java
package bravecanary.com.xxx;

import android.content.Context;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Environment;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;

public class DebugUtil {

    /**
     * アプリデータ出力
     * @param context Context
     */
    public static void debugDataCopy(Context context) {
        // 出力先ディレクトリ作成
        File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        File outputDir = new File(dir.getAbsolutePath() + "/MY_DEBUG_DATA");
        if (!outputDir.exists()) {
            outputDir.mkdir();
        }

        // ファイルリスト取得
        List<File> list = getFileList(getApplicationRootPath(context));
        String[] mediaList = new String[list.size()];

        // データコピー
        for (int i = 0; i < list.size(); i++) {
            File inputFile = list.get(i);
            File outputFile = new File(outputDir + "/" + list.get(i).toString());
            File outputFolder = outputFile.getParentFile();
            // フォルダ作成
            if(!outputFolder.exists() && !outputFolder.mkdirs()) {
                continue;
            }
            // コピー
            fileCopy(inputFile, outputFile);
            mediaList[i] = outputFile.toString();
        }

        // ファイルシステムを更新してファイルを見えるようにする
        MediaScannerConnection.scanFile(context, mediaList, null, new MediaScannerConnection.OnScanCompletedListener() {
            @Override
            public void onScanCompleted(String path, Uri uri) {
            }
        });
    }

    private static File getApplicationRootPath(Context context) {
        File dir = context.getFilesDir();
        return dir.getParentFile();
    }

    private static List<File> getFileList(File dir) {
        List<File> list = new ArrayList<File>();
        if (dir == null || !dir.isDirectory()) {
            return null;
        }
        searchFile(dir.listFiles(), list);
        return list;
    }

    private static void searchFile(File[] files, List<File> list) {
        for (File file : files) {
            if (file.isDirectory()) {
                searchFile(file.listFiles(), list);
            } else {
                list.add(file);
            }
        }
    }

    private static boolean fileCopy(File inputFile, File outputFile) {
        boolean ret = false;
        FileChannel inputChannel = null;
        FileChannel outputChannel = null;
        try {
            inputChannel = new FileInputStream(inputFile).getChannel();
            outputChannel = new FileOutputStream(outputFile).getChannel();
            inputChannel.transferTo(0, inputChannel.size(), outputChannel);
            ret = true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputChannel != null) {
                try {
                    inputChannel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputChannel != null) {
                try {
                    outputChannel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return ret;
    }
}
使用方法

使用したい場所で DebugUtil.debugDataCopy(Context); をコールする事で出力

※このコードでの出力先は”download/MY_DEBUG_DATA/”配下に出力しています。
 25-26行目を書き換えることで任意のフォルダへ出力可能
※デバッグ用のため厳密なエラーチェックはしていません。