Nicky's Blog

面对国外复杂的设备和渣渣网络,开发者如何应对?

目前我们针对国际市场,主要面临几大难题:

用户手机设备复杂度高

或许大家都知道,做国际市场,你面临的是更复杂的设备属性,习惯了国内的环境,大家觉得还有人在用低于512M Ram的机器不可思议,但是这批用户,正是国际的主力军,尤其是针对东南亚市场,那么如何来针对这批机器来做优化呢?

当年积累了一定海外用户群体数据的时候,你会发现不管是崩溃率还是卡顿率都会很受打击,本来UI给出的酷炫效果,到用户手里就是个渣渣,还造成了各种卡顿或者anr,吐槽不断,另外东南亚用户设备还偏低,当然,近些年一直在发展,设备都在不断降低成本,很多廉价机器的推出也让设备性能不断往前,但是毕竟需要一个过渡期。

回到主题,我们做某些酷炫动画,比如某些下拉回弹,页面切换,粒子效果绘制的时候,我们需要评估用户设备的承受度,该不该用高清图绘制,该不该去除部分复杂动画效果?

可能你会说,我们可以给出一个标准,让一批用户来开启,一批用户关闭,甚至我们给出一个设置开关项,来让用户自由选择。确实,我们也这样干过,但是,这样真的够智能了吗? 难道用户需要体验完,还要寻寻觅觅到你设置开关项,找到关闭动画,才能摆脱卡顿。难道我们不可以运行时,检测到设备的场景吗?

答案是可以的,当时我们有相关自己定义的性能参数,比如内存,分辨率大小等来定义我们是否开启关闭AC渲染等,另外其实facebook内部也有类似的,那就是device-year-class

what is device year class?


ss

它是facebook官方推出的开源工具,主要用于通过检测手机上面的各种参数,来评估当前设备的‘上市年份’
github地址

what can this do?


  • 检测出不同设备的上市年份,比如2009 2012 2013 2014等
  • 利用年份参数。来形象映射描述出设备的性能,大家都知道,越早上市的手机,性能也差,反之越好,这是社会规律,我们可以用统计字段来收集,进而评估我们用户群体收集的性能情况

下面是fb提供的条件参数:
Mappings as of this writing (RAM is a ceiling):

RAM condition Year Class
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
more 2015
  • 针对不同年份的手机,来开启关闭某些动画效果等

how to use


  • compile in your project
1
compile 'com.facebook.device.yearclass:yearclass:2.0.0'
  • set up in your code
1
2
3
4
5
6
7
8
9
10
int year = YearClass.get(getApplicationContext());
//Then, later on, you can use the year class to make decisions in your app, or send it along with your analytics.
if (year >= 2013) {
// Do advanced animation
} else if (year > 2010) {
// Do simple animation
} else {
// Phone too slow, don't do any animations
}
  • stat your device year data
1
//upload year class data in your form to anylaze

整体下来,接入非常简单,快捷,大家也可以进入sample版来体验试玩,不过,目前来,year-class也存在一些缺陷:

  • [维度缺乏] 仅仅采取了cpu核数,时钟频率,内存维度,对于某些情况,我们可能还需要分辨率大小,比如耗电 渲染等
  • [非动态参数] 这个更多的也是静态设备分析,并不能很好的衡量用户app当前运行的实时状态,比如可用内存过低,cpu时间片给切割严重等实时场景
  • [缺乏直观描述] 其实这个lib更多的用于评估机器性能,而fb给出year维度,可能还不够直观,我们无非想知道机器的高中低情况或者占比,我们可以修改源码,定义某些参数维度是高端机,中端,低端,这样做性能交流也更直观了。

用户网络复杂度高

在做资讯类app时,比较头痛的是国外用户的网络, 国外的运营商带宽和时延场景更加复杂,包括国外里面虽然显示用户是wifi连接,但速度却比蜗牛还慢,你会发现网络报表里面wifi速度可能赶不上3g. Fxck.
一方面分析是由于连接了各种公共免费wifi或者个人热点. 一种是在wifi不稳定或者信号比较差的环境,比如电梯等,那么按照我们惯常的思维去评判一个用户的网络性能,就不能仅仅依赖于 NetworkUtil.isWifiNetwork() 这可能确实会颠覆我们之前的思维,但国外确实如此。

1 具备实时网络质量衡量的标准


有一个实时衡量用户网络状态的工具,除了network.isConnected(),而是网络质量,那我们该如何来评估呢?
facebook提供了一个网络质量检测sdk:network-connection-class

它可以通过采样来识别到当前网络的质量好坏,定义出几种级别:
Poor/Moderate/Good/Excellent/Unknown

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public enum ConnectionQuality {
/**
* Bandwidth under 150 kbps.
*/
POOR,
/**
* Bandwidth between 150 and 550 kbps.
*/
MODERATE,
/**
* Bandwidth between 550 and 2000 kbps.
*/
GOOD,
/**
* EXCELLENT - Bandwidth over 2000 kbps.
*/
EXCELLENT,
/**
* Placeholder for unknown bandwidth. This is the initial value and will stay at this value
* if a bandwidth cannot be accurately found.
*/
UNKNOWN
}

我们可以利用不同的网络级别来做不同的策略:

  • 加载不同size或者质量的新闻图片
  • 在网络好的场景进行文章预加载操作
  • 预测是否需要自动播放视频,而不单单是wifi下条件

如何接入?

  • compile class
1
compile 'com.facebook.network.connectionclass:connectionclass:1.0.1'
  • 在需要关注网络质量的地方实现网络变化接口,并且注册到fb的ConnectionClassManager
1
2
3
4
5
6
7
public interface ConnectionClassStateChangeListener {
public void onBandwidthStateChange(ConnectionQuality bandwidthState);
}
//and subscribe with the listener:
ConnectionClassManager.getInstance().register(mListener);

如果不需要监听变化,则可直接:

1
ConnectionQuality cq = ConnectionClassManager.getInstance().getCurrentBandwidthQuality();
  • 定义网络质量采样器来采集数据
1
2
3
4
5
// Override ConnectionClassStateChangeListener
ConnectionClassManager.getInstance().register(mListener);
DeviceBandwidthSampler.getInstance().startSampling();
// Do some downloading tasks
DeviceBandwidthSampler.getInstance().stopSampling();
  • 执行采样后,我们就可以知道网络质量数据了

具体教程查看-> (https://github.com/facebook/network-connection-class)

2 针对复杂网络来实时体验优化产品


除非监控实时的网络连接质量,我们在需求初期也需要在复杂环境下进行产品体验和测试,比如,我们利用fb提供的著名的ATC工具,来模拟各种2G/3G等自定义延时的网络,进而来应对调整不同的体验。fb内部也是通过在实验室利用ATC工具来做测试产品。
ATC工具使用教程:[ATC](http://facebook.github.io/augmented-traffic-control/)

3 其他维度:


利用大数据来分析,比如假设用户的生活情况规律是固定的,用户大部分的网络情况是高中低,我们有个算法值,下次根据这个来做差异化。

总结

  • 接入device-year-class,分析出目前我们产品机型的优劣,形象并及时了解到机型优劣变化,从而针对性的定制需求,减少卡顿和崩溃率,

  • 接入network-connection-class,了解线上用户访问网络的质量好坏,定义出/good/excellent级别,优化产品体验,进而预加载或者压缩,提升用户加载内容等网络体验。

  • 其实fb这些工具并没有用到很黑科技的东西,都是通过基本标准的定义来规范出机器好坏,而网络质量是通过采样来计算,定义出网络标准
  • 该sdk目前我还没有试过线上效果,不确定实际情况如何

https://github.com/facebook/network-connection-class
https://github.com/facebook/device-year-class


转载声明: 本文转载前需与作者联系并标明文章出处