简述
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
记录ComponentName
或packageName
的Event类型;
reportConfigurationChange
记录配置的改变;
isAppIdle
应用是否处理闲置状态;等等这些功能;
下面具体分析一下reportEvent
记录事件的调用和实现

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

网友评论