DexPatcher を使用すると、開発者は Java を使用して APK にパッチを適用できます。 これにはいくつかの利点があり、DexPatcher の使用は従来の Smali アプローチよりもはるかに簡単です。
おそらく、解像度に合わせてパッチを適用したダイヤラーや、機能が追加されたカスタム WhatsApp バージョンなど、変更されたアプリケーションを見たり、インストールしたりしたことがあるでしょう。 では、開発者はどうやってそれを行うのでしょうか? 多くの場合、アプリケーションのソース コードは入手できませんが、どのように機能するのでしょうか? まずそれを確認し、次にプロセスを大幅に簡素化することを目的とした新しいツールを見て、最後に人気のある Xowned フレームワークと比較して、それらがどのように異なるかを確認します。
APK が通常どのように変更されるかについて聞いたことがあるかもしれません -- 開発者は自分自身を マトリックスを使用して、Smali ですべてを見始め、Smali の力を使って物事を変更する能力を獲得します。 ソース。 電話が終わったら電話をかけるだけで十分です。その時点で、ピカピカの新しい APK を共有する準備が整います。
もっと真剣に…最初から始めましょう。 Android アプリケーションの改造に慣れていない場合は、smali とは何なのか疑問に思うかもしれません。 開発者は通常、Java プログラミング言語を使用して Android アプリをコーディングします。 次に、プログラム (コンパイラー) がそのコードをデバイスに適した別の形式に「変換」し、その結果、アプリケーション パッケージ (または APK) 内に含まれる .dex ファイルが作成されます。
その時点で、元のソース コードにはアクセスできなくなります (開発者であるか、アプリケーションがオープン ソースでない限り)。 ただし、デバイスにインストールされているのは APK です。 そこから dex ファイル (通常はclasses.dex) を取得し、それを理解できる形式に変換して戻すことができます。 そこで、より読みやすく忠実な翻訳である smali が登場します。 さらに一歩進んで Java に変換し直すこともできますが、そのプロセスは十分忠実ではありません。 理解できる結果ですが、一部の詳細が失われるため、逆に翻訳することはできない可能性があります。 途中で。 言い換えれば、デバイスにインストールするために再度 APK に戻すことはできないため、行った変更は無駄になります。少なくとも多大な努力が必要です。
smali/baksmali は実際には dex 形式のアセンブラ/逆センブラです。アイスランド語で文字通りの意味です。 ただし、「Smali」というときは、通常、smali が理解できる形式を指します (これは指示だと考えてください) 私たち人間にとってすべてが必要なわけではないとしても、あらゆる細部を定義するため、より冗長になります。 ジャバ)。 また、上記の説明は少し簡略化されていますが、理解しやすいものであることに注意してください。
では、開発者は (ソースにアクセスせずに) アプリを変更するには何をする必要があるでしょうか? プロセスはおおよそ次のとおりです。
- APK を (Web またはデバイスから) 取得します。
- 次のようなものを使用します apktool APK を Smali に逆コンパイルします。 (apktool smali/baksmali を使用しますが、APK の逆コンパイルと再構築がはるかに簡単になり、XML ファイルなどのリソースのデコードも処理します)。
- APKからclasses.dexを抽出し、使用します。 dex2jar 最後に、(不完全で、壊れていることが多いですが、ほとんど理解できる) Java コードを取得するための Java デコンパイラです。 (これはオプションですが、Smali は理解するのがはるかに難しいため、役立つ場合があります。)
- 何を変更するかを特定します。
- 実際に変更するには、Smali コードを直接編集します。
- あるいは、Java で変更を記述し、それをコンパイルし、再度 Smali に逆コンパイルして、結果の Smali コードをコピーします。
- すべて終わったら使用してください apktool もう一度APKを再構築します。
- APK に署名します (作成者の身元を確認するため; すべてのパッケージは署名されている必要があります)、最後にインストールします。
Smali コードを記述するのは非常に難しく、エラーが発生しやすくなります。 Smali では小さな変更を加えることができますが、新しい機能を追加するのはより困難です。 さらに、コンパイル時エラーは発生しないため、タイプミスであっても実行時にのみ検出される可能性があります。 差分は特定の APK バージョンに非常に固有である傾向があるため、Smali パッチの展開と共有も面倒な場合があります。 上記で説明したプロセスの一部を簡単にするツールがいくつか存在しますが、ヴァーチャス テン スタジオ 思い浮かびます)、それでも面倒になる可能性があります。
XDA 上級メンバーによる DexPatcher ランション は、プロセスを簡素化し、開発者が Smali の処理を完全に回避できるようにすることで、これらの問題を解決することを目的としています。 代わりに、開発者は Java だけでパッチを作成し、DexPatcher に他のすべてを処理させることができます。
これには、パッチ ファイルが読みやすく管理しやすいという主な利点があります。 APK へのパッチ適用も全体的により便利になります。 DexPatcher の使用方法の完全な例については後で説明しますが、最初に DexPatcher が提供するものの概要を簡単に説明します。
- オープンソース.
- クロスプラットフォーム: Linux、Mac、Windows で実行できる必要があります。
- パッチ ファイル: 加えた変更は Java パッチ ファイルに含まれており、個別に共有できます。
- ジャワ:スマリ語ではありません。
また、ビルド時のエラー チェックの利点も得られるため、開発サイクルの早い段階でバグが発見されます。 コンパイルされた Java は、通常のコンパイル時チェック (元の APK シンボルへのアクセス付き) を提供し、DexPatcher によって強制されます。 パッチ適用時のソースとパッチの互換性、役立つ情報の提供、何かをしていると思われる場合の警告の表示 合法だけど怪しい。
それに加えて、DexPatcher には次のセットが付属しています。 ヘルパースクリプト (Linux でのみ利用可能ですが、他のプラットフォームにも移植できます)。 これらは、ワークスペースのセットアップ、ターゲット APK のクラスとリソースの抽出、クラスの Java ( CFR Java デコンパイラ は後者に使用されます)、完了したら最後にパッチを適用した APK をビルドして署名します。
例を見てみましょう (Linux 上):
DexPatcher スクリプトをインストールする
$# Make a directory where we can test stuff out and enter it.$ mkdir xda-test
$cd xda-test
$ git clone https://github.com/Lanchon/DexPatcher-scripts.git dexpatcher # Clone the DexPatcher helper scripts repo.
$cd dexpatcher
$ chmod +x dxp-* # Not necessary, but for clarity: we need to make sure the files we'll call later are executable.
DexPatcher スクリプトの構成
開ける dxp.config お気に入りのテキスト エディターで、システムに合わせて必要な変数を変更してください。 代わりに、次の行を Android SDK のインストール場所を指すように変更するだけです。
dxp_android_sdk_dir=(~/android/sdk)
(DexPatcher は、利用可能な最高のプラットフォーム バージョンを自動的に選択します。 さらに、他の構成オプションを変更して、バンドルされているデフォルトの代わりに独自のバージョンの一部のツールを使用するようにすることもできます。)
アクセスを容易にするために、 デエクスパッチャー 私たちのディレクトリへ パス、または異なるものにシンボリックリンクすることもできます dxp-* スクリプトを既に存在する場所にコピーします。 パス、 のような ~/ビン:
export PATH=$PWD:$PATH
アプリケーションを変更する
この例では、シンプルなオープンソース アプリケーションを使用します。 もちろん、この特定のケースでは、ソース コードに直接パッチを適用することも可能ですが、それはまったく面白くありません。
basil2style の「Get ID」アプリケーションを取り上げます。これは、デバイスに関する詳細を表示するアプリケーションです。 私たちの目標は、「デバイス ID」の「コピー」ボタンを変更し、代わりにこの ID を共有させることです。
- まず、変更する APK をダウンロードしましょう。 IDの取得.
- アプリケーションを逆コンパイルします。
- 後で APK に署名するために使用する署名キーを作成します。
ヘルパー スクリプトを使用して、シェル経由ですべてを実行することもできます。
$cd dexpatcher # Go to our working directory.$ curl -O https://f-droid.org/repo/makeinfo.com.getid_1.apk # Download the APK.
$ dxp-setup-for-apk makeinfo.com.getid_1.apk # Unpack and decompile the APK.
$cd makeinfo.com.getid_1 # Go to the newly created directory where everything is unpacked/decompiled to.
$ dxp-create-keystore # Create the APK signing key. Press 6 times (or fill out the info), then "yes".
そこにはいくつかの異なるディレクトリがあることがわかります。
- デコードする: デコードされたリソースと Smali がここにあります。 apktool.
- 送信元: 空のディレクトリ。 ここにパッチ ファイルを配置します。
- src-cfr:ここです 参照 アプリを(エラーとともに)逆コンパイルしました。 何を変更するかを決定するために調べるのに適しています (上記のデコード ディレクトリからのリソースとその ID も必要になる場合がありますが、この特定の例では必要ありません)。
- src-cfr-nodecode: 上記と同じですが、空のスタブのみが含まれています (コードはなく、スケルトンのみ)。 後で説明するように、これらのファイルをパッチのベースとして使用できます。
前に述べたように、デバイス ID の [コピー] ボタンを変更して、代わりに ID テキストを共有したいと考えています。 ソース コードを見てみると、[デバイス ID のコピー] ボタン (デバイスコピー) オンクリック イベントは匿名クラスによって処理されます src-cfr/makeinfo/com/getid/MainActivity.java. ここで変更することもできますが、匿名クラスには数値名が付いているため、通常は別の方法を見つける方が良いでしょう (MainClassName$SomeNumber、例えば メインアクティビティ$3) バージョン間で予期せず変更される可能性があります。
代わりに、を変更して独自のクラスをイベントに登録します。 主な活動 クラス。 まず、「スケルトン」バージョンをコピーしましょう。 src-cfr-nocode/makeinfo/com/getid/MainActivity.java に src/makeinfo/com/getid/MainActivity.java (それを思い出してください 送信元 パッチが存在する場所です)。 (必要に応じて、完全なコードを含むバージョンをコピーすることもできます。これは完全に好みの問題です。)
次のように編集できるようになりました。
- DexPatcher アノテーションに必要なインポートを追加します。
importlanchon.dexpatcher.annotation.*;
- クラスを編集していることを示すタグを追加します。 また、パッチ クラスのメンバーのデフォルト アクションを次のように設定します。 無視するこれは、メンバーが Java コンパイル中にコードによって参照されるために存在しますが、DexPatcher によって無視されることを意味します。
@DexEdit(defaultAction=DexAction.IGNORE)publicclassMainActivity
// The reference to ActionBarActivity will be satisfied by symbols
// extracted from the app when we build the patch.
extendsActionBarActivity{
- さらに、空のボディをコンストラクターに追加し、 作成時 メソッドと、使用する予定の他のすべてのメソッド (パッチが実際に適用されるときは無視されることに注意してください。必要に応じてここで参照できるように追加しているだけです)。 単に追加することもできます ネイティブ 代わりにキーワード。
- 興味があれば、この時点ですでにパッチをビルドできます。
$ dxp-make # Output: `patched.apk`.
とてもシンプルですよね? ただし、続けていきましょう。まだ終わっていません。 - 編集しましょう 作成時 今、自分自身を設定するために OnClickListener これにより、デバイス ID をクリップボードにコピーする代わりに共有できるようになります。
// Rename the target method so that we can still call it (the original)// if needed.@DexEdit(target="onCreate")protectedvoidsource_onCreate(Bundlevar1){}// Add our new custom method.@Override@DexAddprotectedvoidonCreate(Bundlevar1){// Call the original method:source_onCreate(var1);// Replace the text and handler:device_copy.setText("Share");device_copy.setOnClickListener(newDeviceCopyOnClick());}// Note that we don't use an anonymous class to avoid nameclashing with// MainActivity$1, which already exists.// We also could've defined a nested MainActivity.Patch class and used// an anonymous class in MainActivity.Patch.onCreate(), and then called// MainActivity.Patch.onCreate() from MainActivity.onCreate().@DexAddclassDeviceCopyOnClickimplementsView.OnClickListener{@OverridepublicvoidonClick(Viewobject){if(MainActivity.this.val){Intentintent=newIntent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_SUBJECT,"Device ID");intent.putExtra(Intent.EXTRA_TEXT,device.getText().toString());startActivity(Intent.createChooser(intent,"Share Device ID"));}else{Toast.makeText(MainActivity.this.getApplicationContext(),"Nothing to Share",0).show();}}}
- もう終わったようです! 完全なパッチは次のようになります。 これ. これで、パッチを当てた APK をビルドしてインストールできるようになりました。
$ dxp-make$ adb install patched.apk
- 結果を見てみましょう:
(サンプルコードを手伝ってくれた Lanchon に感謝します!)
Xused は非常に人気があり、それには十分な理由があります。開発者にとってもユーザーにとっても、MOD の構築、共有、インストールがはるかに簡単になります。 DexPatcher と Xused にはいくつかの違いがあり、どちらかを優先する人もいます。
- Xused は、実行時にメソッドをフックし、開発者がメソッドの前、後、またはメソッドの代わりに何かを実行できるようにすることで魔法を発揮します。 一方、DexPatcher は実行前にすべてを変更し、スタンドアロンの変更された APK を生成します。 -- メソッドの前、後、またはメソッドの代わりにコードを実行することは依然として可能であり、実際には追加のコードがいくつかあります。 自由。
- スタンドアロン APK を作成するということは、外部フレームワークに依存しないことを意味します。 これは、ユーザー アプリの変更に root が必要ないことも意味します。
- DexPatcher を使用して新しい APK を作成したため、別の方法で署名されます。 つまり、ユーザーは元の作成者から公式アップデートを受け取ることができず、署名がチェックされていると Google Apps などのアプリで問題が発生する可能性があります。
- モジュールと DexPatcher パッチのソース コードはどちらも簡単に配布および変更できます。 それぞれに少し慣れてくると、多くの類似点も共有されます。
DexPatcher については十分に説明しました。 次はあなたが試してみる番です。 DexPatcher フォーラム スレッド すぐに始めましょう!