娘が通うロボット教室、ヒューマンアカデミー。晴れてミドルコースに進み、ロボットプログラミング専用タブレットをいただきました。
ただ、このタブレットにインストールされたロボットプログラミング用アプリ、作成したプログラムに名前を付けることができず、プログラムNoと保存した日付のみで管理する仕様のため、将来的に間違えて上書きする事故が確実に発生する…。
せめて作成したプログラムのバックアップを取れないだろうか?と調べてみたら意外と簡単にできたので、その手順をメモすることにした。
まず、Android StudioやSDK等をインストールして、adbコマンドを使用可能にしたら、以下コマンドを実行する。引数に指定するpackage名は、事前にadb shellでshellに入り、topコマンド等で調べた。
adb backup -apk jp.co.vstone.myapplicationgl2
上記実行すると、コマンド実行したディレクトリ下に backup.ab ファイルが生成される。これを元にアプリとデータをリストアするには以下コマンドを実行すれば良いはずだが、その後もアプリが正常動作可能か確信がないため、怖くてやっていない。
$ adb restore backup.ab
backup.ab がどんなファイルを内包しているか、気になる場合は以下コマンドを実行すれば良い。ただし、実行するにはJava Runtimeとabe (android backup extractor)が必要。
$ java -jar abe.jar unpack backup.ab backup.tar "" $ tar xvf backup.tar $ tree apps apps └── jp.co.vstone.myapplicationgl2 ├── _manifest ├── a │ └── RobotSchool.apk ├── f │ ├── PROGRAM01.SEQ │ ├── PROGRAM02.SEQ │ ├── PROGRAM03.SEQ │ ├── PROGRAM04.SEQ │ ├── PROGRAM05.SEQ │ ├── PROGRAM06.SEQ │ ├── PROGRAM07.SEQ │ ├── PROGRAM08.SEQ │ ├── PROGRAM09.SEQ │ └── TEMPLETE.SEQ └── sp └── jp.co.vstone.myapplicationgl2_preferences.xml 4 directories, 13 files
試しにプログラムNo.9を保存直後にバックアップしてみると、上記PROGRAM09.SEQが生成されたbackup.abが取得できたので、ちゃんと取れてそう。
ちなみに各ファイルは以下のようにhuman readableではないので、中身まで解析する気は全く無い。
$ hexdump -C apps/jp.co.vstone.myapplicationgl2/f/PROGRAM02.SEQ 00000000 ac ed 00 05 75 72 00 30 5b 4c 6a 70 2e 63 6f 2e |....ur.0[Ljp.co.| 00000010 76 73 74 6f 6e 65 2e 6d 79 61 70 70 6c 69 63 61 |vstone.myapplica| 00000020 74 69 6f 6e 67 6c 32 2e 55 6e 64 6f 24 55 6e 64 |tiongl2.Undo$Und| 00000030 6f 42 75 66 66 65 72 3b 6b 98 7c 6e 9c 87 ea 38 |oBuffer;k.|n...8| 00000040 02 00 00 78 70 00 00 00 01 73 72 00 2d 6a 70 2e |...xp....sr.-jp.| 00000050 63 6f 2e 76 73 74 6f 6e 65 2e 6d 79 61 70 70 6c |co.vstone.myappl| 00000060 69 63 61 74 69 6f 6e 67 6c 32 2e 55 6e 64 6f 24 |icationgl2.Undo$| 00000070 55 6e 64 6f 42 75 66 66 65 72 56 d0 e5 86 8f 78 |UndoBufferV....x| 00000080 3c 93 02 00 09 49 00 05 67 72 6f 75 70 49 00 04 |<....I..groupI..| 00000090 6e 65 78 74 46 00 02 74 68 5a 00 0b 75 73 65 4f |nextF..thZ..useO| 000000a0 75 74 46 61 6c 73 65 46 00 01 78 46 00 01 79 5b |utFalseF..xF..y[| 000000b0 00 05 63 68 69 6c 64 74 00 02 5b 49 5b 00 09 73 |..childt..[I[..s| 000000c0 6c 6f 74 49 6e 64 65 78 71 00 7e 00 03 4c 00 04 |lotIndexq.~..L..| 000000d0 74 79 70 65 74 00 12 4c 6a 61 76 61 2f 6c 61 6e |typet..Ljava/lan| 000000e0 67 2f 53 74 72 69 6e 67 3b 78 70 00 00 00 00 ff |g/String;xp.....| 000000f0 ff ff ff 00 00 00 00 00 42 4e 00 00 40 55 55 4d |........BN..@UUM| 00000100 75 72 00 02 5b 49 4d ba 60 26 76 ea b2 a5 02 00 |ur..[IM.`&v.....| 00000110 00 78 70 00 00 00 00 75 71 00 7e 00 06 00 00 00 |.xp....uq.~.....| 00000120 00 74 00 09 62 74 6e 5f 73 74 61 72 74 |.t..btn_start| 0000012d