记一次适配bug解决过程,权用作经验教训分享
特此记录经验教训用作分享,希望大家涉及到此部分时,少走弯路。
问题描述:
-
经过客户反馈,oppo,vivo若干机型无法播放视频。(代表机型oppo a59s和oppo r7s)
身边没有上述两个机型,采用oppo r11测试,一切正常。 -
无法测试,只能梳理代码,寻找原因
-
项目描述:采用视频播放框架Vitamio
-
查询两款手机系统信息。
OPPO A59s
出厂操作系统 ColorOS 3.0 (基于Android 5.1)
CPU型号 联发科 MT6750OPPO R7s
出厂操作系统 Color OS 2.1(基于Android 5.1)
CPU型号 高通 骁龙Snapdragon MSM8939手机信息查询网址有很多, 在此推荐:http://www.zol.com.cn/
解决历程:
(以下方法均未解决问题,此处记录仅用作发散思维)
-
首先确定是否是账号问题,交叉测试后排除该原因。
-
查看是否是so库问题。
查看项目中lib库中的so文件,其中共包括armeabi, armeabi-v7a, x86, mips,分析后并无问题。
科普:
应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64。
如果项目只包含了 armeabi,那么在所有Android设备都可以运行;
如果项目只包含了 armeabi-v7a,除armeabi 架构的设备外都可以运行;
如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的;
如果同时包含了 armeabi, armeabi-v7a和x86,所有设备都可以运行,
程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大。
目前主流的Android设备是armeabi-v7a架构的,然后就是x86和armeabi了。
-
因为是无法播放视频,所以查看视频播放框架特性,及是否有机型不支持问题。查到数据如下:
Vitamio不支持特性列表
其中第1点,第7点,第8点,第14点需要引起注意。
我也花费了大量的时间和精力在这部分内容上,进行了多处包裹异常,以及机型判断,结果并无实质性改变。
科普:
早期的Android系统几乎只支持ARMv5的CPU架构,现在Android系统支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。
最终解决
找到了一部oppo a53m手机,经测试,重现了客户提到的问题。遂委托同事进行日志查看。
报错信息如下:
java. lang. NoSuchMethodError:No virtual method getColor(I)I in class Landroid/content/Context; or its super classes (declaration of' android. content. Context' appears in /system/frameworlk/franework. jar)
at com sxmh. wt. education. adapter. lesson. RoWatchlessonlisthdapter. onBindViewHolder(RviWatchlessonl istAdapter. java:54)
at com sxh. wt. educationadapter. lesson. RvTatchlessonlistAdapter. onBindviewHolder(RvWatchlessonl istidapter. java:23)
轻易可得:问题出现在设置颜色时,低版本系统无此方法。问题代码如下:
holder.tvTitle.setTextColor(context.getColor(R.color.colorTextRed));
解决办法:
修改为兼容低版本系统的方法。两种任选其一即可,如下:
// 该方法可以解决问题,但是不推荐
holder.tvTitle.setTextColor(context.getResources().getColor(R.color.colorTextRed));
// 推荐写法,兼容性更好
holder.tvTitle.setTextColor(ContextCompat.getColor(context, R.color.colorTextRed));
总结
- 一句代码就可能弄丢项目,导致公司的业务方向受损,代码开发,应仔细认真。
- 安卓机型适配问题十分复杂,最好找到同款或者相似机型,能复现问题后再做处理。
- 平常写代码,应多注意适配问题。本问题即为常见的适配问题,注意书写即可避免。
- 代码bug原因关联很多,不能死盯一处,处理问题的方向错了,怎么解决也无济于事。