やりたいこと
下記の環境でadb (Android Debug Bridge) コマンドを使いたい。
環境
- 機種: Raspberry Pi 2 Model B
- OS: Ubuntu 18.04.4 LTS
$ uname -a Linux raspi 4.15.0-1061-raspi2 #65-Ubuntu SMP PREEMPT Thu Apr 9 18:13:20 UTC 2020 armv7l armv7l armv7l GNU/Linux
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
前提
adbコマンドは sudo apt install adb
でインストールした。
$ sudo apt install adb Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: android-libadb android-libbase android-libboringssl android-libcrypto-utils android-libcutils android-liblog The following NEW packages will be installed: adb android-libadb android-libbase android-libboringssl android-libcrypto-utils android-libcutils android-liblog 0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded. Need to get 731 kB of archives. After this operation, 1586 kB of additional disk space will be used. Do you want to continue? [Y/n] Y (略)
事象
adb devices
コマンドを実行すると User key '/home/USERNAME/.android/adbkey' does not exist...
というエラーが出て、ADBサーバが起動しない。
$ adb devices List of devices attached * daemon not running; starting now at tcp:5037 ADB server didn't ACK Full server startup log: /tmp/adb.1000.log Server had pid: 6482 --- adb starting (pid 6482) --- adb I 05-04 19:46:06 6482 6482 main.cpp:57] Android Debug Bridge version 1.0.39 adb I 05-04 19:46:06 6482 6482 main.cpp:57] Version 1:8.1.0+r23-5~18.04 adb I 05-04 19:46:06 6482 6482 main.cpp:57] Installed as /usr/lib/android-sdk/platform-tools/adb adb I 05-04 19:46:06 6482 6482 main.cpp:57] adb I 05-04 19:46:06 6482 6482 adb_auth_host.cpp:416] adb_auth_init... adb I 05-04 19:46:06 6482 6482 adb_auth_host.cpp:262] User key '/home/USERNAME/.android/adbkey' does not exist... adb I 05-04 19:46:06 6482 6482 adb_auth_host.cpp:109] generate_key(/home/USERNAME/.android/adbkey)... * failed to start daemon error: cannot connect to daemon
原因
この人と同じ症状。
Alignment Error and Bus Error when freshly installing adb on minimal 18.04 - ODROID
こちらの不具合報告によると、 android-libboringssl
パッケージの不具合が原因で鍵生成時にクラッシュしているらしい。
Bug#933865: adb crashes on startup with SIGBUS
解決策
上記の不具合報告に記載されている2つのパッチを当てた android-libboringssl
パッケージを作成してインストールする。
具体的な手順は上記の記事には書かれていなかったので、Debianパッケージのカスタマイズ方法を自分で調べながらやってみた。
参考にした記事
手順
android-libboringssl
パッケージのビルドに必要なパッケージをインストールする。
$ sudo apt install -y build-essential devscripts $ sudo apt build-dep android-libboringssl
android-libboringssl
パッケージのソースコードをダウンロードする。
$ mkdir ~/source/android-libboringssl -p $ cd ~/source/android-libboringssl $ apt source android-libboringssl $ cd android-platform-external-boringssl-8.1.0+r23/
1つ目のパッチの通りに編集する。
$ vim linux-arm/crypto/fipsmodule/bsaes-armv7.S
2つ目のパッチの通りに編集する。
$ vim src/crypto/fipsmodule/aes/asm/bsaes-armv7.pl
パッチを作成する。
$ dpkg-source --commit
作成されたパッチは以下のような内容になる。
$ cat debian/patches/bug933865 Bug#933865: adb crashes on startup with SIGBUS https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1692751.html (省略) --- android-platform-external-boringssl-8.1.0+r23.orig/linux-arm/crypto/fipsmodule/bsaes-armv7.S +++ android-platform-external-boringssl-8.1.0+r23/linux-arm/crypto/fipsmodule/bsaes-armv7.S @@ -92,7 +92,7 @@ _bsaes_decrypt8: adr r6,_bsaes_decrypt8 vldmia r4!, {q9} @ round 0 key -#ifdef __APPLE__ +#if defined(__thumb2__) || defined(__APPLE__) adr r6,.LM0ISR #else add r6,r6,#.LM0ISR-_bsaes_decrypt8 @@ -583,7 +583,7 @@ _bsaes_const: _bsaes_encrypt8: adr r6,_bsaes_encrypt8 vldmia r4!, {q9} @ round 0 key -#ifdef __APPLE__ +#if defined(__thumb2__) || defined(__APPLE__) adr r6,.LM0SR #else sub r6,r6,#_bsaes_encrypt8-.LM0SR @@ -1018,7 +1018,7 @@ _bsaes_encrypt8_bitslice: _bsaes_key_convert: adr r6,_bsaes_key_convert vld1.8 {q7}, [r4]! @ load round 0 key -#ifdef __APPLE__ +#if defined(__thumb2__) || defined(__APPLE__) adr r6,.LM0 #else sub r6,r6,#_bsaes_key_convert-.LM0 --- android-platform-external-boringssl-8.1.0+r23.orig/src/crypto/fipsmodule/aes/asm/bsaes-armv7.pl +++ android-platform-external-boringssl-8.1.0+r23/src/crypto/fipsmodule/aes/asm/bsaes-armv7.pl @@ -746,7 +746,7 @@ $code.=<<___; _bsaes_decrypt8: adr $const,_bsaes_decrypt8 vldmia $key!, {@XMM[9]} @ round 0 key -#ifdef __APPLE__ +#if defined(__thumb2__) || defined(__APPLE__) adr $const,.LM0ISR #else add $const,$const,#.LM0ISR-_bsaes_decrypt8 @@ -845,7 +845,7 @@ _bsaes_const: _bsaes_encrypt8: adr $const,_bsaes_encrypt8 vldmia $key!, {@XMM[9]} @ round 0 key -#ifdef __APPLE__ +#if defined(__thumb2__) || defined(__APPLE__) adr $const,.LM0SR #else sub $const,$const,#_bsaes_encrypt8-.LM0SR @@ -953,7 +953,7 @@ $code.=<<___; _bsaes_key_convert: adr $const,_bsaes_key_convert vld1.8 {@XMM[7]}, [$inp]! @ load round 0 key -#ifdef __APPLE__ +#if defined(__thumb2__) || defined(__APPLE__) adr $const,.LM0 #else sub $const,$const,#_bsaes_key_convert-.LM0
パッケージをビルドする。
$ debuild -us -uc
パッケージが作成されたことを確認する。
$ ls -1 ../*.d*eb ../android-libboringssl-dbgsym_8.1.0+r23-2~18.04_armhf.ddeb ../android-libboringssl-dev_8.1.0+r23-2~18.04_armhf.deb ../android-libboringssl_8.1.0+r23-2~18.04_armhf.deb
インストール済みの android-libboringssl
パッケージをアンインストールしてから、先程ビルドしたパッケージをインストールする。
$ sudo apt remove -y android-libboringssl $ sudo apt install -y ../android-libboringssl_8.1.0+r23-2~18.04_armhf.deb
android-libboringssl
パッケージのアンインストール時に一緒にadbまでアンインストールされてしまったので、改めてインストールし直す。
$ sudo apt install -y adb
最後に adb devices
コマンドを実行して、ADBサーバが起動することを確認する。
$ adb devices List of devices attached * daemon not running; starting now at tcp:5037 * daemon started successfully
まさかadbコマンドのためにこんなに苦労するとは思わなかった…
この記事だけ見るとあっさり解決したように見えるかもしれないが、実際は調査と試行錯誤に丸3日くらい費やした。