第12章プロセスの存続

(1)Androidのリサイクル戦略

Androidでのメモリのリサイクルは、それを完了するために主にLowmemorykillerに依存しています。これは、OOM_ADJしきい値レベルに基づいてメモリのリサイクルをトリガーするメカニズムです。

経験とパフォーマンスのために、システムはアプリがバックグラウンドに戻ったときに実際にはプロセスを強制終了しませんが、キャッシュします。開くアプリケーションが多いほど、バックグラウンドキャッシュプロセスが多くなります。システムメモリが不足している場合、システムは、独自の一連のプロセスリサイクルメカニズムに基づいて強制終了するプロセスを決定し、必要なアプリを提供するためにメモリを解放します。プロセスを強制終了してメモリを解放するこのメカニズムは、低メモリキラーと呼ばれ、LinuxカーネルのOOMキラー(メモリ不足キラー)メカニズムに基づいています。oom_adjは、Linuxカーネルによって各システムプロセスに割り当てられる値であり、プロセスの優先度を表します。プロセスリサイクルメカニズムは、この優先度に基づいてリサイクルするかどうかを決定します。oom_adjの役割については、次の点のみを覚えておく必要があり
ます。1.プロセスのoom_adjが大きいほど、プロセスの優先順位が低くなり、回復が容易になります。小さいほど、プロセスの優先順位が高いほど、少なくなります。簡単に殺して回復できる
2.通常のアプリプロセスのoom_adj> = 0、システムプロセスのoom_adjは可能<0

シェルコマンドを使用してプロセスのoom_adjを表示できます

grep PackageName //获取你指定的进程信息

1.1)プロセスの優先度

Androidシステムはアプリケーションプロセスをできる限り長く維持しますが、新しいプロセスを作成したり、より重要なプロセスを実行したりするには、最終的に古いプロセスをクリアしてメモリを解放する必要があります。保持または終了するプロセスを決定するために、システムは、プロセスで実行されているコンポーネントとそれらのコンポーネントのステータスに基づいて、各プロセスを「重要度の階層」に配置します。必要に応じて、システムはまず重要度の最も低いプロセスを削除し、次に重要度の低いプロセスを削除して、システムリソースを回復します。
ここに画像の説明を挿入
フォアグラウンドプロセスの重要度が最も高く、順番に減少していき、空のプロセスの重要度が最も低くなります。次に、プロセスの各レベルについて個別に説明します。

1.フォアグラウンドプロセス-フォアグラウンドプロセス

ユーザーの現在の操作に必要なプロセス。通常、フォアグラウンドプロセスは常にほとんどありません。システムがそれらを終了するのは、実行を継続しているときにメモリがそれらをサポートするのに十分でない場合だけです。

2.可視プロセス-可視プロセス

フォアグラウンドコンポーネントはありませんが、ユーザーが画面に表示するもののプロセスに影響します。すべてのフォアグラウンドプロセスを同時に実行するためにシステムを終了する必要がない限り、可視プロセスは非常に重要なプロセスと見なされます。そうでない場合、システムはこれらのプロセスを終了しません。

3.サービスプロセス-サービスプロセス

サービスプロセスはユーザーが目にするものと直接関係はありませんが、通常、ユーザーが気にかける操作をいくつか実行します(たとえば、バックグラウンドで音楽を再生したり、ネットワークからデータをダウンロードしたりします)。したがって、すべてのフォアグラウンドプロセスと可視プロセスを同時に実行するのに十分なメモリがない場合を除き、システムはサービスプロセスを実行し続けます。

4.バックグラウンドプロセス-バックグラウンドプロセス

バックグラウンドプロセスは、ユーザーエクスペリエンスに直接的な影響を与えることはなく、システムはいつでもプロセスを終了して、フォアグラウンドプロセス、可視プロセス、またはサービスプロセスで使用するためにメモリを解放できます。通常、多くのバックグラウンドプロセスが実行されているため、LRUリストに保存され、ユーザーが最近表示したアクティビティを含む最後のプロセスが確実に終了します。アクティビティがライフサイクルメソッドを正しく実装し、その現在の状態を保存する場合、ユーザーがアクティビティに戻ると、アクティビティは表示されているすべての状態を復元するため、プロセスを終了してもユーザーエクスペリエンスに大きな影響はありません。

5.空のプロセス-空のプロセス

このようなプロセスを維持する唯一の目的は、それをキャッシュとして使用して、次にコンポーネントを実行するために必要な起動時間を短縮することです。プロセスキャッシュと基盤となるカーネルキャッシュの間でシステムリソース全体のバランスを保つために、システムはこれらのプロセスを終了することがよくあります。

1.2)OOM_ADJ

ここに画像の説明を挿入
赤い部分は、簡単に強制終了できるAndroidプロセス(OOM_ADJ> = 4)を表し、緑の部分は簡単に強制終了できないAndroidプロセスを表し、もう一方はAndroid以外のプロセス(純粋なLinuxプロセス)を表します。Lowmemorykillerがメモリを再利用する場合、プロセスレベルに応じてより大きなOOM_ADJプロセスを優先的に強制終了し、同じ優先度のプロセスは、プロセスが占有しているメモリとプロセスの生存時間の影響をさらに受けます。

1.3)殺されているプロセスのシーン

ここに画像の説明を挿入

(2)プロセスのキープアライブ計画

前回の記事によると、プロセスの優先順位を上げて、メモリ不足でプロセスが強制終了される可能性を減らす方法を見つけることに他なりません。

2.1)プロセスの優先度を上げ、プロセスが強制終了される可能性を減らします

1.アクティビティを使用して権限を増やす

(1)デザインのアイデア
携帯電話のロック画面のロック解除イベントを監視し、画面がロックされたときに1ピクセルのアクティビティを開始し、ユーザーがロックを解除したときにアクティビティを破棄します。アクティビティは、ユーザーが気付かないように設計する必要があることに注意してください。
この方式により、画面ロック時にプロセスの優先度を4から最高の優先度1に上げることができます。
(2)該当するシナリオ
このソリューションは主に、サードパーティのアプリケーションとシステム管理ツールがロック画面イベントを検出した後、一定の時間内(通常は5分以内)にバックグラウンドプロセスを強制終了するという問題を解決します。これにより、電力を節約することができます。
(3)特定の実装
ステップ1:最初にアクティビティを定義し、アクティビティのサイズを1ピクセルに設定します。
ここに画像の説明を挿入
ステップ2:AndroidManifestから、次の属性を使用して、RecentTaskでアクティビティの表示を除外します。
ここに画像の説明を挿入
ステップ3:アクティビティを透明に制御します。
ここに画像の説明を挿入
ステップ4:アクティビティが開始され、破壊のタイミングの制御
ここに画像の説明を挿入

2.通知を使用して権限を昇格させる

(1)設計のアイデア
Androidでのサービスの優先度は4です。setForegroundインターフェースを介してバックグラウンドサービスをフォアグラウンドサービスに設定できるため、プロセスの優先度が4から2に増加し、プロセスの優先度はユーザーが現在操作しているよりも低くなりますプロセスは可視プロセスと同じ優先順位を持っているため、プロセスが強制終了される可能性が大幅に減少します。
(2)実装の課題
Android 2.3からsetForegroundを呼び出してバックグラウンドサービスをフォアグラウンドサービスに設定する場合、システムの通知バーで通知を送信する必要があります。つまり、フォアグラウンドサービスは可視通知にバインドされています。
常駐通知バーを必要としないアプリケーションの場合、このソリューションは適切ですが、ユーザー認識であり、直接使用することはできません。
ソリューションの課題の解決策:内部サービスを実装することにより、LiveServiceとその内部サービスの両方で同じIDの通知を送信し、内部サービスを終了します。内部サービスが終了すると、通知は消えますが、システムの優先度は2のままです。
(3)具体的な実現
ここに画像の説明を挿入
ここに画像の説明を挿入

2.2)プロセスが終了した後、ライブでプル

1.システムを使用してライブ配信する

(1)設計思想
特定のシステムイベントが発生すると、システムが応答ブロードキャストを送信し、対応するブロードキャストリスナーをAndroidManifestに「静的に」登録することで、応答イベントが発生したときにアクティブ化できます。
一般に、プル生放送イベント含むために使用される:
ここに画像の説明を挿入
(2)スコープ
1、放送受信機は、管理ソフトウェア、システムソフトウェアは、自己起動することができない放送シナリオを受信することができない無効に「自己プライミング管理」機能です。
2.システムブロードキャストイベントは制御不可能であり、イベントが発生したときにプロセスがアクティブになることを保証できるだけであり、プロセスがハングした直後にプロセスがアクティブになることは保証できません。
したがって、プログラムは主にバックアップ方法として使用されます。

2.サードパーティのアプリケーションを使用してライブ配信する

(1)設計案
このソリューションの全体的な設計案は、システムブロードキャストの受信と似ていますが、このソリューションはサードパーティのトップアプリケーションブロードキャストを受信するためのものです。サードパーティのSDKにアクセスすると、対応するアプリプロセスも起動します。たとえば、WeChat SDKはWeChatを起動し、Alipay SDKはAlipayを起動します。
モバイルQQ、WeChat、Alipay、UCブラウザーなどのサードパーティのトップアプリケーション、およびYoumeng、Pigeon、パーソナルプッシュなどのSDKを逆コンパイルすることで、発信ブロードキャストを見つけ、アプリケーションで監視します。アプリケーションがブロードキャストすると、アプリケーションに命が吹き込まれます。
(2)アプリケーションの範囲
1.システムブロードキャストとして制御できません
2.逆コンパイルによって分析されたサードパーティアプリケーションの程度によって制限され
ます3. サードパーティアプリケーションのブロードキャストはアプリケーションに対してプライベートです。現在のバージョンの効果的なブロードキャストは、後続のバージョンでいつでも利用できます削除するか、送信しないように変更できます。

3.システムのサービスメカニズムを使用してライブ配信します

(1)設計のアイデア
サービスをSTART_STICKYに設定し、サービスがハングした後、システムメカニズムを使用してサービスを自動的にプルします
ここに画像の説明を挿入
(2)使用範囲:次の2つの状況はアクティブ化できません
1.サービスは、最初に強制終了されてから5秒以内に強制終了されます。 2秒以内に再起動し、2回目の強制終了は10秒以内に再開し、3回目は20秒以内に再開します。サービスを短時間で5回強制終了すると、システムはプルアップされなくなります。
2.プロセスをルートとする管理ツールまたはシステムツールは、forestopによって停止され、再起動できません。

4.ネイティブプロセスを使用してライブ配信します

Androidのすべてのプロセスとシステムコンポーネントのライフサイクルは、ActivityManagerServiceによって管理されます。さらに、Linuxのフォークメカニズムによって作成されるプロセスは純粋なLinuxプロセスであり、そのライフサイクルはAndroidによって管理されません。
Linuxのフォークメカニズムを使用してネイティブプロセスを作成し、ネイティブプロセスのメインプロセスの存続を監視します。メインプロセスがハングしたら、すぐにネイティブプロセスのメインプロセスをプルします。

5. JobSchedulerメカニズムを使用してアクティブ化します

Android5.0以降、システムはネイティブプロセスの管理を強化し、ネイティブプルメソッドは無効になりました。システムはAndroid5.0以降でJobSchedulerインターフェースを提供し、システムは定期的にプロセスを呼び出して、アプリケーションにいくつかの論理操作を実行させます。

6.アカウント同期メカニズムを使用してアクティブ化する

Androidシステムのアカウント同期メカニズムは定期的にアカウントを同期します。このソリューションの目的は、同期メカニズムを使用してプロセスをプルすることです。アカウントを追加して同期サイクルを設定するためのコードは次のとおりです。
ここに画像の説明を挿入
このソリューションでは、アカウントの承認と同期サービスをAndroidManifestで定義する必要があります。
ここに画像の説明を挿入

元の記事を74件公開 15 獲得 6255回閲覧

おすすめ

転載: blog.csdn.net/qq_29966203/article/details/90548883