Proper fix for the LRU IndexOutOfBoundsException

Previous fix for b/126427214 would result that the target process
being inserted gets falling out of the "Activities" section. A
proper fix should be in the remove LRU process part.

Also fixed an issue during the update of client activities:
when the sub proc should be sitting at the end of the group,
ineeded it's getting inserted to a position before end index
which could be pointing to a different process group, therefore
the end result would be "mixed" group.

Bug: 139765319
Test: atest CtsAppTestCases:ServiceTest\#testActivityServiceBindingLru
      manual: launch many apps and check the activity lru dump.

Change-Id: Ic56e38854837a07b8dabd1d19ba35eb1bfe4fd7a
This commit is contained in:
Jing Ji
2019-08-20 16:49:08 -07:00
parent a1b1d3b915
commit d3556f1bc2

View File

@@ -65,7 +65,6 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue;
import android.os.Process;
import android.os.RemoteException;
import android.os.StrictMode;
@@ -101,11 +100,8 @@ import com.android.server.wm.WindowManagerService;
import dalvik.system.VMRuntime;
import libcore.io.IoUtils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.nio.ByteBuffer;
@@ -2087,10 +2083,10 @@ public final class ProcessList {
}
}
}
if (lrui <= mLruProcessActivityStart) {
if (lrui < mLruProcessActivityStart) {
mLruProcessActivityStart--;
}
if (lrui <= mLruProcessServiceStart) {
if (lrui < mLruProcessServiceStart) {
mLruProcessServiceStart--;
}
mLruProcesses.remove(lrui);
@@ -2622,7 +2618,7 @@ public final class ProcessList {
if (!moved) {
// Goes to the end of the group.
mLruProcesses.remove(i);
mLruProcesses.add(endIndex - 1, subProc);
mLruProcesses.add(endIndex, subProc);
if (DEBUG_LRU) Slog.d(TAG_LRU,
"Moving " + subProc
+ " from position " + i + " to end of group @ "
@@ -2867,15 +2863,6 @@ public final class ProcessList {
pos--;
}
mLruProcesses.add(pos, app);
if (pos == mLruProcessActivityStart) {
mLruProcessActivityStart++;
}
if (pos == mLruProcessServiceStart) {
// Unless {@code #hasService} is implemented, currently the starting position
// for activity and service are the same, so the incoming position may equal to
// the starting position of service.
mLruProcessServiceStart++;
}
// If this process is part of a group, need to pull up any other processes
// in that group to be with it.
int endIndex = pos - 1;