Microsoft に買収されることでおなじみの Skype さんですが、Android 版も待望のビデオチャット対応です。
※ただし特定の機種に限る
- Google Nexus S
- HTC Desire S
- Sony Ericsson Xperia neo
- Sony Ericsson Xperia pro
4機種だけかよ。
Galaxy SII 対応してないよ!!!
ご承知のとおり、Galaxy SII はフロントカメラが200万画素で今まで類を見ないまともなフロントカメラがあるのにビデオチャット対応してないとはどういう事だ!
よろしい、ならば改造だ。
これやった後から知ったのですが xda には改造済みのファイルが落ちているそうです。
だがしかし、通信もできて電話帳にもアクセスできて一歩間違えば大流出祭りに繋がりかねないアプリでどっかの知らない人が改造した怪しい apk をインストールすることはやめたほうがいいんじゃないかなとか思います(個人の感想です)。
さて、以下は機種判定を回避する考え方です。
まずマーケットから正しく Skype をダウンロードします。
com.skype(中略).apk を apktool で分解して、対応しているという Nexus S で検索します。
const-string v1, "{white:[{name:\"HTC Saga\", mft:\"(?i)HTC\", \t board:\"(?i)saga\", \tmodel:\"(?i)HTC saga\", product:\"(?i)htc_saga\", \t\t\t\t\tdevice:\"(?i)saga\"},{name:\"HTC Desire S\", mft:\"(?i)HTC\", \t board:\"(?i)saga\", \tmodel:\"(?i)HTC Desire S\", product:\"(?i)htc_saga\", \t\t\t\t\tdevice:\"(?i)saga\"},{name:\"Nexus S\", mft:\"(?i)samsung\", \t board:\"(?i)herring\", \tmodel:\"(?i)Nexus S\", \t product:\"(?i)soju\", \t\t\t\t\tdevice:\"(?i)crespo\"},{name:\"Nexus S 4G\", \t\t\t\tmft:\"(?i)samsung\",\t brand:\"(?i)google\",board:\"(?i)herring\",\tmodel:\"(?i)Nexus S 4G\",\t product:\"(?i)sojus\",\t\t\t\t\t\t\tdevice:\"(?i)crespo4G\"},{name:\"Sony Ericsson Xperia Neo\",mft:\"(?i)Sony Ericsson\",brand:\"(?i)SEMC\",board:\"(?i)unknown\", \tmodel:\"(?i)MT15[ai]\", product:\"(?i)MT15[ai]_.*\",\t\t\t\t\t\tdevice:\"(?i)MT15[ai]\"},{name:\"Sony Ericsson Xperia Pro\",mft:\"(?i)Sony Ericsson\",brand:\"(?i)SEMC\",board:\"(?i)unknown\", \tmodel:\"(?i)MK16[ai]\", product:\"(?i)MK16[ai]_.*\",\t\t\t\t\t\tdevice:\"(?i)MK16[ai]\"}]}"
こんな感じで機種名を判定している元の部分を発見(mk.smali)。
難読化されていて読みにくいのですが、その後
sget-object v9, Landroid/os/Build;->MANUFACTURER:Ljava/lang/String;
invoke-virtual {v9, v3}, Ljava/lang/String;->matches(Ljava/lang/String;)Z
move-result v3
if-eqz v3, :cond_6
sget-object v3, Landroid/os/Build;->BOARD:Ljava/lang/String;
invoke-virtual {v3, v4}, Ljava/lang/String;->matches(Ljava/lang/String;)Z
move-result v3
if-eqz v3, :cond_6
sget-object v3, Landroid/os/Build;->MODEL:Ljava/lang/String;
invoke-virtual {v3, v6}, Ljava/lang/String;->matches(Ljava/lang/String;)Z
move-result v3
if-eqz v3, :cond_6
sget-object v3, Landroid/os/Build;->PRODUCT:Ljava/lang/String;
invoke-virtual {v3, v7}, Ljava/lang/String;->matches(Ljava/lang/String;)Z
move-result v3
if-eqz v3, :cond_6
sget-object v3, Landroid/os/Build;->DEVICE:Ljava/lang/String;
invoke-virtual {v3, v8}, Ljava/lang/String;->matches(Ljava/lang/String;)Z
move-result v3
if-eqz v3, :cond_6
以下略
機種名とか色々判定して適合しない(v3がゼロ)場合 cond_6 に飛ばしているようです。
難読化しても標準の API を呼び出す部分はそのままなのでバレバレです。
さて、適合した場合はどうなるのでしょう
:cond_1
const/4 v0, 0x1sput-boolean v0, Lcom/skype/lx;->f:Z
const-class v0, Lcom/skype/pi;
invoke-virtual {v0}, Ljava/lang/Class;->getName()Ljava/lang/String;
どうやら cond_1 以降でなんだかよく分からないけど bool 値(Z)に 0x1 を突っ込んでるので機種判定OKなフラグなんでしょう。
ということで、先程の判定部分で cond_6 に飛ばしている部分を cond_1 に飛ばすように変えて apktool で組み立てなおして自分で署名して元の Skype をアンインストールしてインストールし直したのが冒頭の画像です。
試した限りではフロントカメラとリアカメラの切り替えとか完全に動作してると思います。
正直改造するの面倒くさいのでさっさと正式対応してもらいたいものです。