私のテストでは、ActivityManagerService の updateOomAdjLocked() で次の例外が表示されます。
// java.lang.IndexOutOfBoundsException: Invalid index 27, size is 27
// at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
// at java.util.ArrayList.get(ArrayList.java:304)
// at com.android.server.am.ActivityManagerService.updateOomAdjLocked(ActivityManagerService.java:13880)
// at com.android.server.am.ActivityManagerService.updateLruProcessLocked(ActivityManagerService.java:1904)
// at com.android.server.am.ActivityStack.realStartActivityLocked(ActivityStack.java:647)
// at com.android.server.am.ActivityStack.startSpecificActivityLocked(ActivityStack.java:803)
問題のあるコードは次のようです (Android 4.2.2 r1.2 の行 13850):
final ArrayList<ProcessRecord> mLruProcesses
= new ArrayList<ProcessRecord>();
{...}
final void updateOomAdjLocked() {
{...}
final int N = mLruProcesses.size();
for (i=0; i<N; i++) {
ProcessRecord app = mLruProcesses.get(i);
{...}
}
ループ内で mLruProcesses.remove が呼び出された場合、i=N の mLruProcesses.get(i) が存在しないインデックスにアクセスし、例外がトリガーされました。
これまでのところ、Android サービスについてほとんど知らないので、私の質問は、おそらく操作の一部をスレッドセーフにすることによって、このコードを再入力可能にする必要があるかどうかです。