Android APK を逆コンパイルしてテーマを設定する方法

Android アプリを開いて、使用されているカラー テーマが気に入らなかったことはありませんか? たとえば、アプリの白い背景を黒に変更したい場合はどうすればよいでしょうか? 今日は、.APK ファイルを逆コンパイルして内部のファイルを編集し、再コンパイルして Android フォンにインストールする方法を紹介します。

ノート:一部のアプリは、他のアプリよりもテーマを設定するのが困難です。 たとえば、Facebook Messenger は、テーマを設定するのが難しいことで有名です。 編集が最も簡単な Dropbox アプリを例として使用して、このガイドを順を追って説明します。

要件

  1. メモ帳++
  2. APKTool + 最新の AAPT
  3. APKMulti ツール スクリプト
  4. Photoshop / GIMP のようなフォトエディタ
  5. [オプション]ドロップボックス .apk(このガイドに従うため)

上記の test.apk を含め、必要なツールをすべてダウンロードして PC にインストールします。 Dropbox は、テーマを設定しやすいアプリの 1 つであるため、このチュートリアルではそれを使用します。

また、framework-res.apk を電話から PC に転送する必要があります。これは、内部ストレージの /system/framework/ にあります。

APKTool と AAPT を、APK Multi Tool のメイン ディレクトリ内の「Other」フォルダ内にドロップします。

test.apk を APK Multi Tool ディレクトリ内の「Place-apk-here-for-modding」フォルダにドラッグすると、コマンド ターミナルが表示されます。

任意のキーを押して続行すると、多数のオプションを含むターミナル メニューが表示されます。 オプション 24 を選択します。

メインの端末画面に戻りますが、「test.app」がプロジェクトになります。 9 を押して apk を逆コンパイルし、12 を押してテストビルドを実行します。 これは、何かが間違って設定されているかどうかを確認するための良い方法です。 アプリが正しくビルドされたら、2 を押して、表示されるスクリプトを最小化します。

テスト ビルドがチェックアウトされたので、apk の XML コードを編集してみましょう。 慎重にフォローしてください。

解凍した .apk フォルダー内の「res」フォルダーに移動し、「AndroidManifest.xml」を Notepad++ で開きます。 ここで CTRL+F を押して、次の文字列を見つけます。

アンドロイド:背景

「すべて検索」オプションを使用すると、約 190 個の文字列が見つかるはずです。 そのため、アプリの背景色を変更するときに見逃さないように、強調表示されたすべての文字列を確認する必要があります。

文字列「android:background=」@*android:color/white」を含む「Camera_upload_grid.xml」が見つかるまでスクロールします。 その文字列全体をコピーして CTRL+H を押すと、「置換」ダイアログがポップアップします。 文字列を上下の行に貼り付けますが、変更する必要があります。

逆コンパイルされた .apk フォルダー内で、/res/values/colors.xml に移動し、Notepad++ で開きます。 「abs__background_holo_dark」という行を探します。これは間違いなく背景です。 その文字列をコピーし、最初に開いた XML ファイルに戻ります。[置換] ボックスは開いたままにして、コピーしたばかりの文字列を一番下の行に貼り付けます。 したがって、[置換] ダイアログの一番下の行に次のように表示されます。

Android: 背景 =”@color/abs__background_holo_dark

「Replace All」をクリックすると、すべての @android:color/white が background_holo_dark を使用するように変更されます。 引き続き .xml 全体をスクロールし、16 進値 (#fffffff) を使用している android:background 文字列や、先ほど置き換えたもの以外の文字列を探します。 見つかったものについては、新しいもの (abs__background_holo_dark) を使用するように文字列を変更します。

背景を変更したので、テキストの色を変更します。 先ほどと同じ手順に従いますが、今回は「android:textColor」に対して CTRL+F を実行します。 約 166 行が見つかります。

「android:textColor=」#ffbbbbbb」などのように表示されます。Colors.xml をもう一度見て、テキストの色を置き換える行を特定する必要があります。

スクリーンショットと Note++ の検索結果で、android:textColor=”#ffbbbbbb”、”#ffffffff”、”#ff717171”、”#ffcccccc” を確認できます。 Colors.xml をもう一度開いて、テキストの色に使用する行を見つけます。

最初の .xml に戻り、もう一度 [置換] ダイアログで CTRL+H を実行します。 「android:textColor=”#ffbbbbbb」文字列を上下にコピーペーストし、一番下の行を「android:textColor=”@color/text」に変更します。

もう一度、すべての android:textColor 行を検索し、文字列に 16 進値が含まれているものをすべて変更します。 最後に、styles.xml ファイルに到達したら、260 行目から開始して数行下に向けて、数行から反転を削除します。 そのため、これらの文字列から「Inverse」を削除します。

次に、行 527、536、573、579、585、601、およびその他の行にいくつかの 16 進数の値が表示されます。 from ( を置き換えます。 #ffffffff ) に ( @色/テキスト )。

CTRL+F を押して、Notepad++ で cacheColorHint、divider、@*android:color/、および Inverse を検索します。

cacheColorHint はスクロールする背景であるため、背景色が使用されていることを確認する必要があります。 仕切りは自明であり、必要に応じて 16 進値を変更できます。 唯一のことは、@drawable を指すものに触れてはならないということです。 これらは通常、.apk フォルダー内の別の場所に .png ファイルとして保存されている画像です。

「inverse」を検索すると、textAppearanceInverse への参照が表示されます。 これらのそれぞれをダブルクリックして、それらの文字列から逆を削除する必要があります。

最後に、 @*android:color/ の検索は、フレームワークの編集を見逃していないかどうかを再確認します。 「android:popupBackground」>@*android:color/white と表示されている場合は、「android:popupBackground」>@color/abs__background_holo_dark に変更する必要があります。 これには 911 行が含まれますが、これは既に android:color/black を指しているため、混乱を招く可能性があります。

次に res/values/colors.xml を開き、次のように変更します。

次に res/values/styles.xml を開き、328 行目までスクロールします。次のように変更します。

( <style name=”Sherlock.__Theme.Light” parent=”@*android:style/Theme.Light.NoTitleBar”>) should be changed to (<style name=”Sherlock.__Theme.Light” parent=”@*android:style/Theme.Black.NoTitleBar”>)

479 行目も同様に、「light」を「black」に変更します。

res/values-v11/styles.xml に移動し、「Holo.Light」と表示されている「light」を削除します。

次に、多くの文字列を含む res/values-v14/styles を開きます。 したがって、最初の 46 行で「Light」と「Inverse」の参照をすべて削除し、53 行目と 54 行目の親を「@*android:style/Theme.Holo」に変更します。

69 行目の右側の親で、@*android:style/Theme.Holo.Light.Dialog 親から Light を削除します。

これは大変な作業ですよね? これからは、アプリのテーマやスキンにもっと感謝するようになるでしょう!

次に res/color フォルダーに入ります。 黒を指しているテキストファイルがいくつかあります。 res/colors/action_mode_item_text_color_state_list.xml を開く

在庫はこんな感じです。 以下は、あなたがそれを作るために必要な方法です。

/res/colors フォルダー内の次の xml ファイルに同じ変更を加える必要があります。 xml、ss_bottom_bottom_text_color_light.xml、tab_text_foreground.xml。

それらが終わったら、/res/drawable を開くと、背景色を制御する xml があります。 それらを調べて、次のようにします。

他のすべての drawable.xml ファイルに同じ変更を適用します。

test.apk を開き、CTRL キーを押しながら左クリックして smali と AndroidManifest を強調表示し、右クリックして [Edit with Notepad++] を再度選択します。 すべての 1999 smali ファイルに同意します。 読み込まれたら、CTRL+F で -0x100 (黒) を検索します。

約 8 件のヒットが表示されます。目的のヒットは smali/com/dropbox/android/activity/TextEditActivity.smali の 599 行目です。その行をダブルクリックします。

599 行には -0x100 が含まれており、601 行には「SetTextColor」があります。 599行目に一致する変数もあります。簡単に説明すると、-0x100、-0x1000000、さらには0x0は黒を意味し、-0x1000000も黒、さらには0x0です。 次のように、100 から 2 つの 0 を削除し、/high16 を削除して、599 行目を変更します。

次に @*android:style を検索しますが、smali で検索します。 xml では、x の後に余分な「0」が含まれますが、smali では使用しません。 「0x0103004f」ではなく「0x103004f」にする必要があります。

0x103 を含む @*android:style/ を Notepad++ で検索します。

2番目にヒットしたのは「const v7, 0x1030073」です。 Framework-res.apk から public.xml で再度検索します。 「Theme.Holo.Light.Dialog」の ID であることがわかります。 反対のテーマ スタイルの公開 ID に変更する必要があります。

これは Theme.Holo.Light.Dialog なので、これを Theme.Holo.Dialog にします。 Theme.Holo.Dialog の ID は「0x103006f」です。 これにより、ポップアップ ダイアログ アラート ボックスが、明るい Holo.Light ベースのテーマではなく、暗い Holo ベースのテーマを使用するように変更されます。

次に変更する必要があるのは「0x103006e」で、これは Theme.Holo.Light です。 それでは、反対のテーマスタイルにしてください。 Framework-res.apk の public.xml では、Theme.Holo の ID が 0x0103006b であることがわかります。 その行を次のように変更しましょう。

これらのうち、通過するのはあと2つだけです。 次は「0x103000c」で、public.xml の Theme.Light 用です。 その反対は、ThemeHolo ではなく、Theme.Black です。 したがって、public.xml では、Theme.Black の ID が「0x01030008」であることがわかります。これを次のように変更します。

他のアプリでは、他にも編集および変更することがあり、十分な練習をすれば、ほとんどすべてのテーマを変更できるようになります。 しかし、今のところ、すべてのコード ビットが完成しました (ついに!)。

これで、Apk Multi Tool からスクリプトを開き、12 を押してアプリをコンパイルできます。 エラーが表示された場合は、エラー ログで何が問題なのかを調べることができますが、コードの編集中に入力ミスやその他の間違いを犯した可能性が最も高いです。

ビルドが完了したら、2 を押してから 13 を押してアプリに再署名します。

ストック アプリには「Templates」という名前のフォルダーが含まれています。7zip などを使用して、署名されていない apk にドラッグする必要があります。 unsigned.apk を Apk Multi Tool 内の「place-apk-here-for-signing」フォルダーにコピーします。 ターミナル スクリプトで 18 を押して、そのフォルダー内のアプリにバッチ署名します。 完了すると、スクリプトは自動的に終了します。 .apk をデバイスにロードできるようになりました。

次を読む

  • Android通知パネルのテーマを変更する4つの簡単な方法
  • Android システム UI を手動でテーマ設定する方法
  • Android アプリにダーク テーマを含める方法
  • Xposed モジュールを使用して Android のテーマを完全に設定する方法