一. 查看或设置系统属性
- SystemProperties
我们可以通过SystemProperties.set()和 SystemProperties.get()这两个接口来对系统属性进行读取和设置。系统属性是对整个系统全局共享的,属性系统是android的一个重要特性。它作为一个服务运行,管理系统配置和状态。所有这些配置和状态都是属性。这些属性是以键值对存在的,都是字符串类型。 - ADB命令
可以通过ADB shell进行查看,具体方法是adb shell getprop +“具体的属性对应的名称”就可以读取你想要的属性了。如果不知道具体的属性是什么名称也可以先输入adb shell getprop命令回车,就会显示出所有手机所支持的属性名称及对应的值。 - 反射Method类的invoke()
try {
Method method = Class.forName("android.os.SystemProperties).getMethod("get",String.class);
String model = (String)method.invoke(null,"ro.product.vendor.name");
} catch(NoSuchMethodException e){
e.printStackTrace();
}
- android系统提供了TrafficStats可以获取流量
网上列出的工具类代码:
//接受总量
TrafficStats.getUidRxBytes(uid);
//发送总量
TrafficStats.getUidTxBytes(uid);
//接受总的手机流量 下载
TrafficStats.getMobileRxBytes();
//发送总的手机流量 上传
TrafficStats.getMobileTxBytes();//获取手机3g/2g网络上传的总流
// 手机下载wifi
TrafficStats.getTotalRxBytes() - getMobileRexTotalBytes();
// 手机上传wifi
TrafficStats.getTotalTxBytes() - getMobileTrxTotalBytes();
- 获取当前前台应用的方法
Android5.0以前,使用ActivityManager的getRunningTasks()方法,可以得到应用包名和Activity;Android5.0以后,可以通过UsageStatsManager.queryUsageStats方法替代,但是也只能得到应用包名。当然你也可以通过AccessibilityService,也可以得到应用包名和Activity。
相关知识参见:(Android 9.0)应用使用数据统计服务——UsageStatsManager
6.获取使用时长和点击次数
Android5.0之前,通过PkgUsageStats这个类可以统计到应用的使用情况,但这些类在SDK不公开。
解决方案:将sdk/platforms/android-19/data/layoutlib.jar使用User Library的方式(AndroidStudio可以使用Provided添加依赖),就可以使用这些类
// 获取使用时长
public static long getUseDuration(String pkgName) {
// 注意适配性问题,无法找到该类
try{
com.android.internal.app.IUsageStats mUsageStatsService = com.android.internal.app.IUsageStats.Stub
.asInterface(ServiceManager.getService("usagestats"));
PkgUsageStats[] stats;
try {
stats = mUsageStatsService.getAllPkgUsageStats();
} catch (Exception e) {
LogUtil.d("no permission get use duration");
e.printStackTrace();
return 0;
}
if (stats == null) {
return 0;
}
for (PkgUsageStats ps : stats) {
if (ps.packageName.equals(pkgName)) {
return ps.usageTime;
}
}
}catch(Exception e){
}
return 0;
}
// 获取使用次数
public static long getUseTime(String pkgName) {
// 注意适配性问题,无法找到该类
try{
com.android.internal.app.IUsageStats mUsageStatsService = com.android.internal.app.IUsageStats.Stub
.asInterface(ServiceManager.getService("usagestats"));
PkgUsageStats[] stats = null;
try {
stats = mUsageStatsService.getAllPkgUsageStats();
} catch (Exception e) {
LogUtil.d("no permission get use duration");
e.printStackTrace();
return 0;
}
if (stats == null) {
return 0;
}
for (PkgUsageStats ps : stats) {
if (ps.packageName.equals(pkgName)) {
return ps.launchCount;
}
}
}catch(Exception e){
}
return 0;
}
注意使用这种方法需要:
在应用程序的AndroidManifest.xml中的manifest节点中加入”android:sharedUserId=”android.uid.system”这个属性。
使用目标系统的platform密钥来重新给apk文件重新签名。
二. 特殊属性介绍
build.prop是所有安卓手机都有的一些配置信息。位置在system/build.prop
我们了解了这些配置的意义后,可以通过root后对这个配置文件做一定的修改,达到不同的自定义效果,如:更改dpi、更改版本号、更改网络首选项等等。
如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。
如果属性名称以“net.”开头,都是与网络相关的信息,比如dns、主机名、为各功能预留的缓冲区大小,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)
dhcp.wlan 是网关、IP地址等无线网络相关信息;
属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中。客户端应用程序可以轮询那个属性值,以确定结果、
external_sd_path 是外部存储SD卡的路径
本文参考资料:
- https://blog.csdn.net/gyw520gyw/article/details/52692810 Android 获取应用的点击次数和使用时长
- https://www.jianshu.com/p/3b6bcf9cec67 (Android 9.0)应用使用数据统计服务——UsageStatsManager
网友评论