以前自作apkファイルを作成したのですが、試験環境がなく実機にインストールしてデバッグを行っていました。
サブのスマホなので試験端末として使っても問題はないのですが、動作確認くらいはシミュレータ等でサクッと行いたいところです。
いいシミュレータがないかなと思っていたのですが、Anboxというツールを見つけました。
Anbox
Android in a boxという正式名称でコンテナで動作するシミュレータらしいです。
コンテナとして動かせるのが特徴の様です。
しかしまだベータ版らしく、Google play storeがなかったり、アプリが動かないというケースも多いそうです。
私はAndroidとして本格的に動かしたいわけではなく、自作アプリの動きを見れればいいだけなので、さくっと構築できる方が良いと思い一旦こちらで試してみます。
環境
いつものubuntuで行います。
masashi@PC-ubuntu:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.4 LTS Release: 20.04 Codename: focal
インストール準備
ドキュメントを読むと最初にカーネルモジュールをインストールする必要があるのですが、私の環境ではppaの追加がすんなりとできず、少し困りました。
masashi@PC-ubuntu:~$ sudo add-apt-repository ppa:morphis/anbox-support 詳しい情報: https://launchpad.net/~morphis/+archive/ubuntu/anbox-support [ENTER] を押すと続行します。Ctrl-c で追加をキャンセルできます。 ・・・(略) パッケージリストを読み込んでいます... 完了 E: リポジトリ http://ppa.launchpad.net/morphis/anbox-support/ubuntu focal Release には Release ファイルがありません。 N: このようなリポジトリから更新を安全に行うことができないので、デフォルトでは更新が無効になっています。 N: リポジトリの作成とユーザ設定の詳細は、apt-secure(8) man ページを参照してください。
リポジトリの内容が変わってしまったのか、OSのバージョンの際によるものなのか…
Anboxインストール
youtubeとかを見るとubuntu20.04ではいきなりインストールしていたので私もそのままインストールしてみました。
masashi@PC-ubuntu:~$ sudo snap install --devmode --beta anbox [sudo] masashi のパスワード: anbox (beta) 4-56c25f1 from morphis installed
これだけ。
インストール後もいろいろ設定を変えられそうな気がしますが、アイコンをクリックすれば起動できます。
バージョンは7.1.1と古いです。
が、このまま行ってみましょう。
apkインストール準備
Anboxへのインストールはadb経由で行えるようです。
以前も実機のデバッグの際に使いましたがシミュレータでも上手く使えるのでしょうか。
接続状態
Anboxが起動している状態で接続状態を見ます。
masashi@PC-ubuntu:~$ adb devices List of devices attached emulator-5558 device
シミュレータは認識できている様子。
中に入ってuname叩いてみましたがホスト名がちゃんと出ているので大丈夫そうですね。
masashi@PC-ubuntu:~$ adb shell x86_64:/ $ uname -a Linux anbox 5.4.0-122-generic #138-Ubuntu SMP Wed Jun 22 15:00:31 UTC 2022 x86_64
apkファイルインストール
早速インストールしてみます。
masashi@PC-ubuntu:~$ adb install androidapp/myapp-0.1-arm64-v8a_armeabi-v7a-debug.apk adb: failed to install androidapp/myapp-0.1-arm64-v8a_armeabi-v7a-debug.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]
エラーが出てしまいました。
実機とシミュレータではアーキテクチャが違うようなのでエラーを起こしているようです。
Androidのエミュレーターにapkファイルをインストールしたい
buildozerのspecファイルのarchsにx86_64の設定を追加して再ビルドしました。
python - Building x86 APKs with Kivy / Buildozer - Stack Overflow
# (list) The Android archs to build for, choices: armeabi-v7a, arm64-v8a, x86, x86_64 # In past, was `android.arch` as we weren't supporting builds for multiple archs at the same time. android.archs = arm64-v8a, armeabi-v7a, x86_64
今度はインストール成功。
masashi@PC-ubuntu:~$ adb install androidapp/myapp-0.1-arm64-v8a_armeabi-v7a_x86_64-debug.apk Success
アイコンが追加されました。
アプリ起動
起動画面には進むものの、途中でアプリが落ちてしまいました。
logcatでアプリ周りのログを出してみましたが、pythonのライブラリ関係の不足やchennel破損がどうのというメッセージが出ていますね。
07-24 20:15:27.735 110 122 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=org.test.myapp cmp=org.test.myapp/org.kivy.android.PythonActivity} from uid 10000 on display 0 07-24 20:15:27.750 110 122 I ActivityManager: Start proc 658:org.test.myapp/u0a49 for activity org.test.myapp/org.kivy.android.PythonActivity 07-24 20:15:27.777 658 674 V pythonutil: Unpacking /data/app/org.test.myapp-1/lib/x86_64/libpybundle app 07-24 20:15:27.777 658 674 V pythonutil: Extracting /data/app/org.test.myapp-1/lib/x86_64/libpybundle assets. 07-24 20:15:27.906 110 132 I ActivityManager: Displayed org.test.myapp/org.kivy.android.PythonActivity: +166ms 07-24 20:15:29.510 658 658 V pythonutil: Library loading error: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.test.myapp-1/base.apk"],nativeLibraryDirectories=[/data/app/org.test.myapp-1/lib/x86_64, /data/app/org.test.myapp-1/base.apk!/lib/x86_64, /system/lib64, /vendor/lib64]]] couldn't find "libpython3.5m.so" 07-24 20:15:29.510 658 658 V pythonutil: Library loading error: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.test.myapp-1/base.apk"],nativeLibraryDirectories=[/data/app/org.test.myapp-1/lib/x86_64, /data/app/org.test.myapp-1/base.apk!/lib/x86_64, /system/lib64, /vendor/lib64]]] couldn't find "libpython3.6m.so" 07-24 20:15:29.510 658 658 V pythonutil: Library loading error: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.test.myapp-1/base.apk"],nativeLibraryDirectories=[/data/app/org.test.myapp-1/lib/x86_64, /data/app/org.test.myapp-1/base.apk!/lib/x86_64, /system/lib64, /vendor/lib64]]] couldn't find "libpython3.7m.so" 07-24 20:15:29.512 658 658 V pythonutil: Library loading error: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.test.myapp-1/base.apk"],nativeLibraryDirectories=[/data/app/org.test.myapp-1/lib/x86_64, /data/app/org.test.myapp-1/base.apk!/lib/x86_64, /system/lib64, /vendor/lib64]]] couldn't find "libpython3.9.so" 07-24 20:15:29.515 658 658 E AndroidRuntime: Process: org.test.myapp, PID: 658 07-24 20:15:29.515 110 122 W ActivityManager: Force finishing activity org.test.myapp/org.kivy.android.PythonActivity 07-24 20:15:29.516 110 122 W ActivityManager: Force finishing activity org.test.myapp/org.kivy.android.PythonActivity 07-24 20:15:29.516 110 122 W ActivityManager: Duplicate finish request for ActivityRecord{5f697db u0 org.test.myapp/org.kivy.android.PythonActivity t6 f} 07-24 20:15:29.519 110 146 W InputDispatcher: channel 'e882589 org.test.myapp/org.kivy.android.PythonActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9 07-24 20:15:29.519 110 146 E InputDispatcher: channel 'e882589 org.test.myapp/org.kivy.android.PythonActivity (server)' ~ Channel is unrecoverably broken and will be disposed! 07-24 20:15:29.520 110 123 I WindowManager: WIN DEATH: Window{e882589 u0 org.test.myapp/org.kivy.android.PythonActivity} 07-24 20:15:29.520 110 123 W InputDispatcher: Attempted to unregister already unregistered input channel 'e882589 org.test.myapp/org.kivy.android.PythonActivity (server)' 07-24 20:15:29.520 110 620 I ActivityManager: Process org.test.myapp (pid 658) has died
アプリ動作周りの処理は詳しくないのですが、Androidのバージョンが7系なのもpython関連で怪しいところです。とりあえず現在の切り分けはここまでです。
構築は簡単でよかったですが、このまま調査するか別のシミュレータを探すか迷いますね。