Andriod版本适配 check list(持续更新)

叁叁肆2018-11-20 15:29

此文已由作者申国骏授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。


前言

Android官方的迁移适配文档有点混乱,这篇文章旨在给开发者在适配中对代码做快速检查。适配变化将分为运行版本影响和Target版本影响,并提供可能影响的功能以便测试参考。


Android 9 (API level 28)

官方行为变更文档 getConnectionInfo


非SDK接口使用限制

使用 veridex工具测试apk是否有调用非SDK接口

➜  veridex-mac ./appcompat.sh --dex-file=test.apk

实例结果如下:

6889 hidden API(s) used: 6817 linked against, 72 through reflection
       0 in blacklistgetConnectionInfo
       3 in dark greylist
       47 in light greylist
To run an analysis that can give more reflection accesses, 
but could include false positives, pass the --imprecise flag.

其中:
类型 | 描述 ---|--- blacklist | 不管是否target到28,都会报NoSuchMethodError/NoSuchFieldException
dark greylist | 如果target在28一下没问题,但是target到28及以上会报NoSuchMethodError/NoSuchFieldException
light greylist | 暂时没有问题,可以使用

处理办法:
去除blacklist以及dark greylist的非android sdk调用的反射调用,有些是android support包内部调用的可以考虑升级support包版本


隐私&权限相关

运行在9.0受到影响 可能受到影响的功能
不能在后台访问麦克风和摄像头 后台录音、后台拍照
加速器陀螺仪等传感器不能在后台持续获取数据 步数计算
通过变化模式或者单次模式的传感器收不到事件 显著运动检测、计步器、近程传感器和心率传感器
通话记录权限组别由PHONE组调整到CALL_LOG 需要获通过记录权限的功能
通过android.intent.action.PHONE_STATETelephonyManager.listen方法获取手机号码需要申请READ_CALL_LOG 权限 例如来电归属地显示或者来电拦截等需要获取通话手机号的功能
wifi扫描频率限制更为严格,getConnectionInfo WifiManager.getScanResults()以及WifiManager.startScan()需要而外权限详见 需要wifi扫描匹配等功能
WifiManager.getConnectionInfo() 要获得SSID和BSSID,要求定位权限并要求设备打开定位功能,NETWORK_STATE_CHANGED_ACTION不再能获得SSID和BSSID 需要获取wifi信息的功能
WifiManager与WifiP2pManager中getScanResults() getConnectionInfo()discoverServices() addServiceRequest()NETWORK_STATE_CHANGED_ACTION不再包含用户定位信息 使用wifi定位功能
getAllCellInfo() listen() getCellLocation() getNeighboringCellInfo()不返回结果,除非用户打开了定位功能 使用移动信号定位


Target在9.0受到影响 可能受到影响的功能
启动前台服务要去注册android.permission.FOREGROUND_SERVICE权限 前台服务启动
获取序列号不能通过Build.SERIAL,需要注册android.permission.READ_PHONE_STATE然后使用Build.getSerial() 获取序列号相关功能


安全相关

运行在9.0受到影响 可能受到影响的功能
SSLSocket出错不返回NullPointerException,改成返回IOException https网络错误处理
加密函数Cipher.getInstance("AES/CBC/PKCS7PADDING", "BC") Cipher.getInstance("AES/CBC/PKCS7PADDING",Security.getProvider("BC")) SecureRandom.getInstance("SHA1PRNG", "Crypto");移除 加密功能
Android secure encrypted files移除 移动app到sdcard功能


Target在9.0受到影响 可能受到影响的功能
DNS客户端需要根据系统使用加密DNS查找与系统相同的主机名,或改由系统解析程序 DNS自解析功能
默认要求使用https,如果需要使用http需要设置cleartextTrafficPermitted="true"详见 所有http网络请求
webview的数据包括cookies和caches不允许多进程共享 多进程使用webview
不用通过设置全局Unix权限共享数据文件,不用应用的文件共享需要使用ContentProvider 应用间文件共享

国际化相关

运行在9.0受到影响 可能受到影响的功能
java.text.SimpleDateFormat 使用zzzz格式、java.text.DateFormatSymbols.getZoneStrings()格式、NumberFormat.getInstance(ULocale, PLURALCURRENCYSTYLE).parse(String)格式修改 时区、货币显示相关功能


网络相关

运行在9.0受到影响 可能受到影响的功能
NetworkCapabilities支持返回NET_CAPABILITY_NOT_VPN vpn设置功能
Apache HTTP client不能使用system ClassLoader加载,若要使用需要实现自定义ClassLoader 使用旧Apache Http client网络功能


Target在9.0受到影响 可能受到影响的功能
NetworkStatsManager能获取非当前正在使用的流量情况 网络使用统计
ConnectivityManager.getMultipathPreference() 可以获取是否超过了移动流量使用限制 网络使用情况提醒
Apache Http背去除,要使用需要加上<uses-library android:name="org.apache.http.legacy" android:required="false"/>或者想apache.http相关类包通过jar方式引入 使用旧Apache Http client网络功能


界面相关

运行在9.0受到影响 可能受到影响的功能
通过非activity的context启动activity强制要求intent带上FLAG_ACTIVITY_NEW_TASK 后台启动页面
屏幕旋转方式由原来的“自动旋转”和“纵向”改为“自动旋转”和“固定旋转” 屏幕旋转功能


Target在9.0受到影响 可能受到影响的功能
长或宽为0的view不再可以获取焦点,新开页面不默认获取焦点 交互过程通过特殊焦点实现的功能
webview可以支持带透明度的8位颜色css webview css 颜色透明度功能
webview中document的root元素滚动位置得到支持 webview 相关
暂停挂起app的通知会在app resumed之后重新通知 通知相关


设备相关

运行在9.0受到影响 可能受到影响的功能
多摄像头支持getCameraIdList()前后摄像头切换需要选择合适的摄像头 摄像头相关功能


其他

运行在9.0受到影响 可能受到影响的功能
UTF-8解码更加严格按照Unicode标准详见 UTF-8解码相关的功能


实用参考地址

权限组级别


免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击