目录
在学习性能优化相关的知识时看到一个比较有意思的开源项目,Facebook开源的device-year-class(https://github.com/facebook/device-year-class),官方的介绍如下:
简单翻译下:Device Year Class是一个Android库,它实现了一个简单的算法,该算法将设备的RAM,CPU内核和时钟速度映射到那些规格组合被认为是高端的年份。这使开发人员可以根据电话硬件的功能轻松修改应用程序行为。
查看源码发现实现逻辑的确很简单,一共包含两个类,DeviceInfo和YearClass。DeviceInfo是用来获取CPU内核数、CPU频率、总可用RAM等 硬件信息的工具类;YearClass则是根据硬件信息确定手机的年代。代码比较简单,这里不再列举,这里梳理下思路。
DeviceInfo获取硬件信息的逻辑
1、CPU核心数
SDK版本<=10的一律认为是单核;
SDK版本>=10的从手机的/sys/devices/system/cpu路径下去获取信息
首先读取/sys/devices/system/cpu/possible中的cpu信息(信息格式为“0-N”,表示cpu编号);
如果获取不到再读取/sys/devices/system/cpu/present中的cpu信息(信息格式也是“0-N”);
再获取不到就通过/sys/devices/system/cpu路径下有几个“cpu+数字”格式的文件来确定核心数
2、CPU频率信息获取
遍历/sys/devices/system/cpu/cpu[i]/cpufreq/cpuinfo_max_freq(i为cpu编号)下的信息,获取最高的频率;
如果获取不到则从/proc/cpuinfo文件下去匹配“cpu MHz”之后的数字
3、获取总RAM
SDK版本>=16,通过ActivityManager.MemoryInfo的totalMem字段获取
SDK版本<16,因为低版本api中不支持获取totalMem,所以通过读取/proc/meminfo文件,匹配“MemTotal”来获取内存信息。
YearClass的逻辑
其中包含了2014年以前的分类方式和2016年以前分类方式。
1、2016年的分类方式(主要使用的划分年代方式)
RAM | condition | Year |
---|---|---|
768MB | 1 core | 2009 |
2+ cores | 2010 | |
1GB | <1.3GHz | 2011 |
1.3GHz+ | 2012 | |
1.5GB | <1.8GHz | 2012 |
1.8GHz+ | 2013 | |
2GB | 2013 | |
3GB | 2014 | |
5GB | 2015 | |
more | 2016 |
2、2014年的分类方式(兜底策略)
CPU核心数-年份映射规则
Core | Year |
---|---|
=1 | 2008 |
<=3 | 2011 |
>3 | 2012 |
CPU频率-年份映射规则
ClockSpeed | Year |
---|---|
<=0.5GHz | 2008 |
<=0.6GHz | 2009 |
<=1GHz | 2010 |
<=1.2GHz | 2011 |
<=1.5GHz | 2012 |
<=2.0GHz | 2013 |
>2.0GHz | 2014 |
内存-年份映射关系
RAM | Year |
---|---|
<=128MB | 2008 |
<=256MB | 2009 |
<=512MB | 2010 |
<=1GB | 2011 |
<=1.5GB | 2012 |
<=2GB | 2013 |
>2GB | 2014 |
分别通过三个映射规则计算出一个年份,存入一个数组(不在三个映射规则内的结果不会计入),对数组升序排列
最终年份=数组中位数(数组长度为奇数)
最终年份=中间两个年份的平均值向下取整(数组长度为偶数)
说明:这个年份不代表手机的发布年份,映射规则是高端旗舰设备配置和年份的对应关系,比如我的小米5s发布年份是2016年,用这个工具检测为2014年,表示和2014年高端旗舰机配置相当。
欢迎关注公众号:从技术到艺术