给android手机划代

目录

DeviceInfo获取硬件信息的逻辑

1、CPU核心数

2、CPU频率信息获取

3、获取总RAM

YearClass的逻辑

1、2016年的分类方式(主要使用的划分年代方式)

2、2014年的分类方式(兜底策略)

在学习性能优化相关的知识时看到一个比较有意思的开源项目,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年的分类方式(主要使用的划分年代方式)

RAMconditionYear
768MB1 core2009
 2+ cores2010
1GB<1.3GHz2011
 1.3GHz+2012
1.5GB<1.8GHz2012
 1.8GHz+2013
2GB 2013
3GB 2014
5GB 2015
more 2016

2、2014年的分类方式(兜底策略)

CPU核心数-年份映射规则

CoreYear
=12008
<=32011
>32012

CPU频率-年份映射规则

ClockSpeedYear
<=0.5GHz2008
<=0.6GHz2009
<=1GHz2010
<=1.2GHz2011
<=1.5GHz2012
<=2.0GHz2013
>2.0GHz2014

内存-年份映射关系

RAMYear
<=128MB2008
<=256MB2009
<=512MB2010
<=1GB2011
<=1.5GB2012
<=2GB2013
>2GB2014

分别通过三个映射规则计算出一个年份,存入一个数组(不在三个映射规则内的结果不会计入),对数组升序排列

最终年份=数组中位数(数组长度为奇数)

最终年份=中间两个年份的平均值向下取整(数组长度为偶数)

说明:这个年份不代表手机的发布年份,映射规则是高端旗舰设备配置和年份的对应关系,比如我的小米5s发布年份是2016年,用这个工具检测为2014年,表示和2014年高端旗舰机配置相当。

 

欢迎关注公众号:从技术到艺术

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值