mathematikの すうがく ブログ

機械学習とかRとかPythonを中心に書いていく予定です

Androidでadb pullできないデータをスマフォからパソコンに取り出す方法

統計とは全く関係ない話題ですが。

たまにAndroidアプリをデバッグしている時に、InternalStrageに保存されているファイルについて確認したくなる時がありますよね?

SDカードカードにある場合は

adb pull /sdcard-path/filename .

でPCに転送できますが、InternalStrageの場合は、adb pull はできないと思います。(むしろ出来る場合は僕もすごく助かります!)

僕の記憶の限りでは以前は

adb shell run-as my.package.name dd if=myfile of=outfile

のようにddとかでコピーができていた気がしますが、Nexus7の2013版、Lollipopではどうもddができないようです。

※adb shell run-as <pachagename>  <command>  はpachagenameで指定されたAndroidにインストールされているアプリのandroid::debuggableがtrueに指定されている時、

<command>を「アプリのユーザ」権限で実行するコマンドです。

面倒なので 

adb shell run-as  my.package.name chmod 777 -R . 

をしてもダメでした。(むしろ変なエラーが出るようになりました)

ほかにadb shell で端末にログイン後、run-as でアプリのユーザになってddとかcatしたあとリダイレクトしてもSDカードには書き込めませんでした。

ExternalStrageに対するWriteパーミッションをアプリに与えても状況は変わらず。

では

adb shell run-as my.package.name cat /file-path/filename > out

と、ファイルの内容を出力して内容をPC上にリダイレクトで保存してみました。

しかしファイルのハッシュ値を確認すると端末上のファイルとPCにcatの結果として保存したファイルは別物でした。

嫌な予感がしたのでxxdでファイルの内容を確認したら、Android端末上で「0x0a(\n)」であったのが「0x0d 0x0a(\r\n)」に直されていました。

 かなしみに打ちひしがれながら「adb shell cat \r\n 」と検索をかけると偉い人がすでにやっていました。

stackoverflow.com

偉い人に心のなかで感謝を述べながらsedを利用すると、またまたエラーが()

必殺perl

adb shell run-as my.package.name cat /file-path/filename | perl -ne 's/\r$//' > out

で、無事アプリInternalStrageにあるアプリのディレクトリにあるファイルをコピー出来ました。