Merge "CachedAppOptimizer: ensure binder is never frozen with app unfrozen" into rvc-qpr-dev am: c827f40f7b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12969578

Change-Id: I879ea32f4a51f8cbd62b9f22f334ded14430fa69
This commit is contained in:
TreeHugger Robot
2020-11-02 22:58:31 +00:00
committed by Automerger Merge Worker

View File

@@ -776,6 +776,17 @@ public final class CachedAppOptimizer {
long freezeTime = app.freezeUnfreezeTime;
try {
freezeBinder(app.pid, false);
} catch (RuntimeException e) {
Slog.e(TAG_AM, "Unable to unfreeze binder for " + app.pid + " " + app.processName
+ ". Killing it");
app.kill("Unable to unfreeze",
ApplicationExitInfo.REASON_OTHER,
ApplicationExitInfo.SUBREASON_INVALID_STATE, true);
return;
}
try {
Process.setProcessFrozen(app.pid, app.uid, false);
@@ -783,21 +794,10 @@ public final class CachedAppOptimizer {
app.frozen = false;
} catch (Exception e) {
Slog.e(TAG_AM, "Unable to unfreeze " + app.pid + " " + app.processName
+ ". Any related user experience might be hanged.");
+ ". This might cause inconsistency or UI hangs.");
}
if (!app.frozen) {
try {
freezeBinder(app.pid, false);
} catch (RuntimeException e) {
Slog.e(TAG_AM, "Unable to unfreeze binder for " + app.pid + " " + app.processName
+ ". Killing it");
app.kill("Unable to unfreeze",
ApplicationExitInfo.REASON_OTHER,
ApplicationExitInfo.SUBREASON_INVALID_STATE, true);
return;
}
if (DEBUG_FREEZER) {
Slog.d(TAG_AM, "sync unfroze " + app.pid + " " + app.processName);
}
@@ -1110,14 +1110,6 @@ public final class CachedAppOptimizer {
return;
}
try {
freezeBinder(pid, true);
} catch (RuntimeException e) {
// TODO: it might be preferable to kill the target pid in this case
Slog.e(TAG_AM, "Unable to freeze binder for " + pid + " " + name);
return;
}
if (pid == 0 || proc.frozen) {
// Already frozen or not a real process, either one being
// launched or one being killed
@@ -1146,6 +1138,15 @@ public final class CachedAppOptimizer {
EventLog.writeEvent(EventLogTags.AM_FREEZE, pid, name);
try {
freezeBinder(pid, true);
} catch (RuntimeException e) {
Slog.e(TAG_AM, "Unable to freeze binder for " + pid + " " + name);
proc.kill("Unable to freeze binder interface",
ApplicationExitInfo.REASON_OTHER,
ApplicationExitInfo.SUBREASON_INVALID_STATE, true);
}
// See above for why we're not taking mPhenotypeFlagLock here
if (mRandom.nextFloat() < mFreezerStatsdSampleRate) {
FrameworkStatsLog.write(FrameworkStatsLog.APP_FREEZE_CHANGED,