Android開発ログ

カテゴリ : プログラム

ちょっとした事情で、assetsに保存したDBファイルを初期データとして使いたいということがありましたが、Android上でどうファイルコピーするのが速いんだろうということで、ネット上の記事を参考に実際にプログラム走らせて調べてみました。
ここで測ったのはAndroid端末内部ストレージ間でのファイルコピー処理です。
結論だけちょろっと言っておくと、1バイトずつコピーとかアホなことさえしなきゃ問題ないというところです。
ソースコードは最後に。




まぁ基本AndroidアプリはJavaだよねということで、Javaでのファイルコピーの速度に関して調べた記事(File Copy in Java – Benchmark)を参考にしました。
10種類の方法で軽いファイル(5KB)や重いファイル(50MB)に対するコピー完了までの速度を計測したもので、ソースもDL可能です。


まぁAndroidでも同様だろうけども、念のため調べるかということで試してみました。
環境は次のもの。
 ・実機:Panasonic P-02E(Android4.1.2)
 ・バッファサイズ:4096Byte
 ・コピー元:apkのassetsファイルに保存したファイル
 ・コピー先:アプリのデータ領域
 ・コピーファイル:テキストファイル(5MB)


上記のリンクでは10種類の方法で試していましたが、ここでは5種類の方法で試します。
  Copy1.1ByteずつFileInputStreamでコピー
  Copy2.1ByteずつBufferedInputStreamでコピー
  Copy3.Bufferを使ってFileInputStreamでコピー
  Copy4.Bufferを使ってBufferedInputStreamでコピー
  Copy5.NIOFileChannelを使ったコピー


で、結果が次になります。
  Copy1:319.656 sec
  Copy2:7.317 sec
  Copy3:0.250 sec
  Copy4:0.142 sec
  Copy5:0.386 sec

バッファサイズに関しては、4096Byteから大きくしたり小さくしたり変えてみましたが、大して変化なし。
そのため、ほどほどの4096の結果のみ記載してます。






1バイトずつコピーする方法は遅く、実用には耐えられないレベルでした。まぁしょうがないですよね。
また、コピー時間に関してはFileInputStreamの方が遅い傾向にありましたが、ほぼ大差ありません。

あと、冒頭のリンクでも述べられていたのですが、NIOでコピーするのが速いのはある程度ファイルサイズがある時ということで、これはAndroid上でも一緒でした。
冒頭のサイトを読んだ時も思いましたが、意外とFileINputStreamやBufferedInputStreamよりも遅い。
上記サイトの結果を踏まえると、50MBとかの大きいファイルサイズのデータをコピーしたいときは、NIOでコピーしてあげた方がおそらく良いと思います。

今回はassetsからファイルをコピーするという前提があるため、1ファイル当たりのサイズ最大値は5MBです。
とういことで、今回調べたかった環境で一番早くコピーするには
  ・Copy4.Bufferを使ってBufferedInputStreamでコピー
しとけば良いということでした。
あとは、JNIでコピーしたらどうなるのかなーとかも思っていますが、まだ行ってはいません。
いつか気が向いたらやります。


プログラムや記事に何か間違いがあればコメント頂けると幸いです。

続きを読む

Android4.0 からは OS がスクリーンショット機能をサポートしました。しかし、それ以前の Android では、次のような不便な撮影方法しかありませんでした。
  • AndroidSDK の DDMS のキャプチャ機能
  • AndroidSDK の adb shell から起動したプロセスを介してフレームバッファにアクセスし、Android アプリから画像を作成
  • root化した Android 端末のフレームバッファから画像を作成
どれも一度はPCにUSB接続する必要があり、また、Android の開発環境をPCに入れる必要があり、一般のユーザには敷居が高い画面キャプチャ方法しかありません。

そこで、ここでは、「root化も adb も不要な方法を紹介します。」と言いたいところなのですが、おそらく無理です。root 化不要でフレームバッファにアクセス可能な端末はいくつかあるらしいのですが、調べた限りでは、大抵の端末ではフレームバッファにアクセスするために、root権限かadb権限が必須となります。

問題の解決にはなってませんが、先人の轍を踏むという意味を込めて、今回はフレームバッファのデータを Bitmap 画像化するプログラムをC言語で書いてみました。


続きを読む

このページのトップヘ