12 展讯Sprd设置-电池-AppStateInfoCollector.handleProcStateChanged 代码走读

本文详细解析了安卓系统中如何通过AppStateInfoCollector和PowerController等组件,监听并处理UID状态变化,包括应用进程状态的更新和UID状态的改变。重点关注了UID隐藏、状态变更的处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. AppStateInfoCollector.handleProcStateChanged

重点监听UID状态变化,来改变uid的状态

    // return true: for new app state
    //     false: for others
    public boolean reportAppProcStateInfo(String packageName, int uid, int procState) {
        int userId = UserHandle.getUserId(uid);
        ArrayMap<String, AppState> mAppStateInfoList = getAppStateInfoList(userId);

        //update mAppStateInfoList
        int index = mAppStateInfoList.indexOfKey(packageName);
        AppState appState = null;
        boolean ret = true;

        if (DEBUG) Slog.d(TAG, "- reportAppProcStateInfo() E -");

        if (index >= 0) {
            appState = mAppStateInfoList.valueAt(index);
            // update procState
            appState.mProcState = procState;
            if (uid != appState.mUid) appState.mUid = uid;
            ret = false;
        } else {
            if (DEBUG) Slog.d(TAG, "reportAppProcStateInfo: appName:" + packageName + " uid:" + uid + " is not exist, create it");
            appState = buildAppState(packageName, userId, Event.NONE);
            mAppStateInfoList.put(packageName, appState);
        }

        return ret;
    }

2. PowerController.handleProcStateChanged

    private void handleProcStateChanged(String appName, int uid, int procState) {
        if (DEBUG) Slog.d(TAG, "- handleProcstateChanged() E - packageName:" + appName
            + " uid:" + uid + " procState:" + Util.ProcState2Str(procState));

        if (mAppStateInfoCollector.reportAppProcStateInfo(appName, uid, procState)) {
            // Note: Bug 698133 appIdle cts fail -->BEG
            // Ugly: we have to check if doing cts/gts test
            // is cts/gts test, then
            checkCtsGtsTesting(appName);
            // Note: Bug 698133 appIdle cts fail <--END
        }

3. PowerController.updateUidStateLocked

    static final int MSG_UID_STATE_CHANGED = 5;

    switch (msg.what) {
        ...
        case MSG_UID_STATE_CHANGED:
            handleProcStateChanged((String)msg.obj, msg.arg1, msg.arg2);
            break;
        ...
    
    /**
     * Process state of UID changed; if needed, will trigger
     */
    private void updateUidStateLocked(int uid, int uidState) {
        ...
        //Add for bug 884770 END
        if ((null != appName) ) {
            msgHandler.sendMessage(msgHandler.obtainMessage(MSG_UID_STATE_CHANGED, uid, uidState, appName));
        }
        
    private void removeUidStateLocked(int uid) {
        .....

        if ((null != appName) ) {
            msgHandler.sendMessage(msgHandler.obtainMessage(MSG_UID_STATE_CHANGED, uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY, appName));
        ...

4. PowerController.IUidObserver.onUidStateChanged

    final private IUidObserver mUidObserver = new IUidObserver.Stub() {
        @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) throws RemoteException {
            synchronized (mUidStateLock) {
                updateUidStateLocked(uid, procState);
            }
            mAppStateInfoCollector.updateUidState(uid, procState);
        }

5. registerUidObserver.(ActivityManager.UID_OBSERVER_PROCSTATE)

    private void registerUidObserver() {
        try {
            if (mActivityManager != null)
                mActivityManager.registerUidObserver(mUidObserver, ActivityManager.UID_OBSERVER_PROCSTATE
                  | ActivityManager.UID_OBSERVER_GONE
                  /*| ActivityManager.UID_OBSERVER_IDLE
                  | ActivityManager.UID_OBSERVER_ACTIVE*/,
                  ActivityManager.PROCESS_STATE_UNKNOWN, null);
        } catch (RemoteException e) {
            // ignored; both services live in system_server
        }
    }

监听UID变化状态,重点uid隐藏、状态变更

package android.app;

@SystemService(Context.ACTIVITY_SERVICE)
public class ActivityManager {

    /** @hide Flag for registerUidObserver: report changes in process state. */
    public static final int UID_OBSERVER_PROCSTATE = 1<<0;

    /** @hide Flag for registerUidObserver: report uid gone. */
    public static final int UID_OBSERVER_GONE = 1<<1;

    /** @hide Flag for registerUidObserver: report uid has become idle. */
    public static final int UID_OBSERVER_IDLE = 1<<2;

    /** @hide Flag for registerUidObserver: report uid has become active. */
    public static final int UID_OBSERVER_ACTIVE = 1<<3;

    /** @hide Flag for registerUidObserver: report uid cached state has changed. */
    public static final int UID_OBSERVER_CACHED = 1<<4;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值