Merge "CachedAppOptimizer: ensure binder is never frozen with app unfrozen" into rvc-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
c827f40f7b
@@ -776,6 +776,17 @@ public final class CachedAppOptimizer {
|
|||||||
|
|
||||||
long freezeTime = app.freezeUnfreezeTime;
|
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 {
|
try {
|
||||||
Process.setProcessFrozen(app.pid, app.uid, false);
|
Process.setProcessFrozen(app.pid, app.uid, false);
|
||||||
|
|
||||||
@@ -783,21 +794,10 @@ public final class CachedAppOptimizer {
|
|||||||
app.frozen = false;
|
app.frozen = false;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Slog.e(TAG_AM, "Unable to unfreeze " + app.pid + " " + app.processName
|
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) {
|
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) {
|
if (DEBUG_FREEZER) {
|
||||||
Slog.d(TAG_AM, "sync unfroze " + app.pid + " " + app.processName);
|
Slog.d(TAG_AM, "sync unfroze " + app.pid + " " + app.processName);
|
||||||
}
|
}
|
||||||
@@ -1110,14 +1110,6 @@ public final class CachedAppOptimizer {
|
|||||||
return;
|
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) {
|
if (pid == 0 || proc.frozen) {
|
||||||
// Already frozen or not a real process, either one being
|
// Already frozen or not a real process, either one being
|
||||||
// launched or one being killed
|
// launched or one being killed
|
||||||
@@ -1146,6 +1138,15 @@ public final class CachedAppOptimizer {
|
|||||||
|
|
||||||
EventLog.writeEvent(EventLogTags.AM_FREEZE, pid, name);
|
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
|
// See above for why we're not taking mPhenotypeFlagLock here
|
||||||
if (mRandom.nextFloat() < mFreezerStatsdSampleRate) {
|
if (mRandom.nextFloat() < mFreezerStatsdSampleRate) {
|
||||||
FrameworkStatsLog.write(FrameworkStatsLog.APP_FREEZE_CHANGED,
|
FrameworkStatsLog.write(FrameworkStatsLog.APP_FREEZE_CHANGED,
|
||||||
|
|||||||
Reference in New Issue
Block a user