ActivityManagerService.java中同步操作调整线程优先级:
// it's a semaphore; boost when 0->1, reset when 1->0
staticThreadLocal sIsBoosted =newThreadLocal() {
@OverrideprotectedInteger initialValue() {
return0;
}
};
staticvoidboostPriorityForLockedSection() {
if(sIsBoosted.get() ==0) {
// boost to prio 118 while holding a global lock
Process.setThreadPriority(Process.myTid(), -2);
//Log.e(TAG, "PRIORITY BOOST: set priority on TID " + Process.myTid());
}
intcur = sIsBoosted.get();
sIsBoosted.set(cur +1);
}
staticvoidresetPriorityAfterLockedSection() {
sIsBoosted.set(sIsBoosted.get() -1);
if(sIsBoosted.get() ==0) {
//Log.e(TAG, "PRIORITY BOOST: reset priority on TID " + Process.myTid());
Process.setThreadPriority(Process.myTid(),0);
}
}
ActivityManagerService.java中的startProcessLocked方法中去掉了同步锁:注意 mMainHandler中处理APP_BOOST_DEACTIVATE_MSG这个消息同步锁依然保留,保证了消息处理,减少一个同步锁以提升性能;
// app launch boost for big.little configurations
// use cpusets to migrate freshly launched tasks to big cores
// synchronized(ActivityManagerService.this) {
nativeMigrateToBoost();
mIsBoosted = true;
mBoostStartTime = SystemClock.uptimeMillis();
Message msg = mHandler.obtainMessage(APP_BOOST_DEACTIVATE_MSG);
mHandler.sendMessageDelayed(msg, APP_BOOST_MESSAGE_DELAY);
// }
ActivityManagerSupervisor.java中realStartActivityLocked方法中
替换packagemanagerService的ensurePackageDexOpt方法为notifyPackageUse, 推测此为记录app启动频率记录。