Android
 Computer >> コンピューター >  >> システム >> Android

Android の省エネを実現:AOSP の低電力アイランドにおける Bluetooth ソケット設定の役割

Android の省エネを実現:AOSP の低電力アイランドにおける Bluetooth ソケット設定の役割

これを想像してみてください。あなたはカフェに座っていて、ラップトップを開いて、テーブルの上に携帯電話を置き、数分ごとにスマートウォッチが鳴り、Bluetooth イヤホンで音楽を再生しているとします。あなたから見ると、人生は平和です。携帯電話の観点から見ると、携帯電話は常に膨大な数の小さな Bluetooth パケットを処理していることになります。

時計が歩数を同期するたび、イヤホンが別の音声を受信するたび、バックグラウンド デバイスがチェックインするたび、携帯電話内のメイン アプリケーション プロセッサが強制的に起動し、データを確認し、そのデータをどう処理するかを決定し、その後スリープに戻ります。それを数千回繰り返すと、突然、その素晴らしい 5,000 mAh バッテリーが疑わしいほど小さく感じられ始めます。

Android エンジニアはこのパターンを見て、Bluetooth の小さな機能ごとに大きな CPU を起動しなかったらどうなるだろうか、と基本的に言いました。メイン CPU がリラックスしている間に、退屈な繰り返しの Bluetooth トラフィックを処理するだけの仕事をする小さなヘルパーの脳があるとしたらどうなるでしょうか?まさにそこに、通常は LPI と短縮される低電力アイランドの概念が登場します。

最新の Android Bluetooth アーキテクチャでは、特に AOSP 16 世代以降では、Bluetooth の作業のかなりの部分を、Bluetooth 無線の近くにある専用の低電力プロセッサにオフロードできます。この小さなプロセッサは Bluetooth コントローラまたは SoC に組み込まれており、非常に効率的に動作するように設計されています。消費電力はメイン CPU よりもはるかに少なく、完全なアプリケーション プロセッサのようにバッテリーを消耗することなく起動したままにすることができます。 Android の仕事は、どのトラフィックがこのアイランドに存在できるか、どのトラフィックが依然としてメイン CPU を必要とするかを決定することです。

しかし、Android は実際にどのようにしてその決定を下すのでしょうか?ここで、Bluetooth ソケットと BluetoothSocketSettings と呼ばれるものが登場します。

通常のアプリでは、BluetoothSocket を開くと、バイトを送受信できるようにパイプを開いているだけのように感じます。しかし内部では、フレームワークはさらに深い質問をしています。このパイプはメイン CPU を起動する大きな高速道路を通過する必要がありますか、それともこのパイプは低電力アイランドの私道ネットワークに直接接続できるでしょうか?

最新の AOSP Bluetooth スタックでは、その質問に対する答えは、BluetoothSocketSettings という小さな構成オブジェクトを通じて表現されます。このクラスを使用すると、システム レベルのコードでソケットがどのように動作するかを記述できます。データを通常のホスト パスに保持するか、低電力プロセッサで終わるハードウェア データ パスにオフロードするかを指定できます。

内部には DATA_PATH_NO_OFFLOAD のようなフィールドがあります。 と DATA_PATH_HARDWARE_OFFLOAD 、および hubId などの追加情報 、endpointIdrequestedMaximumPacketSize これは、コントローラーが LPI 世界でパケットをルーティングする方法を理解するのに役立ちます。

外側から見ると、通常の BluetoothSocket を扱っているように見えます。ただし、Bluetooth フレームワーク内では、そのソケットに追加のメタデータがタグ付けされ、Bluetooth スタックに静かに通知します。「これは特別です。アイランドに送信します。」

次に、ホスト スタックは、LPP オフロード マネージャーと呼ばれる Bluetooth システムの新しいコード層とソケット固有の HAL (ハードウェア アブストラクション レイヤー) と通信します。これにより、低電力プロセッサは、ソケットがオープンまたはクローズされるたびに通知され、データの処理に対する責任を主張できるようになります。

したがって、カフェに例えると、以前はすべての Bluetooth 顧客がメインのバリスタに直接注文を叫びました。 Low Power Island と BluetoothSocketSettings を使用すると、Android は「これらの通常のエスプレッソ注文は、サイド カウンターのジュニア バリスタを経由できます。奇妙なカスタム ドリンクだけが引き続きメイン バリスタに送られます」と言うことができます。ユーザーにとっては同じ Bluetooth エクスペリエンスですが、カウンターの後ろでの混乱や無駄なエネルギーがはるかに少なくなります。

この記事では、この高レベルの話から実際の Android API に焦点を当てていきます。 BluetoothSocketSettings がフレームワークでどのように定義されているか、ハードウェア オフロードをリクエストする方法、そして、hubId や endpointId などの恐ろしく見えるフィールドが簡単な英語で実際に何を意味するのかを見ていきます。

目次

<オル>
  • BluetoothSocketSettings の構造

  • HAL の内部:Bluetooth オフロードの実際の仕組み

  • CPU がスリープしているが Bluetooth がスリープしていない場合:電源管理が動作中

  • 開発者が BluetoothSocketSettings を利用する方法

  • グランドフィナーレ:スマートに眠る優雅さ

  • BluetoothSocketSettings の構造

    これまで、BluetoothSocketSettings について、携帯電話内のどこかにある日当たりの良い低電力の島にパケットを送信する魔法のチケットであるかのように話してきました。では、そのチケットがコード内でどのように見えるかを実際に見てみましょう。

    Android オープンソース プロジェクト ツリーを開いてフレームワーク レイヤーに移動すると、frameworks/base/core/java/android/bluetooth/BluetoothSocketSettings.java の下にクラス定義が隠れているのがわかります。 。一見したところ、バッテリーを大幅に節約するものとしては小さく、シンプルすぎるように見えます。しかし、この小さなクラスには、ソケットのデータがどこに流れるかを Bluetooth スタックに指示する秘密の命令が含まれています。

    必要最低限のバージョンは次のようになります。

    public final class BluetoothSocketSettings implements Parcelable {
     public static final int DATA_PATH_NO_OFFLOAD = 0;
     public static final int DATA_PATH_HARDWARE_OFFLOAD = 1;
     private int mDataPath;
     private int mHubId;
     private int mEndpointId;
     private int mRequestedMaxPacketSize;
     public BluetoothSocketSettings(int dataPath, int hubId, int endpointId,
     int requestedMaxPacketSize) {
     mDataPath = dataPath;
     mHubId = hubId;
     mEndpointId = endpointId;
     mRequestedMaxPacketSize = requestedMaxPacketSize;
     }
     public int getDataPath() { return mDataPath; }
     public int getHubId() { return mHubId; }
     public int getEndpointId() { return mEndpointId; }
     public int getRequestedMaxPacketSize() { return mRequestedMaxPacketSize; }
    }
    

    Android Bluetooth で新しいソケットが作成されると、システムまたは特権サービスはこれらの設定オブジェクトの 1 つをスタックに渡すことができます。キー行は DATA_PATH_HARDWARE_OFFLOAD です。 。これは、Bluetooth システムに「メイン CPU をウェイクアップするのではなく、このトラフィックをコントローラーのマイクロプロセッサに維持するようにしてください。」と指示するスイッチです。

    hubIdendpointId 島の住所のようなものです。これらは、ファームウェアに、その特定のソケットにどの論理ポートまたはキューを使用するかを指示します。 requestedMaxPacketSize バッファ割り当てを調整するのに役立ち、スループットと電力効率のバランスをとることができます。

    この時点で、この小さな Java オブジェクトが実際にどのようにしてハードウェアに到達するのか疑問に思うかもしれません。答えは HAL (ハードウェア アブストラクション レイヤー) にあります。 BluetoothSocket.connect() のようなものを呼び出すと、 、最終的には btif_sock.cc などのファイル内のネイティブ コードに到達します。 および btif_core.cc 。そこには、次のようなトレースが表示されます。

    bt_status_t status = BTA_SockConnect(type, addr, channel, flags);
    if (settings.data_path == DATA_PATH_HARDWARE_OFFLOAD) {
     BTIF_TRACE_DEBUG("Configuring socket for hardware offload path");
     BTA_SockSetOffloadParams(settings.hub_id, settings.endpoint_id);
    }
    

    この断片は単純に見えるかもしれませんが、責任における大きな変化を表しています。すべてのパケットをホスト スタックに送信する代わりに、Bluetooth コントローラーはデータ パスの所有権を主張できるようになりました。 SoC 内の Bluetooth ファームウェアが引き継ぎ、メイン CPU を常にウェイクアップすることなく、パケットの再送信、確認応答、フロー制御を処理します。

    このような接続中にデバイスのカーネル ログを監視すると、次のようなものが見つかる可能性もあります。

    bt_vendor: enabling LPI offload for handle 0x0041
    bt_controller: lpi path active, cpu wakelocks released
    

    このログ行は、データ パスが低電力アイランドに正常に移行されたことを静かに確認するものです。

    人間の言葉で言えば、携帯電話は、この Bluetooth 会話がミニプロセッサで処理できるほど十分に予測可能であると判断し、大きな CPU に丁寧に「もう昼寝してもいいです。これはわかりました」と伝えました。

    次のセクションでは、この旅をさらに 1 レベル深く、HAL とファームウェアの境界にまでたどり、これらのソケット設定がコントローラー チップ内の実際の低電力データ ルーティングにどのように変わるかを見ていきます。ここで本当のハードウェアの魔法が起こり、一度に 1 ミリワットずつ節約が始まります。

    HAL の内部:Bluetooth オフロードの実際の仕組み

    これまでのところ、私たちは主に Android の Java 層とネイティブ層、つまりフレームワークとシステム サービスが存在する快適なアパートに滞在してきました。しかし、その下には、賢い機械がたくさん詰まった地下室があります。それがハードウェア抽象化レイヤーです。 、またはHAL。これは、Android が「オブジェクト」で話すことをやめ、オペコードとバッファで話すようになる場所であり、ソフトウェアとシリコンの間の架け橋となります。

    BluetoothSocketSettings フラグがシステムに「ハードウェア オフロードを使用してください」と指示しても、その要求は魔法のようにチップにテレポートされるわけではありません。 Bluetooth スタックを段階的に下降し、JNI (Java Native Interface) を通過して C++ に到達し、次に hardware/interfaces/bluetooth/ 内で定義されている HAL に到達します。 .

    Android 14 以降、特に AOSP 16 では、HAL はより賢くなっています。LPI 機能を理解し、特定のソケット トラフィックを LPI 機能にルーティングできるようになりました。

    簡略化された HAL 関数の内部を覗いてみましょう。これは架空の断片ではありません。 bluetooth_audio_hw.cc にあるものに近いです または bluetooth_socket_hal.cc :

    Return<void> BluetoothHci::createSocketChannel(
     const hidl_string& device, const BluetoothSocketSettings& settings,
     createSocketChannel_cb _hidl_cb) {
     int fd = -1;
     if (settings.data_path == DATA_PATH_HARDWARE_OFFLOAD) {
     ALOGI("LPI offload requested for socket on hub %d endpoint %d",
     settings.hub_id, settings.endpoint_id);
     fd = controller->allocateLpiChannel(settings.hub_id, settings.endpoint_id);
     } else {
     fd = controller->allocateHostChannel();
     }
     _hidl_cb(Status::SUCCESS, fd);
     return void();
    }
    

    平たく言えば、この方法は Bluetooth 交差点の交通警察官のようなものです。ソケットの設定を見て、どの道路でデータを送信するかを決定します。 DATA_PATH_HARDWARE_OFFLOAD の場合 が設定されている場合、データ パスは通常のホスト側のバッファではなく、コントローラの内部 MCU に配線されます。

    controller->allocateLpiChannel() への呼び出し ここで HAL は「OK チップ、完全に低電力プロセッサ内に存在するキューを作成してください。」と指示します。このマイクロコントローラーは物理的に Bluetooth 無線に近いものです。確認応答、小さなデータ バースト、さらには一部のプロトコル タイミングなど、通常はメイン CPU をウェイクアップする必要があるものを独自に処理できます。

    このチャネルが作成されると、Android フレームワークとアプリは、ソケットが完全にローカルであるかのように、通常のファイル記述子を引き続き認識します。魔法は、この記述子が Linux カーネル バッファではなく、ファームウェアで管理されたメモリと DMA パスによってサポートされているという事実にあります。

    デバッガーを接続するか、コントローラーからログをダンプすると、次のような内容が表示される場合があります。

    bt_lpi_mcu: channel 0x03 opened for handle 0x0041
    bt_hci: diverting ACL packets to LPI path
    bt_lpi_mcu: sleeping host processor
    

    3 行目、sleeping host processor は、すべての電力エンジニアにとって夢の実現です。電話機は文字通り、Bluetooth を有効にしたまま、CPU サブシステムの大部分をオフにします。

    ここは、クアルコムやブロードコムなどのベンダーが特別なソースを加える場所でもあります。同社の HAL には、多くの場合、「キープアライブ」タイマー、「結合間隔」、および「ファームウェア主導の再送信」のための追加のフックが含まれています。これらにより、メイン プロセッサが非稼働状態であっても接続がスムーズに感じられます。

    概要から見ると、パイプラインは次のようになります。

    App -> Bluetooth Framework -> JNI -> btif_sock -> HAL -> Controller MCU (LPI)
    

    すべての層は、バトンを次の層にきれいに渡すのに十分な内容を理解しています。 HAL はトランスレータとして機能し、高レベルの設定を取得して、チップ ファームウェアが実行できる低レベルのコマンドに変換します。

    スマートウォッチがパケットを送信するか、イヤホンがオーディオ チャンクを要求するまでに、メイン CPU は点滅すらしません。トランザクション全体は Bluetooth コントローラーの小さなドメイン内で生きたり消えたりし、電力を飲み込むのではなく消費します。

    次のセクションでは、このオフロード アーキテクチャがウェイロック、ドーズ モード、カーネル調整などの Android の電源管理システムとどのように統合されるか、また、メイン CPU がスリープ状態であっても接続が途切れることがないようにする方法について説明します。

    CPU はスリープしているが Bluetooth はスリープしていない場合:電源管理が動作中

    さて、ソケット オフロードがどのようにアプリ層から HAL に伝わり、最終的に Bluetooth チップ内にある小さな MCU に到達するかを見てきました。しかし、次に何が起こるでしょうか?ファイル転送またはオーディオ ストリームの実行中に携帯電話のメイン CPU が仮眠を取ることにした場合はどうなりますか? Bluetooth 接続が切断される危険はありませんか?

    ここで Android の電源管理の仕組みが決まります。 これは 3 人のパフォーマーによるダンスです。パワー HALBluetooth スタック 、 そしてカーネルウェイクロックシステム .

    Bluetooth ソケットが低電力アイランド用に設定されると、Android の Bluetooth スタックは、メイン CPU の助けなしでこの接続を維持できることをカーネルに通知します。内部的には、通常は Bluetooth トラフィック中にプロセッサを起動状態に保つウェイクロック タイマーをクリアまたはダウンスケールします。カーネル ログには、次のような内容が表示される場合があります。

    wakelock: release "bt_wake" (LPI mode active)
    bt_controller: firmware handling link supervision locally
    

    このメッセージはシステム エンジニアにとって貴重なものです。これは、コントローラーが接続の完全な所有権を取得したことを示します。 Bluetooth ファームウェアは現在、監視タイムアウトを監視し、再送信を処理し、暗号化カウンターを維持しています。

    電源マネージャーの観点からは、メイン CPU に対して割り込みが生成されていないため、Bluetooth デバイスは「アイドル状態」に見えます。一方、コントローラー MCU は、独自の低電力クロック ドメインを使用して、イヤホンまたはスマートウォッチと静かにパケットを交換します。

    これを調整するために、Bluetooth HAL は、トラフィック レベルが変化するたびに Power HAL に通知する小さなコールバックを公開します。 bt_vendor_qcom.cc に次のようなスニペットが見つかる可能性があります。 :

    void bt_lpi_activity_update(bool active) {
     if (active)
     power_hint(POWER_HINT_LPI_ACTIVITY, 1);
     else
     power_hint(POWER_HINT_LPI_ACTIVITY, 0);
    }
    

    active の場合 ゼロになると、Power HAL は、Bluetooth が自動的に動作を維持するため、より深いシステム スリープ状態 (RAM へのサスペンドなど) を許可できることを認識します。

    本当の魔法は、ユーザーがこれにまったく気付かないことです。スマートフォンは「スリープ」状態、ディスプレイがオフ、CPU コアがゲートされているように見えても、Bluetooth オーディオは引き続き再生され、スマートウォッチは同期され、スマートフォンは検出可能な状態のままです。

    それはほとんど詩的です。メインプロセッサは夢を見ており、コントローラーは静かにうなり声を上げ、プレイリストは何事もなかったかのように動き続けます。

    これを実際の Android デバイスで確認したい場合は、次のコマンドを使用できます。

    adb shell cat /sys/kernel/debug/wakeup_sources | grep bt
    

    bt_wake が表示された場合 ストリーミング中もカウンターは低いままです。おめでとうございます!低電力アイランド オフロードは見事に機能しています。

    次のセクションでは、ファームウェアの深部から戻って、これらすべてが開発者の日常の世界にどのように適合するかを見ていきます。アプリまたはシステム開発者は、実際にこれらのソケット設定を直接制御したり、その恩恵を受けたりできますか?そして、それらを理解することは、電力を消費するのではなく電力を消費する Bluetooth アプリを構築するのにどのように役立つのでしょうか?

    開発者が BluetoothSocketSettings を利用する方法

    Bluetooth スタックの中心部を詳しく調べたので、あなたと私が実際に住んでいる開発者層に戻りましょう。 「ハードウェアの魔法は素晴らしいですが、実際に何ができるのでしょうか」と疑問に思っているかもしれません。 それで?」

    ここが楽しい部分です。低電力アイランドは主にシステム レベルの機能ですが、その仕組みを理解することで、より電力に優しく、予測可能な Bluetooth アプリを設計するのに役立ちます。

    フレームワーク レベルでは、アプリから LPI のオンとオフを直接切り替えることはできません。これらのスイッチは、BluetoothService や BluetoothSocketManagerService などのシステム コンポーネントの奥深くに存在します。ただし、BluetoothSocket を使用するたびに、 または BluetoothServerSocket 、データは、LPI オフロードが利用可能かどうかをチェックするレイヤーを静かに通過します。

    つまり、CPU を不必要に起動したままにするようなことをしない限り、 アプリは自動的に恩恵を受けることを意味します。 。たとえば、適切なスレッド スリープを使用し、ビジー ループを回避し、Android 独自の Bluetooth I/O ストリームにバッファリングを処理させることで、オフロード ロジックを良好に保つことができます。

    Bluetooth ソケットの接続中に AOSP のシステム サーバー ログを調べると、次のようなことに気づくかもしれません。

    BluetoothSocketManager: Offload eligible socket detected, enabling LPI mode
    Bluetooth HAL: LPI channel activated for fd=42
    

    この小さな行は、あなたが指を動かすことなく、ソケットが静かに島内を経由するように変更されたことを示しています。

    その下で、フレームワークは BluetoothSocketSettings を作成しました。 オブジェクトを作成し、ソケットが開かれたときにそれをチェーンに渡します。擬似 Java では、次のようになります。

    BluetoothSocketSettings settings =
     new BluetoothSocketSettings(
     BluetoothSocketSettings.DATA_PATH_HARDWARE_OFFLOAD,
     /* hubId */ 1,
     /* endpointId */ 2,
     /* maxPacketSize */ 512);
    BluetoothSocket socket = adapter.createSocket(device, settings);
    socket.connect();
    

    もちろん、これはまだパブリック SDK の一部ではありませんが、システム アプリや特権フレームワークは同様の呼び出しを使用してトラフィックの処理方法を記述します。

    では、なぜ開発者が気にする必要があるのでしょうか?なぜなら、そのようなパスが存在することを知っているということは、 それを念頭に置いて設計できることを意味するからです。 。たとえば、次のことができます。

    • 小さな BLE 書き込みを 1 つずつ送信するのではなくバッチ処理することで、コントローラーがオフロード バッファ内で効率的に処理できるようになります。

    • スタックがメイン CPU を繰り返しウェイクアップすることになるため、頻繁な接続/切断サイクルを避けてください。

    • 低電力バッファの制限内にきちんと収まるようにバックグラウンド転送を構成します (チャンクを小さくし、間隔を長くすることを考えてください)。

    基本的に、データ パターンが予測可能であればあるほど、ホストを目覚めさせずにデータが島に留まる可能性が高くなります。

    たとえばカスタム Android デバイスや組み込み製品などのシステム ソフトウェアを構築している場合は、さらに先に進むことができます。 HAL の動作を微調整したり、カスタム ハブまたはエンドポイント ID を割り当てたり、ファームウェアが DMA 転送に使用する最大パケット サイズを調整したりすることもできます。これにより、低エネルギー テレメトリ ストリーミングやウェアラブル センサーの同期など、ほぼ完全にオフロードで実行される Bluetooth 機能を構築できます。

    その時点で、Bluetooth チップはメイン OS がスリープしている間も動作し続けるミニ サーバーになり、驚くべきバッテリー寿命と迅速な再接続を実現します。

    最後のセクションでは、これをまとめて全体像を振り返ります。なぜ BluetoothSocketSettings と Low Power Island が一緒になって、Android の「目に見えないエンジニアリング」の最もエレガントな例の 1 つを表すのかを説明します。これは、基調講演ではめったに目にすることのない静かな勝利の 1 つですが、真夜中になっても携帯電話がまだ充電されているときには毎日感じます。

    グランドフィナーレ:スマートに眠る優雅さ

    ちょっと一歩下がってみましょう。私たちは働きすぎのバリスタと一緒にコーヒーショップから始めました。次に、メインのバリスタが離れても静かにカフェを運営し続ける、隠れたアシスタントである Low Power Island を発見しました。

    私たちは素朴な Bluetooth ソケットのパスをたどり、それが BluetoothSocketSettings でラップされるのを観察しました。 、HAL を通過し、最終的にはコントローラー内の小型プロセッサーに着陸し、大きな CPU が夢を見ている間、そのプロセッサーが音を立てます。

    それが素晴らしい点です。Android の Bluetooth オフロード メカニズムは、目に見えないエンジニアリングの最もエレガントな例の 1 つです。新しい API や派手なアニメーションでそれ自体を発表することはありません。バッテリーが長持ちし、Bluetooth の信頼性が向上し、携帯電話の操作感がよりスムーズになります。そのすべてが、ユーザーが気づかないうちに行われます。

    技術的な観点から見ると、輝きはバランスにあります。このシステムでは、必要に応じてフル機能のソケットと豊富なプロトコル処理が可能ですが、一般的なデータ フロー、オーディオ、テレメトリ、通知、または心拍数ストリーミングについては、低電力コントローラーが処理を引き継ぎます。 Android が委任することを学んだようなものです。

    携帯電話の画面がオフのときにスマートウォッチが同期するたび、または長時間のフライト中にバッテリーを消耗することなくイヤホンが接続されたままになると、BluetoothSocketSettings が表示されます。 そして、低電力アイランドのフレームワークが機能しています。これらは、最新の Android 設計におけるより大きな哲学の一部であり、インテリジェンスをハードウェアに近づけます。チップに自律的なタスクを処理するように教えれば教えるほど、メイン プロセッサを休ませることができます。

    あなたが開発者またはシステム エンジニアである場合、このアーキテクチャを理解することは単なる学問ではありません。独自の機能を設計する方法にインスピレーションを与えることができます。カスタム Android ROM を構築している場合でも、ウェアラブル用ファームウェアを最適化している場合でも、Bluetooth チップを備えた IoT デバイスを作成している場合でも、教訓は明らかです。メイン CPU にすべてのパケットを監視させてはいけないということです。できるときに負荷を軽減し、寝るべきときに寝れば、デバイスの稼働時間は何時間も延長されます。

    したがって、次にイヤフォンを接続したときに、スマートフォンが冷えていてバッテリーの割合がほとんど変化していないことに気付いたときは、メイン CPU が低電力ハンモックで昼寝を楽しんでいる間、内部のどこか奥深くにある小さな Bluetooth MCU がすべての重労働を行っていることを思い出してください。

    これが Android の Low Power Island と BluetoothSocketSettings の静かな天才です。 Bluetooth だけの問題ではありません。それは、私たちのデバイスに、忙しくするのではなく、より賢くなるように教えることです。そしておそらく、もしかしたら、それは私たち自身にとっても覚えておく価値のある教訓となるかもしれません。

    無料でコーディングを学びましょう。 freeCodeCamp のオープンソース カリキュラムは、40,000 人以上の人々が開発者としての職に就くのに役立ちました。始めましょう


    1. Android用の独自のカスタム壁紙を作成する方法

      Androidスマートフォンを使用する主な利点の1つは、カスタマイズです。十分なノウハウがあれば、ほぼすべての側面をカスタマイズできますが、ルート化するかどうかに関係なく、最初に開始する必要があるのはホーム画面の壁紙です。 時間に追われている場合や単に怠惰な場合は、美しい画像をいくつでもすばやく見つけて適用するために使用できる壁紙ギャラリーアプリがいくつかあります。ただし、Androidはカスタマイズを推奨しているため、それに満足している場合は、独自のカスタム壁紙を作成してみてください。 そして、 FreshCoatというアプリに感謝します 、これはかつてないほど簡単になりました。 ダウ

    2. あなたはまだあなたのAndroid携帯電話を根絶する必要がありますか?

      少し前まで、多くのAndroid愛好家が新しい携帯電話に対して最初に行うことは、それを根絶することでした。それは不可欠でした。 Androidのバッテリー寿命を延ばすにはrootが必要でした。キャリアによって追加されたばかげたブロートウェアを削除するために必要でした。そして、メーカーが開発した恐ろしいユーザーインターフェイスを置き換えるためにそれが必要でした。 しかし、過去数年間のAndroidの改善と、電話メーカーによって設計された派手で肥大化したストックROMを使用しても、デバイスをルート化する必要がありますか? Androidデバイスをルート化する理由 パフォーマンスの向上からセキ