すごく特殊な用途なので、普通は使わないと思うので本当にただのメモです。
普通はデバッグでファイルシステム使ってadb pullしたりとかいくらでもやり方はあると思います。
リリースだけ再現したりする現象があったりして、デバッグでは再現しない現象があってバイナリを確認したい場面があります。(ほぼない。)
logcatにデータを出力する
logcatに画像やら、protocol bufferのバイナリなどを流してそれを復元したいと思います。普通にtoString()などをして流すと文字化けしてしまい復元が難しい文字列になってしまうのでそれをなんとかするコードになります。
例えばRetrofit + OkHttpでpostしているデータをログに出すには以下のようにします。 (デバッグ用なので本番で使わないこと)
.addNetworkInterceptor(Interceptor { chain ->
val request = chain.request()
val sink = Buffer()
request.body?.writeTo(sink)
val byteArray = sink.readByteArray()
Timber.w(Base64.encodeToString(byteArray, Base64.DEFAULT))
chain.proceed(request)
})
ポイントは以下です
- Base64でエンコードしてしており、Base64は以下の通りのフォーマットなのでlogcatでも流す事ができます。
Base64は、データを64種類の印字可能な英数字のみを用いて、それ以外の文字を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱うためのエンコード方式である
- Tibmerを使う。
Timberには長い文字列を分割してくれる機能があるので、それによってlogcatから大きいバイナリでも出力可能になります。
データを復元する
そして、logcatにbase64の文字列がでるので、これをvimとかを使ってつなげてあげて(長いとTimberが分割して出力するため)、以下のように出力してあげればデータを取り出すことができます。
base64 -d logcatのbase64部分の内容を保存したbase64ファイル > output.binary