この手順の目次
端末の識別、USB / Wi-Fi ADB接続、ビルド道具の確認まで。純正状態のSH-02Eを、このページのコマンドだけでリモコン化できるわけではありません。特権初期化・送信モジュール・Androidアプリの実験ソース一式は未配布です。
1. 用意するもの
- SH-02E(実験で確認したbuildは02.00.06)。データ通信できるUSBケーブル。
- Linux PCとADB。コマンド例はBashで実行する。
- 送信対象の家電と正常な物理リモコン。採取と動作確認に使う。
- API / Web UIを使う場合はLAN内のLinuxサーバー。端末アプリだけなら不要。
USBデバッグを端末の開発者向け設定で有効にする。古いAndroidではメニューや認証の挙動が現行機種と異なる。ADBの公式資料も確認する。
2. USB接続とビルドを確認する
# Debian / Ubuntu系の例。既に導入済みならインストールは不要
sudo apt-get update
sudo apt-get install adb python3 make gcc git unzip zip kmod binutils ripgrep
adb version
adb devices -l
# 表示されたSH-02Eの識別子を入力する。複数接続時も対象を明示する
read -rp 'SH-02E serial: ' PHONE_SERIAL
export PHONE_SERIAL
adb -s "$PHONE_SERIAL" shell getprop ro.product.model
adb -s "$PHONE_SERIAL" shell getprop ro.build.display.id
adb -s "$PHONE_SERIAL" shell getprop ro.build.version.release
adb -s "$PHONE_SERIAL" shell uname -r| 確認項目 | この実験での結果 |
|---|---|
| ro.product.model | SH-02E |
| ro.build.display.id | 02.00.06 |
| ro.build.version.release | 4.1.2 |
| uname -r | 3.4.0 |
adb devicesが空ならUSBケーブル・USBデバッグ・ホスト側のデバイス権限を確認する。offlineならまずUSBを接続し直す。別機種・別ビルドが表示された場合は、以降のカーネル固有値を流用しない。
3. 変更前の状態を記録する
mkdir -p evidence
adb -s "$PHONE_SERIAL" shell cat /proc/version > evidence/kernel-version.txt
adb -s "$PHONE_SERIAL" shell cat /proc/modules > evidence/modules-before.txt
adb -s "$PHONE_SERIAL" shell ls -l /dev/msm_shirda /dev/ttyHS0 \
> evidence/ir-nodes-before.txt
# この時点で /dev/sh02e_ir がないのは正常。独自モジュールのノードである。
cat evidence/ir-nodes-before.txtこれらは観測コマンドであり、GPIOを切り替えない。生のdumpsysや全getpropには端末識別情報が含まれることがあるので、公開用の資料とは分けて保存する。
4. APKビルド用の道具を揃える
Android Studioまたは公式command-line toolsを導入し、sdkmanagerを使えるようにする。次はこの実験で利用したバージョン。表示されるSDKライセンスは自分で内容を確認する。
# SDKを配置したパスを入力する
read -rp 'Android SDK directory: ' ANDROID_SDK_ROOT
export ANDROID_SDK_ROOT
export ANDROID_NDK_HOME="$ANDROID_SDK_ROOT/ndk/23.1.7779620"
"$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" \
'platform-tools' 'platforms;android-34' \
'build-tools;34.0.0' 'ndk;23.1.7779620'
# JDK 11を用意し、Java実行時にも使用する
read -rp 'JDK 11 directory: ' JAVA_HOME
export JAVA_HOME
export PATH="$JAVA_HOME/bin:$ANDROID_SDK_ROOT/platform-tools:$PATH"
java -version
javac -version
# API16 ARMv7のコンパイラが存在するか確認する
IR_CC="$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi16-clang"
test -x "$IR_CC" && "$IR_CC" --version今回のアプリはJava source/target 8、D8のmin-api 16、API16向けARMv7 JNIでビルドした。compile SDK 34を使っていても、実行端末がAndroid 34になるわけではない。JDK 21ではD8の処理に失敗したため、JDK 11を使用した。
自分でビルドしたAPKを用意できた段階で、署名と導入を確認する。下のAPKパスは自分の成果物であり、このサイトからのダウンロードではない。更新インストールには以前と同じ署名鍵が必要。
read -rp 'Your built APK path: ' IR_APK
"$ANDROID_SDK_ROOT/build-tools/34.0.0/apksigner" verify \
--verbose --min-sdk-version 16 "$IR_APK"
# Android 4.1で使えるv1署名が有効か、出力を確認する
adb -s "$PHONE_SERIAL" install -r "$IR_APK"5. Wi-Fi ADBへ切り替える
端末とサーバーを信頼する同じLANにつなぐ。端末のWi-Fi設定画面でIPアドレスを調べ、USB接続中に次を実行する。adb pairは今回のAndroid 4.1用の手順ではない。
# USBで接続しているPC上
adb -s "$PHONE_SERIAL" tcpip 5555
# ここからは今後ADBで操作するLinuxホスト上でも実行する
read -rp 'Phone LAN IP: ' PHONE_IP
export PHONE_ADB="$PHONE_IP:5555"
adb connect "$PHONE_ADB"
adb -s "$PHONE_ADB" get-state
adb -s "$PHONE_ADB" shell getprop ro.product.modelget-stateがdeviceとなり、SH-02Eが返ることを確認してからUSBを抜く。PCでつながっていても、別の中継サーバーのADBは別プロセスなので、そこで接続確認が必要。端末のIPはDHCP予約などで固定する。
この段階では、まだ赤外線リモコンの準備完了ではない。送信モジュール・アプリ・権限が必要になる。端末の再起動後にはWi-Fi ADBとモジュールの両方が失われる可能性がある。