Android 12 の Fabricated Overlay API はルートレス テーマを復活させます

Android 8 でデバイスのテーマ設定が簡単になったことを覚えていますか? それがどれほど楽しかったか覚えていますか? さて、Android 12 では、ひねりが加えられて戻ってきました。

完全な安定 アンドロイド12 リリースが目前に迫っており、Google は ソースコードを投稿しました AOSP リポジトリに追加します。 あります Android 12 の新機能これには、Fabricated Overlays と呼ばれるリソース オーバーレイへの追加が含まれます。 システムが使用される動的な変更を管理するのに役立つ API として意図されていたもの マテリアル・ユー そして、monet は、少なくとも Android 13 がリリースされるまでは、もっと大きなものになるかもしれません。

背景

Mishaal Rahman がこの新しい API を発見し、私の注意を引き付けてくれました。 彼は、シェル コマンドを使用して、Android 12 のさまざまなリソース値をテストしていました。 彼は、オーバーレイ APK を手動でコンパイルすることができ、root 化されたデバイス向けの興味深いアプリのアイデアになるかもしれないと考えました。 彼がこのことに注意を向けてくれたとき、私は Android 12 のソース コードをよく調べて、非常に興味深いと思うことに気づきました。 見つけたものをテストした結果、ここに到達しました。結局のところ、Fabricated Overlay API を使用してルートレス テーマを復活させることができることがわかりました。 ここで何が起こっているのかを詳しく説明する前に、製造されたオーバーレイが実際には何であるかを説明します。

加工オーバーレイとは何ですか?

Fabricated Overlay は、Android 12 で導入された新機能です。 これらは、Android が数年前から備えている古典的なランタイム リソース オーバーレイ (RRO) に似ています。 RRO と製造されたオーバーレイは両方とも、さまざまなアプリケーションのさまざまなリソースをオーバーライドできます。 ブール値を false から true (またはその逆) に変更したり、ステータス バーの大きさを設定したりできます。

ただし、製造されたオーバーレイには RRO との顕著な違いがいくつかあります。 まず、オーバーレイ APK を生成してインストールする必要がありません。 代わりに、どのアプリケーションのどの値を変更したいかを Android に指示するだけで、Android が変更をオーバーレイとして登録し、その後有効にすることができます。

また、RRO よりも少し制限されています。 Android 11 より前では、RRO はブール値、整数、ディメンション、属性、レイアウト、さらには生データ ファイルなど、ほとんどすべてのリソースをオーバーライドできました。 Android 11 では、RRO の動作方法にいくつかの変更が加えられ、レイアウトのオーバーライドは実際には不可能になりましたが、RRO は全体的により安定しました。

一方、製造されたオーバーレイは、整数として表現できる値のみをオーバーライドできます。 これには、整数 (当然のこと)、次元、ブール値、色が含まれます。 これらを使用して生データのリソース、レイアウト、文字列、配列をオーバーライドすることはできません。少なくとも簡単にはできません。 これは API における任意の制限です。TypedValue クラスで定義された整数値とリソース カテゴリのみを受け入れます。 TypedValue は次のことを行います サポート 文字列やその他のリソース タイプは参照されますが、そのリソースを参照するだけであり、実際のデータは保持されません。

ただし、これらの制限は、Fabricated Overlays の意図された目的、つまりマテリアル ユーとモネ効果にとってはそれほど大きな問題ではありません。 製造されたオーバーレイを使用すると、再起動したり、APK がコンパイルされるのを待ったりすることなく、システムが色と寸法のオーバーレイをその場で簡単に生成して適用できるようになります。

さて、通常、これは root 化されたデバイスを持つ人々が利用できるもう 1 つの優れた API です。 メーカーが作成した抜け穴 (Synergy が Samsung デバイスで利用しているような抜け穴) がない限り、オーバーレイをインストールできるのは root アクセス権を持つサードパーティだけです。 しかし、それが最良の部分です -- Google は Android 12 の穴を修正するのを忘れていました。

ルートなしで製造されたオーバーレイ

Android 8 では新しいオーバーレイ マネージャー サービス (OMS) API が導入され、オーバーレイ APK を通常のアプリとしてインストールし、ADB を使用して有効にできることがすぐにわかりました。 残念なことに、Google は Android 9 でこれにパッチを適用し、それ以降、システムと同じキーで署名されたオーバーレイのみを動的にインストールできるようになりました。

結局のところ、Android 12 の Fabricated Overlay には、Android 8 に存在した抜け穴を彷彿とさせる抜け穴があります。つまり、root アクセスや署名レベルの権限が必要ありません。 登録するには、シェル ユーザー (つまり ADB) として実行されるものが必要なだけです。

Google が Fabricated Overlays にルート ユーザーとシステム ユーザーのみがアクセスできるようにすることを意図していたことは明らかです。 これらを作成するための ADB コマンド実装があり、実行ユーザーが root でない場合は実行されません。 抜け穴は、チェックが実際の API ではなくコマンド内でのみ行われることです。つまり、少しの作業でそれを利用できることになります。

ADB オンデバイス

Android には長い間、ワイヤレス ADB 機能がありました。 これにより、コンピュータ (または ADB バイナリとネットワーク アクセスを持つあらゆるもの) がデバイスにワイヤレスで接続できるようになります。 これは主に、ユーザーがアクセスできる USB 接続を持たない Android デバイスを対象としています。 スマートウォッチとテレビ。 さらに、Android 11 より前は、有線 ADB 接続が必要でした。 ワイヤレスモード。

Android 11 は、ワイヤレス ADB を携帯電話やタブレットに正式に導入したものです。 ペアリングと認証コードが必要なため、従来のワイヤレス ADB よりも少し複雑ですが、ユーザーは完全にデバイス上でアクティブ化できます。 デバイスが WiFi に接続されている限り。 つまり、デバイスから ADB を介してデバイスに接続でき、必要なのは WiFi だけです 繋がり。

アプリでの昇格された API の使用

アプリで制限された API を使用する理由はたくさんあります。 通常、それは必要な特別な機能を提供するためです。 必要な API にシェル コマンドが実装されていれば、アプリからそれを使用するのは非常に簡単です。 必要なのは、root (または ADB) としてシェル プロセスを作成し、適切なコマンドを実行し、結果があればそれを解析することだけです。

API にシェル実装がない場合、またはシェル実装に必要なものが欠けている場合はどうすればよいでしょうか? root化されたデバイスを使用している場合は、次のようなものを使用できます libRootJava. libRootJava を使用すると、アプリが root ユーザーとして実行されているかのように Android フレームワーク API を操作できます。 これは、すべて同じ言語で実行され、文字列を手動で解析することを心配する必要がないため、シェル コマンドを実行するよりも便利で、はるかに高速です。 いくつかの制限がありますが、ほとんどの場合、うまく機能します。

libRootJava API は非常に柔軟です。 root ではなくシェル ユーザーとして実行するように調整することもできます。 ありがたいことに、そうする必要はありません。なぜなら、誰かがすでにそれを作成しており、その名前が付けられているからです。 しずく. Shizuku は、Magisk Manager と libRootJava を組み合わせたようなものです。

Shizuku Manager アプリは、Shizuku がアクセスできるシェル ユーザーとして実行されるプロセスをセットアップする手順を案内します。 Shizuku API ライブラリをアプリに実装すると、シェル ユーザーであるかのようにシステム API にアクセスできるようになります。 これは、Shizuku API ライブラリを実装するすべてのアプリが使用できるようになる前に、Shizuku を 1 回セットアップするだけで済むため、libRootJava よりもはるかに集中化されたプロセスです。 Shizuku がどのように機能するか、またそれをアプリにどのように統合できるかに興味がある場合は、 ここにそのためのガイドがあります.

雫と加工オーバーレイ

ここまで来ると、おそらくこれがどこへ向かうのかがわかるでしょう。 Shizuku のようなサービスを使用して、シェル ユーザーとして Fabricated Overlays API にアクセスできます。また、Android 11 のワイヤレス ADB 機能を使用して、すべてオンデバイスでシェル レベルのアクセスを取得できます。 root ユーザー制限は Fabricated Overlays シェル コマンドにのみ存在し、実際の API には存在しないため、これを直接使用するにはシェル ユーザーとして実行するだけで十分です。

実装: ライブラリとサンプル アプリ

実装の詳細についてはどうですか? そうですね、それについてもサポートさせていただきます。

これに備えて、両方を作成しました ライブラリと完全に機能するサンプルアプリ そのライブラリを使用します。

図書館自体は主に利便性を目的としています。 これは、非表示のシステム API の一部をラップし、Shizuku 権限を処理するための便利なメソッドをいくつか提供します。 また柔軟性にも優れているため、別の取得方法がある場合は、IOverlayManager API の独自のインスタンスを提供できます。

サンプル アプリでは、Shizuku を使用してライブラリを実装する方法を示します。 これも完全に機能的で便利なアプリです。 メイン ページには、現在登録されている、このページを通じて作成された Fabricated Overlay がターゲット アプリごとにグループ化されて表示されます。 そこから有効化、無効化、削除することもできます。

下部にある「オーバーレイを追加」ボタンをタップすると、オーバーレイ可能なすべてのアプリのリストが表示されます。 検索またはスクロールして必要なものを見つけてタップします。 次に、画面の下部にある「追加」ボタンを押すと、そのアプリでオーバーライドできるリソースのリストが表示されます。 リソースを選択し、その値を設定し、変更する値の数だけ繰り返します。 「保存」ボタンを押し、名前を入力して確認すると、メイン画面に戻り、新しいオーバーレイが表示され、有効にする準備が整います。

Mishaal Rahman 氏に感謝して、アプリのスクリーンショットをいくつか紹介します。

余談ですが、私は...と呼ばれる一般的なオーバーレイマネージャーアプリも持っています。 オーバーレイマネージャー。 プリコンパイルされたアプリ自体は 私のPatreonでのみ利用可能、 しかし ソースコードは無料で入手できます それをコンパイルまたは変更したい人へ。

結論

Android 12 の新しい Fabricated Overlays API は非常に優れており、その主な理由は root を必要としないことです。 完全な RRO APK ほど洗練されていないかもしれませんが、root アクセスなしでより高い柔軟性が得られます。

GitHub で Fabricate Overlay アプリを確認してください

Android 12 を実行しているデバイスをお持ちで、これを試してみたい場合は、上にリンクされている GitHub リポジトリをチェックしてください。 「リリース」セクションには、ダウンロードして使用するための APK が含まれています。 このライブラリは、JitPack を使用して独自のアプリケーションに簡単に組み込むことができます。

もちろん、この機能が長く続くと期待すべきではありません。 Google はサードパーティのオーバーレイをあまり好まないため、Android 13 のリリース時にはほぼ間違いなく修正されるでしょう。 ただし、それが続く間は楽しんでください。