记一次适配bug解决过程,权用作经验教训分享

特此记录经验教训用作分享,希望大家涉及到此部分时,少走弯路。

问题描述:

  • 经过客户反馈,oppo,vivo若干机型无法播放视频。(代表机型oppo a59s和oppo r7s)
    身边没有上述两个机型,采用oppo r11测试,一切正常。

  • 无法测试,只能梳理代码,寻找原因

  • 项目描述:采用视频播放框架Vitamio

  • 查询两款手机系统信息。

    OPPO A59s

    出厂操作系统 ColorOS 3.0 (基于Android 5.1)
    CPU型号 联发科 MT6750

    OPPO R7s

    出厂操作系统 Color OS 2.1(基于Android 5.1)
    CPU型号 高通 骁龙Snapdragon MSM8939

    手机信息查询网址有很多, 在此推荐:http://www.zol.com.cn/

解决历程:

(以下方法均未解决问题,此处记录仅用作发散思维)

  1. 首先确定是否是账号问题,交叉测试后排除该原因。

  2. 查看是否是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了。

  3. 因为是无法播放视频,所以查看视频播放框架特性,及是否有机型不支持问题。查到数据如下:
    Vitamio不支持特性列表

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原因关联很多,不能死盯一处,处理问题的方向错了,怎么解决也无济于事。
发布了70 篇原创文章 · 获赞 176 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/zheng_weichao/article/details/89680064
今日推荐