中華ナビ Android Head Unit の、OBD
から始まるデバイス名じゃないとODBアダプタ使えない問題を何とかする。
具体的には Vgateのアダプタ(Android-Vlink
)を認識させる。
smali byte codeを書くなんて何年ぶりのことか。
準備
javaランタイムとapktool
の準備は省略。
adbつかえるようにするにはこちらの記事。
Head Unit から
|
|
で framework-res.apk
を取得して、apktool
でPCにインストールしておく。
|
|
BT.apk 取り出し
ファームウェア更新セットの AllAppUpdate.bin
を .zip
として展開する。
展開パスワードは 048a02243bb74474b25233bda3cd02f8
である。
よくわからんがそういう事になっている。
zip中の app/190043001_com.syu.bt/190043001_com.syu.bt.apk
を apktool d
でデコードする。
このapk自体はHead Unitから adb pull /oem/app/190043001_com.syu.bt/190043001_com.syu.bt.apk
して取得してもいいと思う。
|
|
で 190043001_com.syu.bt/
に様々がデコードされる。
コード修正
注目のファイルは smali/com/syu/app/ipc/IpcObj.smali
。
注目する箇所は "OBD"
で検索。
例えばここ。
.line 734
sget v4, Lcom/syu/ipcself/module/main/Main;->mConf_PlatForm:I
const/4 v7, 0x5
if-ne v4, v7, :cond_7
.line 735
const-string v4, "OBD"
invoke-virtual {v3, v4}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
move-result v4
if-nez v4, :cond_6
const-string v4, "gooddriver"
invoke-virtual {v3, v4}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
move-result v4
if-nez v4, :cond_6
mConf_PlatForm
が 0x5
の場合、デバイス名が OBD
あるいは gooddriver
で始まっているかどうかを確認している、というコードである。
で、mConf_PlatForm
ってなによって調べるとどうも AndroidManifest.xml
の
|
|
のことらしく、 9853
はなんなのかというと
smali/com/syu/ipcself/module/main/Main.smali
に記述が見つけられるのだが
.field public static final PlatForm_3188:I = 0x2
.field public static final PlatForm_6025:I = 0x6
.field public static final PlatForm_786:I = 0x4
.field public static final PlatForm_8700:I = 0x3
.field public static final PlatForm_9853:I = 0x8
.field public static final PlatForm_E7:I = 0x1
.field public static final PlatForm_PX5:I = 0x7
.field public static final PlatForm_Sophia:I = 0x5
9853
は 0x8
で、0x5
になるのは Sophia
ということみたい。
実際のコードは
.line 61
:cond_4
const-string v0, "Sophia"
invoke-virtual {v0, p0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_5
.line 62
const/4 v0, 0x5
sput v0, Lcom/syu/ipcself/module/main/Main;->mConf_PlatForm:I
という感じになってたのであってる。
というわけで9853
なわけだからここは変えなくても良さそうではあるが、一応Android-Vlink
でもOBDアダプタであることを認識できるように追加しておく。
.line 734
sget v4, Lcom/syu/ipcself/module/main/Main;->mConf_PlatForm:I
const/4 v7, 0x5
if-ne v4, v7, :cond_7
.line 735
const-string v4, "OBD"
invoke-virtual {v3, v4}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
move-result v4
if-nez v4, :cond_6
const-string v4, "Android-Vlink"
invoke-virtual {v3, v4}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
move-result v4
if-nez v4, :cond_6
const-string v4, "gooddriver"
invoke-virtual {v3, v4}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
move-result v4
if-nez v4, :cond_6
こうでしょうな。
本当に修正が必要なのは次のようなSophia
(0x5
)じゃなかった場合の分岐後、つまり :cond_7
の部分。
.line 737
:cond_7
const-string v4, "OBD"
invoke-virtual {v3, v4}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
move-result v0
goto :goto_2
デバイス名がOBD
で始まってるかどうかをv0
につっこんでjumpしてるんで、Android-Vlink
かどうかも見るように修正する。
:cond_7
const-string v4, "OBD"
invoke-virtual {v3, v4}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
move-result v0
if-nez v0, :cond_4
const-string v4, "Android-Vlink"
invoke-virtual {v3, v4}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
move-result v0
goto :goto_2
多分こんな感じ。
似たような箇所が複数あるので全部修正する。
リビルド
で、apktool b
でapkに戻して差し替える…んだけど以下のようにただビルドしただけではシステムにアプリとして認識されなかった。
|
|
XDAなどで調べた結果、どうもリソースがおかしくなるみたいなので
|
|
という具合にリソースの解体をせずに展開し、改変したclasses.dex
だけ差し替えて再構築する。
Head Unit では /oem/app/190043001_com.syu.bt/
に apk があるので
|
|
で完了
BTアプリでAndroid-Vlink
とペアリングができるようになった。
ペアリング後のデバイス名としてはOBDII
が割り当てられる模様。
一応、デバイス名がOBDII
である激安OBD2アダプタでもペアリングできたので良さそう。
修正まとめ
|
|