低メモリ状態でのアプリケーションの動作のテスト

Androidでは、onLowMemoryメソッドをオーバーライドすることにより、ComponentCallbacksインターフェイスから継承者へのハンドルとしてregisterComponentCallbacksを介して設定することにより、アプリケーションまたはアクティビティの低メモリイベントをインターセプトできます。



このハンドラーでは、メモリ不足のイベントが発生すると、重要ではないリソースを解放し、内部キャッシュやその他のメソッドをクリーンアップして、使用されるメモリ量を削減し、プロセスが閉じられないようにする必要があります。



システムは、onLowMemoryを呼び出した後、システムガベージコレクターが呼び出されることも保証します。



そのため、このイベントが発生したときにアプリケーションが動作を実装する場合、この動作をテストすることをお勧めします。

標準的な方法は簡単です-制限に達するまで、消費されるリソースの量を人為的に増やし始めます(たとえば、写真を2回アップロードします)。



そして、2番目の方法があります-この制限を変更するには、実際には以下で説明します。



残念ながら、この方法はルート化されたデバイスでのみ機能します。



そのため、Androidのタスクスケジューラは、実行中のアプリケーションを次の6つのタイプに分割します。



FOREGROUND_APP:

// This is the process running the current foreground app. We'd really

// rather not kill it! Value set in system/rootdir/init.rc on startup.



VISIBLE_APP:

// This is a process only hosting activities that are visible to the

// user, so we'd prefer they don't disappear. Value set in

// system/rootdir/init.rc on startup.



SECONDARY_SERVER:

// This is a process holding a secondary server -- killing it will not

// have much of an impact as far as the user is concerned. Value set in

// system/rootdir/init.rc on startup.



HIDDEN_APP:

// This is a process only hosting activities that are not visible,

// so it can be killed without any disruption. Value set in

// system/rootdir/init.rc on startup.



CONTENT_PROVIDER:

// This is a process with a content provider that does not have any clients

// attached to it. If it did have any clients, its adjustment would be the

// one for the highest-priority of those processes.



EMPTY_APP:

// This is a process without anything currently running in it. Definitely

// the first to go! Value set in system/rootdir/init.rc on startup.

// This value is initalized in the constructor, careful when refering to

// this static variable externally.








これらの各タイプのアプリケーションにはメモリ制限があり、メモリがこの制限より少ない場合、スケジューラは自分の観点からは使用されていないこのタイプのアプリケーションの強制終了を開始します。



これらの制限は次のように表示できます



adb shell cat /sys/module/lowmemorykiller/parameters/minfree







Samsung Galaxy Nexusの場合、値は次のようになります



7469,9396,11324,13372,15299,19034







値はメモリのページで測定され、各ページは4キロバイトです。



根ざした電話がある場合、簡単なコマンドでこれらの値をリアルタイムで任意に変更できます



echo "1536,2048,4096,5120,15360,23040" > /sys/module/lowmemorykiller/parameters/minfree







デバイスが再起動すると、値が復元されます。



したがって、実行時にこれらの値を変更することで、onLowMemoryハンドラーを簡単に呼び出すことができ、これらの値が異なる他のデバイスでアプリケーションの動作をテストすることもできます(もちろん、デバイス自体での完全なテストに置き換わるものではありません)。



All Articles