Google OS実験室 ~Moonlight 明日香~

GoogleのAndroidで遊び始めて, すでに6年以上が経った. Androidは思った以上の発展を遂げている. この技術を使って, 新しいことにチャレンジだ!!

Android6.0でOpenCVが起動しない

Android 4.4では問題なく動作していたOpenCV 2.4.11を使ったアプリが, Android 6.0で動作しなくなった.

[エラー発生環境]
Nexus 7(2013) / Android 6.0.1
OpenCVバージョン2.4.11

エラーメッセージを確認したところ, OpenCVLoader#initAsyncメソッドでエラーが発生していた.

[エラーメッセージ]
01-09 21:56:28.665 14620-14620/com.moonlight_aska.android.vision.flironedemo I/LOG_TAG: onResume, init ImageProc!
01-09 21:56:28.666 14620-14620/com.moonlight_aska.android.vision.flironedemo D/AndroidRuntime: Shutting down VM
01-09 21:56:28.669 14620-14620/com.moonlight_aska.android.vision.flironedemo E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.moonlight_aska.android.vision.flironedemo, PID: 14620
        java.lang.RuntimeException: Unable to resume activity {com.moonlight_aska.android.vision.flironedemo/com.moonlight_aska.android.vision.flironedemo.PreviewActivity}: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=org.opencv.engine.BIND }
                at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103)
                at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
                at android.app.ActivityThread.-wrap11(ActivityThread.java)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                at android.os.Handler.dispatchMessage(Handler.java:102)
                at android.os.Looper.loop(Looper.java:148)
                at android.app.ActivityThread.main(ActivityThread.java:5417)
                at java.lang.reflect.Method.invoke(Native Method)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                        Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=org.opencv.engine.BIND }
                at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1209)
                at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1308)
                at android.app.ContextImpl.bindService(ContextImpl.java:1286)
                at android.content.ContextWrapper.bindService(ContextWrapper.java:604)
                at org.opencv.android.AsyncServiceHelper.initOpenCV(AsyncServiceHelper.java:25)
                at org.opencv.android.OpenCVLoader.initAsync(OpenCVLoader.java:89)
                at com.moonlight_aska.android.vision.flironedemo.ImageProc.init(ImageProc.java:41)
                at com.moonlight_aska.android.vision.flironedemo.PreviewActivity.onResume(PreviewActivity.java:218)
          :
 
対応策について少し調べてみたところ, OpenCVのコードを以下のように修正すればよいようである. [1]

[対象ファイル]
org\opencv\Android\AsyncServiceHelper.java

[修正箇所]
public static boolean initOpenCV(String Version, final Context AppContext,
        final LoaderCallbackInterface Callback)
{
    AsyncServiceHelper helper = new AsyncServiceHelper(Version, AppContext, Callback);  
  /* 修正前 2016.1.9
  if (AppContext.bindService(new Intent("org.opencv.engine.BIND"),
         helper.mServiceConnection, Context.BIND_AUTO_CREATE))
  */
  Intent intent = new Intent("org.opencv.engine.BIND");
  intent.setPackage("org.opencv.engine");
  if (AppContext.bindService(intent,
      helper.mServiceConnection, Context.BIND_AUTO_CREATE))
    {
        return true;
    }
    else
    {
        AppContext.unbindService(helper.mServiceConnection);
        InstallService(AppContext, Callback);
        return false;
    }
}

一応, これで問題なくOpenCVが使用できることを確認した.
どうもAndroid 5.0以降で同じ問題が発生するようだ...

----
参照URL:
[1] Issue with OpenCV for Android on Android 5.0 (lollipop)


VMware Playerを快適にしたい

Google発の深層学習フレームワーク「TensorFlow」のAndroidデモをUbuntu 14.04 on VMware Playerでビルドしようとしたが, 一晩かかっても終わらなかった.

ホストマシン:
 CPU:Intel Core i7-2600K
 RAM:8.00GB
 OS:Windows 10 Pro
 VMware Player 6
仮想マシン:
 プロセッサ数:4
 メモリ:3GB
 HDD:100GB
 OS:Ubuntu 14.04

VMware Playerをもう少し快適にできないかと少し調べてみたところ, 仮想マシンのメモリはデフォルトではHDD(or SSD)上にメモリファイル(.vmem)として置かれるようである.
これならディスクI/Oが多発し動作が遅いのも納得である.

そこで, 仮想マシンで実メモリが使えるように, VMware構成(*.vmx)ファイルでメモリ関連の設定を行うことにした.


1. 設定項目[1][2]
vmxファイルに以下の設定を追加する.
  mainMem.useNamedFile= "FALSE"
  MemTrimRate = "0"
  sched.mem.pshare.enable = "FALSE"
  prefvmx
.useRecommendedLockedMemSize = "TRUE"
  MemAllowAutoScaleDown = "FALSE"

2. 各パラメータの説明[1][2]
1) mainMem.useNamedFile = "FALSE" 
  メモリファイル(.vmem)を使用しない.
2) MemTrimRate = "0"
  メモリページのトリミングを無効にする.
3) sched.mem.pshare.enable = "FALSE"
  ページ共有機能を無効にする.
4) prefvmx.useRecommendedLockedMemSize = "TRUE"
 メモリ使用量が変化した際に, メモリサイズを固定する.
5) MemAllowAutoScaleDown = "FALSE"
  仮想OSのメモリサイズの自動調節を無効にする.

上記設定で, 以前よりビルドの進行は速くなったが, それでもandroid:tensorflow_demoのビルドはなかなか終わらない.
まだディスクアクセスが頻発しているもよう.

task

そもそもVMware Player上でビルドしているからなのか, それともPCのメモリ不足が原因なのか不明.
ビルド時間がもったいないので何とかしたい!!

Deep Learningやるために, 新しいLinux PC組もうかな~.
ああ, Core i7-6700K + 16GB RAM + SSD + NVIDIA GTX980がほしい.

----
参照URL:
[1] VMware Player上の仮想OSを高速化させ軽快に作動させるチューニング
[2] VMX-file parameters


livedoor プロフィール
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

記事検索



  • ライブドアブログ