j3iiifn’s blog

ネットワーク、インフラ、プログラミングについての備忘録

ラズパイでadbコマンドを使いたいだけなのにDebianパッケージをビルドする羽目になった

やりたいこと

下記の環境でadb (Android Debug Bridge) コマンドを使いたい。

環境

$ 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日くらい費やした。