大家遇到过什么 Android 兼容性问题?

众所周知,虽然开放性给Android系统带来了百花齐放百家争鸣的生态,但是也因其自由性,各个OEM厂商实现各自为政,使得Android开发者对此苦不堪言。Google CTS测试在一定程度上维护了Android,但是与苹果的统一性相比依然远远不足。那么各位开发者们在处理系统兼容性问题的时候遇到过哪些坑,各位又是怎么解决的呢?
关注者
1188
被浏览
19837

48 个回答

谢邀。。这个坑简直是太多了,一周都能被坑好几回,不得不吐槽一下!!我就简单说下最近遇到的:

1. 之前华为系统的webview内核有问题,只要有js交互,占用内存无限上升;某次测试达到恐怖的380M,简直吓尿;由于是webkit内核问题,无能为力;我们只能检测到是华为系统的这个特定版本的时候谈个Toast,告诉用户不要在页面逗留太长时间。。(现在这个bug已经修复了,当时系统版本:NXT-TL00C 01B1 29SP02)

2. 酷派某系统作死修改了Apk安装的过程,但是修改的有问题;没有清除老的dalvik-cache,导致apk虽然安装的是新的,但是运行的还是老的odex文件;只有在重启系统的时候才会生效;日了狗。

3. 红米手机1s某些特定版本对类的加载有问题;我们通常用API Level 10写代码,需要用到高版本的API比如API 21的UsageStats,API 19的AppOpsManager的时候会把SDK的class文件拷过来当作external lib编译;但是红米手机1s这样做竟然不行,它貌似把类解析的操作给提前了(虽然JVM规范没有说明应该什么时候进行)最后的结果是,我写的代码发布出去之后在红米手机上大面积集中崩溃,其他手机没什么事。最后没办法,全部用反射+动态代理实现,我要吐血。对了,当时公司没有这种类型的测试机,我们老大给钱我去淘宝上买。。最后与卖家在北京三元桥当面交易的;拿到手机之后才查找原因,查到原因之后我们又退了 :D 一时传为笑谈。

然后还有两个Android系统遇到的BUG:

1. Android API 17以前的对硬编码的颜色(比如#123345这样的)会把它当作常量处理,然后把这个不可变的量放在系统Resource的缓存里面;以后会尽可能使用这个缓存;结果如果你的app的某个页面布局如果使用了透明背景,在两个差异不大的界面进行跳转的时候,一个用了硬编码的颜色,一个使用资源颜色;就会发现那个颜色不会刷新!具体代码可以参见setBackgroudDrawable里面,在API 17以后加了一个mutate,解决了这个bug。我们的app当时的表现就是通知栏有时候是灰色的有时候是白色的,还以为是系统渲染的问题;最后,我们在API 17上加了一个兼容:如果遇到颜色值,不论如何直接new一个ColorDrawable,而不是使用传递进来的。

2. Android 6.0以前对于类的访问权限控制一直有BUG!(也是public,private之类的)详细可以见:developer.android.com/a
具体来说就是在Android 6.0以前使用newInstance反射调用类的构造函数的时候,没有严格检查类的访问权限,包访问权限的类在外部不用设置setAccessible也能直接访问。由于在xml里面使用的View都是使用反射调用这些类的构造函数的,我们当时有大量的自定义View是包访问权限的,在Android 6.0以下一直表现正常;突然陆陆续续地崩溃后台数字持续上升,都是Android 6.0系统;最后发现是Android 6.0修正了这个访问权限问题,使得我们之前的那些View都反射不到了!我们不得不全部紧急放量。。坑!自己挖的坑不声不响修复了,直接导致大量崩溃。。有苦难言。

Android的兼容性问题我能声泪俱下地控诉几个晚上。。。尼玛,先写这么多,有赞再更新;Fuck!!!

---------------------------------------
忍不住更新一条:
1. 记得当时做一个功能需要依赖Android API 21以上的API UsageStats;自然是在需要的时候进行了if (Build.VERSION.SDK_INT >= 21) 这样的判断;结果崩溃后台一直有一个崩溃,说是找不到UsageStats这个类;我真是百思不得其解,一直觉得不太科学啊,你把AOSP源码拿去改了可以,但是像这样被public导出的接口你特么不会给我删了吧!最后,看了好半天都快绝望了。竟然发现,这个崩溃手机的API Level是 27!Android版本是4.2.2,卧槽!!脑残厂商,ROM编译版本都写错了!!当时找到这个原因之后发了一条朋友圈:
从此魅族一生黑,fuck。

唉,年前的事情不知道崩溃发生在那个版本,去后台大海捞针找了好半天,总算找到了;(细节没记清楚,系统是4.2.1,不过无伤大雅)截图如下:
1. 屏幕适配:这个问题现在好些了,主流的手机都升级到了720p和1080p,但是手机考虑xhdpi和xxhpi、平板考虑large和xlarge再加上横竖屏,要把这些完美地做到一个应用中去,可不是一件容易的事。
2. API、系统行为适配:像硬件加速、webview、沉浸式等等这些,不同的系统都会有些不一样。比如沉浸式,5.0、4.4和MIUI这些都是不一样的,这些都要根据实际情况适配。对于一些奇葩的系统(// 对,没错,我就是说bug me)这些只能发现一个改一个了~

说一些比较少关注的:

1. 多语言与大字体:有些语言是从右向左排版的,比如阿拉伯语。有些语言翻译是老长老长的,比如俄语这些。更丧心病狂的还有大号字体!!!各种截断什么的都要处理。
2. 输入法和软键盘:Android为什么没有一个通用的方法获得键盘的高度和当前的状态啊!!!连要隐藏掉键盘都要各种方法。。。。
3. 窗口属性:全屏、分屏、控制状态栏的显示隐藏、控制应用的平滑切换。。。不说了,都是泪。。。
为什么?