paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

Androidシミュレータに自作apkをインストールする (アプリ起動は失敗)

以前自作apkファイルを作成したのですが、試験環境がなく実機にインストールしてデバッグを行っていました。
サブのスマホなので試験端末として使っても問題はないのですが、動作確認くらいはシミュレータ等でサクッと行いたいところです。
いいシミュレータがないかなと思っていたのですが、Anboxというツールを見つけました。

Anbox

anbox.io

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関連で怪しいところです。とりあえず現在の切り分けはここまでです。
構築は簡単でよかったですが、このまま調査するか別のシミュレータを探すか迷いますね。