パスワードを忘れた? アカウント作成
6269278 journal
Android

h-fujitaの日記: [すまほ][P-01D][テザリング] P-01D 亡霊からの解脱の手順(書き換え編) 14

日記 by h-fujita

ということで、P-01Dにいたテザリングの亡霊を除霊することができたみたいなので、
その手順をここにかきます。

あくまでも自己責任でおねがいします
(ほんとはあまり好きな言い回しではないんですが。。。でも、やはりこれは言う必要が、、、)
書き換えるのは、「Settings.apk」という1個のapkファイルです。

手順は、まずは概要にそって書いていきます。
●前準備
0、まず、イメージをバックアップしておきましょう。また、 /system/app/Settings.apkを適当な場所にコピーしておきましょう。また、rootもとっておきましょう。rootが取れない人、とらなくていい人は、APN切り替えとかFixAPNで十分ですので、それをつかいましょう。(じゃなんであるんだ(ぉ
 ただし、APN切り替えやFixAPNのアプリを使う場合は、ソフトウエアを最新版に更新しておいてください。初期バージョンのソフトウエアでは、Settings.apkによるAPN切り替えが強力であるため、これらのアプリを使っても強引に亡霊が取りつく場合があります。その場合、テザリングのON/OFが繰り返され(テザリングマークがぱかぱか点滅する)、最終的には亡霊に取りつかれた状態でおわります。(この段落、Wikiにもかいておいてくれるとうれしいかも)

以下、手順です。この手順をふむと、あぷりを使わなくても、標準のテザリング機能で対応可能です。確認したのは062(初期バージョン)、および 068(最新バージョン) です。

1、ここの記事(simロック解除の記事)を参考にAPKをばらします。ソース(smail)レベルまでデコンパイルします。

2、もうひとつデコンパイルしたソースを用意します。ここの記事(Javaソースの取り出し方)を参考に、Javaソースレベルまでデコンパイルします。

●改変するソースの特定
3、"dcmtrg"をキーワードに、Javaソースの方で検索を行います。検索すると、いくつかのソースが引っ掛かると思います。引っ掛かるのは以下のファイルです。
  ・wifi\WifiApEnabler.smali
  ・TetheringStateChangeBroadcastReciver.smali
  ・TetherSettings.smali

●改変
4、2でデコンパイルしたJavaソースを参照しながら、1.でデコンパイルしたsmailファイルを変更します。変更方法は、行頭に#を書いてコメントアウトをするというものです。Windowsで作業をする場合は、Notepad(Windows標準のノートパッド)を使う方がよいでしょう。(他のエディタだと、再コンパイルできない場合があります)
4-1. ソースの変更箇所は以下のようになります。
 コメントアウトは、Javaソースと見比べながら行いましょう。
 コメントアウト箇所は、かなり長くなる場合があります。

コメントアウトの基本方針
    "dcmtrg"という文字列を含むメソッドは、大別して以下の2つがあります。
  ・"dcmtrg"を含むAPN情報をDBに書き込む処理 「 CreateTetheringApn 」
  ・"dcmtrg"を「テザリング時のAPN」として選択し、変更する処理 
   「 findTetherApnId 」「 getPreferredApn 」「 changePreferedApn 」
 このうち、DBに書き込む処理は、メソッドのなかを全部コメントアウトします。 
 一方、"dcmtrg"を選択する処理は、メソッドの中の一部のルーチンとして書かれてますので、コメントアウトの範囲の判定が難しくなります。しかし、一連の処理を行っている箇所ばかりですので、おいかければなんとかなります。その際の追いかける元ネタとして、Javaレベルまでデコンパイルしたソースを使います。
ソースコードは、それぞれのバージョンでかなりことなります。そのため、解析には Javaレベルまでデコンパイルしたソースを使っておいかけるようにしてください。

一応、変更箇所は下においておきます。バージョンは、最初期の07.0087.0062のものです。
新しいバージョンでは、変更箇所は微妙に違っています。(情報有り。) 少なくとも、 ".line"の数字はバージョンごとに異なりますので注意してください。あくまでも、「処理」をおいかけてコメントアウトするようにしてください。ちなみに こっちがv0.68です
#もっとぶっちゃけいうともう一台ほしい!ところなんですが、、誰か安く譲って・・・

----------------------------------------------------------
wifi\WifiApEnabler.smali
(#でコメントアウトします)

----------------------------------------------------------
.method validateWifiTether()V
----------------------------------------------------------
      .line 360

        #invoke-direct {p0}, Lcom/android/settings/wifi/WifiApEnabler;->findTetherApnId()Ljava/lang/String;
        #move-result-object v3
        #if-nez v3, :cond_2

        #.line 361
        #invoke-direct {p0}, Lcom/android/settings/wifi/WifiApEnabler;->CreateTetheringApn()V

        #.line 364
        #:cond_2
        #invoke-direct {p0}, Lcom/android/settings/wifi/WifiApEnabler;->findTetherApnId()Ljava/lang/String;
        #move-result-object v3
        #iput-object v3, p0, Lcom/android/settings/wifi/WifiApEnabler;->mTetheringApnId:Ljava/lang/String;

        #.line 365
        #iget-object v3, p0, Lcom/android/settings/wifi/WifiApEnabler;->mTetheringApnId:Ljava/lang/String;
        #invoke-direct {p0, v3}, Lcom/android/settings/wifi/WifiApEnabler;->changePreferedApn(Ljava/lang/String;)V

        .line 367
----------------------------------------------------------
他のバージョンでも、 同じメソッドのところをコメントアウトします。しかし、APNの強制切り替えは、新バージョンではしていません。
====================================================================================

----------------------------------------------------------
TetheringStateChangeBroadcastReciver.smali
----------------------------------------------------------
----------------------------------------------------------
.method private CreateTetheringApn()V
----------------------------------------------------------
.method private CreateTetheringApn()V
        .locals 5
        .prologue

        return-void ← この行を挿入

        const/4 v4, 0x0
        .line 153
----------------------------------------------------------
----------------------------------------------------------
TetheringStateChangeBroadcastReciver.smali
----------------------------------------------------------
.method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V
(#でコメントアウトします)
----------------------------------------------------------
        .line 83
        .restart local v5 #cm:Landroid/net/ConnectivityManager;
        .restart local v7 #i$:I
        .restart local v10 #mWifiManager:Landroid/net/wifi/WifiManager;
        .restart local v16 #tetherable:[Ljava/lang/String;
        .restart local v17 #tethered:[Ljava/lang/String;
        .restart local v18 #usbAvailable:Z
        .restart local v19 #wifiApState:I
        :cond_4

        #invoke-direct/range {p0 .. p0}, Lcom/android/settings/TetheringStateChangeBroadcastReciver;->findTetherApnId()Ljava/lang/String;
        #move-result-object v20
        #if-nez v20, :cond_5

        #.line 84
        #invoke-direct/range {p0 .. p0}, Lcom/android/settings/TetheringStateChangeBroadcastReciver;->CreateTetheringApn()V

        #.line 86
        #:cond_5
        #invoke-direct/range {p0 .. p0}, Lcom/android/settings/TetheringStateChangeBroadcastReciver;->findTetherApnId()Ljava/lang/String;
        #move-result-object v20
        #move-object/from16 v0, v20
        #move-object/from16 v1, p0
        #iput-object v0, v1, Lcom/android/settings/TetheringStateChangeBroadcastReciver;->mTetheringApnId:Ljava/lang/String;

        #.line 87
        #invoke-direct/range {p0 .. p0}, Lcom/android/settings/TetheringStateChangeBroadcastReciver;->getPreferredApn()Ljava/lang/String;
        #move-result-object v20
        #move-object/from16 v0, p0
        #iget-object v0, v0, Lcom/android/settings/TetheringStateChangeBroadcastReciver;->mTetheringApnId:Ljava/lang/String;
        #move-object/from16 v21, v0
        #invoke-virtual/range {v20 .. v21}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
        #move-result v20
        #if-nez v20, :cond_3

        #.line 89
        #move-object/from16 v0, p0
        #iget-object v0, v0, Lcom/android/settings/TetheringStateChangeBroadcastReciver;->mTetheringApnId:Ljava/lang/String;
        #move-object/from16 v20, v0
        #move-object/from16 v0, p0
        #move-object/from16 v1, v20
        #invoke-direct {v0, v1}, Lcom/android/settings/TetheringStateChangeBroadcastReciver;->changePreferedApn(Ljava/lang/String;)V
        #goto :goto_2

        .line 92
----------------------------------------------------------

これは、ソースコードでは、以下のような処理をする箇所です。
                findTetherApnId() でAPNを検索。
                なければ、 CreateTetheringApn()でAPN(亡霊つき)を作成
                再度 findTetherApnId()でAPNを検索

ここをコメントアウトすることが目的となります。後期バージョンでは、変数名がv20からv21になっています。
==================================================================
----------------------------------------------------------
TetherSettings.smali
----------------------------------------------------------
.method private CreateTetheringApn()V
----------------------------------------------------------
.method private CreateTetheringApn()V
        .locals 5

        .prologue

        return-void ← この行を挿入

        const/4 v4, 0x0

        .line 536

----------------------------------------------------------

これはUSBテザリング時の対応です。が、後期バージョンではいりません。
==================================================================================

●再コンパイル
5、変更したソースを再コンパイルします。再コンパイルは、smailファイルの方でおこないます。
1で示したリンク先のURLを参考に、再コンパイルします。

●アップロード
6、1で示したリンク先のURLを参考に、アップロードします。 

●再起動
7、再起動します。

●確認
8、テザリングをおこなってみます。きりかえが起こらなければ成功です。

できるひと、いるのかなぁ。。。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • うちでそのまま配布すると問題ありそうなバイナリファイルを配布する際、WDiff for Windows95の自己展開アップデートモジュール機能を利用して、
    オリジナルのsetting.apkからの差分、というような扱いでやってたりしますね

    • コメントありがとうございます。とはいえ、もともとが、「わかる人向け」なので、バイナリ差分をだすのはちょっとはばかります。
      自分自身としても、人に何かを伝えるドキュメントを作る練習にもなるので、できるだけここで説明して、手順がふめるようになれば、とおもいます。
      親コメント
  • by Anonymous Coward on 2012年09月13日 0時28分 (#2230448)

    こんにちは、rootスレでよくお目にかかります。 rootすれで成功レポ出させて頂きましたが、しばらくテザ機能使っておらず、最近なにげにテザON
    したら接続出来なくなってしましました。 他のなにを弄ってたかも失念しています。 それでも 「APN切り替え」「FixAPN」では接続できます。
    実際に、テザもxxx解除も使っておらず困らないのですが、もともと純粋な技術的興味でやったので、気になります。 前にあpしましたv0.68の
    Settings.apk でコンパイルソース改変箇所はあってますでしょうか ?? 他に見るべき設定とかありますでしょうか??
    IIJmio/D v0.68 です。

    • こんにちは。接続できない状態というのはどのような状態でしょうか。そこが詳しくわかるとあいがたいです。
      接続中に、3Gのマークが消える状態でしょうか。電源OFF→再度電源ONをするとどうでしょうか?
      それと、自分も、じつは0.68でも検証しています(というか利用しています。)。0.68での検証部分について確認と、コメントアウト箇所を別途投稿します。お手数をかけます。
      親コメント
      • by Anonymous Coward

        >接続中に、3Gのマークが消える状態でしょうか。
        テザON にすると WiFiマークは点いて3Gマークが消えます。

        >電源OFF→再度電源ONをするとどうでしょうか?
        テザOFFになっていますから、ONにすると一瞬3Gマークが点きますが、すぐに消えます。

        • 亡霊に取り付かれてる、、、感じですねぇ。そうすると、よりきちっと退治がいるような。その退治をしたものをかきました。
          親コメント
          • by Anonymous Coward

            あれま、v0.68用見ましたが、弄るファイル増えてるし。
            前に1個だけ弄ったファイルの コメントアウト箇所 増えてるし。

            どれ、やってみっか。

            • すみません。v0.68での、自分の変更点です。亡霊の退治をけっこうやってます。あと、APNについては、デフォルトのAPNを決めておく必要があるかと。
              親コメント
              • by Anonymous Coward

                rootスレ >>996 です。

                >>987さんと同じでやったらうまくいきました。 こちらは all v0.68ですが、貴方の環境v0.62で、v0.62は手強いとも伺っておりますので、その差があるのかも知れません。

                >デフォルトのAPN~
                これはどういう意味でしょうか ?? 手持ちf-12cのテザは framework-res.apk を弄るタイプですが、CWMリストアとかでユーザデータ初期化すると、「設定- 新規APN」 の画面が出てこないことがあり、1回だけ「APN設定ショートカット」等のツールで*直接*設定画面を呼び出してAPN設定しなければなりません。 1回設定すると次回から「設定- 新規APN」 の画面が出てきます。 これとは違いますよね。

              • デフォルトのAPNというのは表現が適切ではなかったかもしれません。 普段使うAPNを選択しておく、というものです。
                あと、自分の場合は、APN情報は消しています。自分はぷららモバイルなのですが、そのAPN以外のAPNは完全にけしています。
                v0.68の方が楽といえば楽、でしょうか。。
                親コメント
              • by Anonymous Coward

                >普段使うAPNを選択しておく
                のは
                >そのAPN以外のAPNは完全にけしています
                ので、そうしておく ですよね ??

                ウチのは(full v0.68 ) docomo純正のAPN残してます(消してない)けど、v0.62はそうしないとダメ??。

                早く v0.68 にあぷでしましょうよ。 確かv0.62のオリジナルCWMイメージDLされましたよね。

              • あぷでしたいのはやまやまです(^^; が、いかんせん、一月からいじりすぎたもので、あぷでがしっぱいしまくり。その結果が「もういっこほしい」とかいう書き込みになってしまいました。。。
                親コメント
              • あと、自分はMVMOしか使わないときめてたので、docomoのAPNもばっさりけしています。。
                親コメント
              • by Anonymous Coward

                v0.62 のCWMイメージお持ちだと思います。 CWM導入しているとして、
                1)CWM で v0.62イメージ をリストア
                2)通常起動しUSBストレージモードにして、「.swupdate」あれば削除、「download」フォルダにドコモからDLしたUpdateファイルをコピー
                3)fastboot で起動、>fastboot boot boot.img で(shell root)起動する。
                4)recoveryエリアをオリジナルに書き戻し
                5)通常起動して、 「機能バージョンアップ」>「microSDから更新」

                エアでやると失敗率高くなるようです。 て素人++ の私が言うことではないですね。失礼しました。

                1)をスキップしても、とにかく v0.68 にあぷでさえしてしまい、v0.68のCWMイメージをすかさず書いてしまえばよいかと。
                fastbootがあるのでまず文鎮にはならないです。

typodupeerror

私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike

読み込み中...