この手順の目次
このページでできること

端末の識別、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接続とビルドを確認する

BASH · PC
# 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.modelSH-02E
ro.build.display.id02.00.06
ro.build.version.release4.1.2
uname -r3.4.0

adb devicesが空ならUSBケーブル・USBデバッグ・ホスト側のデバイス権限を確認する。offlineならまずUSBを接続し直す。別機種・別ビルドが表示された場合は、以降のカーネル固有値を流用しない。

3. 変更前の状態を記録する

BASH · 無送信
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ライセンスは自分で内容を確認する。

BASH · Linux x86_64
# 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パスは自分の成果物であり、このサイトからのダウンロードではない。更新インストールには以前と同じ署名鍵が必要。

BASH · 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用の手順ではない。

BASH · 無送信
# 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.model

get-stateがdeviceとなり、SH-02Eが返ることを確認してからUSBを抜く。PCでつながっていても、別の中継サーバーのADBは別プロセスなので、そこで接続確認が必要。端末のIPはDHCP予約などで固定する。

この段階では、まだ赤外線リモコンの準備完了ではない。送信モジュール・アプリ・権限が必要になる。端末の再起動後にはWi-Fi ADBとモジュールの両方が失われる可能性がある。

技術記事へ戻る →次:カーネルと赤外線信号の調査 →