美文网首页
第九章:UasgeStatsService

第九章:UasgeStatsService

作者: momxmo | 来源:发表于2020-04-19 19:38 被阅读0次

简述

UasgeStatsService是android自带的应用统计收集、聚合和持久化应用程序使用数据的服务。主要通过AMS等类来监测并记录各个应用的使用数据;这些数据可由AppOps授予权限的应用程序查询。

相关代码:

# AMS 相关
frameworks/base/services/java/com/android/server/am/UsageStatsService.java
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
frameworks/base/services/java/com/android/server/am/ActivityStack.java
frameworks/base/services/java/com/android/server/am/ActivityRecord.java
# WMS 相关
frameworks/base/services/java/com/android/server/wm/WindowManagerService.java
frameworks/base/services/java/com/android/server/wm/AppWindowToken.java
# Parcel 相关
frameworks/base/core/java/android/os/Parcel.java
frameworks/base/jni/android_os_Parcel.cpp
frameworks/native/libs/binder/Parcel.cpp
frameworks/native/include/utils/Unicode.h

UsageStatsManager
是Android提供统计应用使用情况的服务。通过这个服务可以获取指定时间区间内应用使用统计数据、组件状态变化事件统计数据以及硬件配置信息统计数据。提供的主要查询方法如下表:

  • queryAndAggregateUsageStats:获取指定时间区间内使用统计数据,以应用包名为键值进行数据合并。
  • queryConfigurations:获取指定时间区间内硬件配置信息统计数据。
  • queryEventStats:获取指定时间区间内发生组件状态变化事件统计数据。
  • queryEvents:获取指定时间区间内组件状态变化事件
  • queryUsageStats:获取指定时间区间内应用使用统计数据。
    重要几个方法:
  • isAppInactive:判断应用是否处于活跃状态
  • setAppInactive:设置应用活跃状态,系统API

一、初始化

启动位置
跟其他系统服务一样, UasgeStatsService也是继承于SystemService并通过SystemServer启动。
frameworks/base/services/java/com/android/server/SystemServer.java

public final class SystemServer {
 private void startCoreServices() {
.......
mSystemServiceManager.startService(UsageStatsService.class);
.......
}
}

构造函数
相对于其他服务,构造函数比较简单,没有处理什么工作

  public UsageStatsService(Context context) {
        super(context);
    }

onStart()方法

  @Override
    public void onStart() {
//获取权限管理
        mAppOps = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE);
//获取用户管理
        mUserManager = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
//获取包管理
        mPackageManager = getContext().getPackageManager();
        mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
//创建Handler轮训处理等待和处理消息
        mHandler = new H(BackgroundThread.get().getLooper());
//创建/data/system/usagestats目录
        File systemDataDir = new File(Environment.getDataDirectory(), "system");
        mUsageStatsDir = new File(systemDataDir, "usagestats");
        mUsageStatsDir.mkdirs();
        if (!mUsageStatsDir.exists()) {
            throw new IllegalStateException("Usage stats directory does not exist: "
                    + mUsageStatsDir.getAbsolutePath());
        }
//注册监听系统用户的移除和开启
        IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
        filter.addAction(Intent.ACTION_USER_STARTED);
        getContext().registerReceiverAsUser(new UserActionsReceiver(), UserHandle.ALL, filter,
                null, mHandler);
//注册监听应用的安装、卸载、改变
        IntentFilter packageFilter = new IntentFilter();
        packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
        packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
        packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
        packageFilter.addDataScheme("package");
        getContext().registerReceiverAsUser(new PackageReceiver(), UserHandle.ALL, packageFilter,
                null, mHandler);
//idel低功耗模式是否开启
        mAppIdleEnabled = getContext().getResources().getBoolean(
                com.android.internal.R.bool.config_enableAutoPowerModes);
        if (mAppIdleEnabled) {
//注册监听电池状态、设备状态
            IntentFilter deviceStates = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
            deviceStates.addAction(BatteryManager.ACTION_DISCHARGING);
            deviceStates.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
            getContext().registerReceiver(new DeviceStateReceiver(), deviceStates);
        }

        synchronized (mLock) {
            cleanUpRemovedUsersLocked();
        }
        synchronized (mAppIdleLock) {
            mAppIdleHistory = new AppIdleHistory(SystemClock.elapsedRealtime());
        }
//设备boot后经历的时间值
        mRealTimeSnapshot = SystemClock.elapsedRealtime();
        mSystemTimeSnapshot = System.currentTimeMillis();
//注册本地服务,供系统进程使用,例如AMS
        publishLocalService(UsageStatsManagerInternal.class, new LocalService());
//提供其他Service和App应用使用
publishBinderService(Context.USAGE_STATS_SERVICE, new BinderService());
    }

这里主要的工作就是获取权限管理、用户管理、好管理,并注册监听系统用户的状态、应用的安装卸载、电源的工作状态等广播;

onBootPhase()方法

 @Override
    public void onBootPhase(int phase) {
        if (phase == PHASE_SYSTEM_SERVICES_READY) {
            // 观察设置阈值的变化
            SettingsObserver settingsObserver = new SettingsObserver(mHandler);
            settingsObserver.registerObserver();
            settingsObserver.updateSettings();

            mAppWidgetManager = getContext().getSystemService(AppWidgetManager.class);
//获取设备状态Idle控制器
            mDeviceIdleController = IDeviceIdleController.Stub.asInterface(
                    ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
            mBatteryStats = IBatteryStats.Stub.asInterface(
                    ServiceManager.getService(BatteryStats.SERVICE_NAME));
//获取显示管理
            mDisplayManager = (DisplayManager) getContext().getSystemService(
                    Context.DISPLAY_SERVICE);
//获取电源管理
            mPowerManager = getContext().getSystemService(PowerManager.class);
//注册监听显示
            mDisplayManager.registerDisplayListener(mDisplayListener, mHandler);
            synchronized (mAppIdleLock) {
                mAppIdleHistory.updateDisplay(isDisplayOn(), SystemClock.elapsedRealtime());
            }

            if (mPendingOneTimeCheckIdleStates) {
                postOneTimeCheckIdleStates();
            }

            if (ENABLE_KERNEL_UPDATES && KERNEL_COUNTER_FILE.exists()) {
                try {
                    ActivityManager.getService().registerUidObserver(mUidObserver,
                            ActivityManager.UID_OBSERVER_PROCSTATE
                                    | ActivityManager.UID_OBSERVER_GONE,
                            ActivityManager.PROCESS_STATE_UNKNOWN, null);
                } catch (RemoteException e) {
                    throw new RuntimeException(e);
                }
            } else {
                Slog.w(TAG, "Missing procfs interface: " + KERNEL_COUNTER_FILE);
            }

            mSystemServicesReady = true;
        } else if (phase == PHASE_BOOT_COMPLETED) {
            setChargingState(getContext().getSystemService(BatteryManager.class).isCharging());
        }
    }

二、记录流程

2.1例子

记录:

UsageStatsManagerInternal对系统进程提供的外部访问类;
其中包含了reportEvent记录ComponentNamepackageName的Event类型;
reportConfigurationChange记录配置的改变;
isAppIdle应用是否处理闲置状态;等等这些功能;
下面具体分析一下reportEvent记录事件的调用和实现

image.png
读取

UsageStatsManager提供queryEvents查询记录的事件;
读取流程如下图所示:

image.png

相关文章

网友评论

      本文标题:第九章:UasgeStatsService

      本文链接:https://www.haomeiwen.com/subject/pzhwuhtx.html