This page looks best with JavaScript enabled

JOYING Android 10.0 Head Unit BT.apk の改変

 ·   4 min read

中華ナビ Android Head Unit の、OBDから始まるデバイス名じゃないとODBアダプタ使えない問題を何とかする。

具体的には Vgateのアダプタ(Android-Vlink)を認識させる。

smali byte codeを書くなんて何年ぶりのことか。

準備

javaランタイムとapktoolの準備は省略。
adbつかえるようにするにはこちらの記事

Head Unit から

1
2
adb connect 192.168.0.201 # Head Unit のIPアドレス
adb pull /system/framework/framework-res.apk

framework-res.apk を取得して、apktool でPCにインストールしておく。

1
java -jar apktool.jar if framework-res.apk

BT.apk 取り出し

ファームウェア更新セットの AllAppUpdate.bin.zip として展開する。
展開パスワードは 048a02243bb74474b25233bda3cd02f8 である。
よくわからんがそういう事になっている。

zip中の app/190043001_com.syu.bt/190043001_com.syu.bt.apkapktool d でデコードする。
このapk自体はHead Unitから adb pull /oem/app/190043001_com.syu.bt/190043001_com.syu.bt.apk して取得してもいいと思う。

1
java -jar apktool.jar d 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_PlatForm0x5 の場合、デバイス名が OBD あるいは gooddriver で始まっているかどうかを確認している、というコードである。

で、mConf_PlatForm ってなによって調べるとどうも AndroidManifest.xml

1
<meta-data android:name="platform" android:value="9853"/>

のことらしく、 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

98530x8で、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に戻して差し替える…んだけど以下のようにただビルドしただけではシステムにアプリとして認識されなかった。

1
java -jar apktool.jar b -c 190043001_com.syu.bt -o new_190043001_com.syu.bt.apk

XDAなどで調べた結果、どうもリソースがおかしくなるみたいなので

1
2
3
4
mv 190043001_com.syu.bt 190043001_com.syu.bt.mod
java -jar apktool.jar d -rs 190043001_com.syu.bt.apk
cp 190043001_com.syu.bt.mod/classes.dex 190043001_com.syu.bt/
java -jar apktool.jar b -c 190043001_com.syu.bt -o new_190043001_com.syu.bt.apk

という具合にリソースの解体をせずに展開し、改変したclasses.dexだけ差し替えて再構築する。

Head Unit では /oem/app/190043001_com.syu.bt/ に apk があるので

1
2
3
4
5
6
adb push new_190043001_com.syu.bt.apk /sdcard/
adb shell
su
mount -o remount,rw /oem
cp /sdcard/new_190043001_com.syu.bt.apk /oem/app/190043001_com.syu.bt/190043001_com.syu.bt.apk
reboot

で完了

BTアプリでAndroid-Vlinkとペアリングができるようになった。
ペアリング後のデバイス名としてはOBDIIが割り当てられる模様。

一応、デバイス名がOBDIIである激安OBD2アダプタでもペアリングできたので良さそう。

修正まとめ

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
diff -u 190043001_com.syu.bt/smali/com/syu/app/ipc/IpcObj.smali.orig 190043001_com.syu.bt/smali/com/syu/app/ipc/IpcObj.smali
--- 190043001_com.syu.bt/smali/com/syu/app/ipc/IpcObj.smali.orig	2021-08-26 21:28:47.684442300 +0900
+++ 190043001_com.syu.bt/smali/com/syu/app/ipc/IpcObj.smali	2021-08-26 22:11:52.413976200 +0900
@@ -1702,6 +1702,14 @@

     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
@@ -1755,6 +1763,14 @@

     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

     .line 745
@@ -1910,10 +1926,20 @@

     if-nez v4, :cond_5

+    .line 817
+    const-string v4, "Android-Vlink"
+
+    invoke-virtual {v2, v4}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
+
+    move-result v4
+
+    if-nez v4, :cond_5
+
     .line 815
     const/4 v0, 0x0

     .line 820
+    :cond_8
     :goto_1
     if-eqz v0, :cond_7

@@ -1936,6 +1962,14 @@

     move-result v0

+    if-nez v0, :cond_8
+
+    const-string v3, "Android-Vlink"
+
+    invoke-virtual {v2, v3}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
+
+    move-result v0
+
     goto :goto_1

     .line 823
@@ -2068,10 +2102,20 @@

     if-nez v4, :cond_5

+    .line 785
+    const-string v4, "Android-Vlink"
+
+    invoke-virtual {v2, v4}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
+
+    move-result v4
+
+    if-nez v4, :cond_5
+
     .line 783
     const/4 v0, 0x0

     .line 788
+    :cond_8
     :goto_1
     if-eqz v0, :cond_7

@@ -2092,6 +2136,14 @@

     invoke-virtual {v2, v3}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z

+    move-result v0
+
+    if-nez v0, :cond_8
+
+    const-string v3, "Android-Vlink"
+
+    invoke-virtual {v2, v3}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
+
     move-result v0

     goto :goto_1
Share on

Avatar
WRITTEN BY
northeye
Takuo Kitame. A Software Engineer.