此文已由作者申国骏授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
Android官方的迁移适配文档有点混乱,这篇文章旨在给开发者在适配中对代码做快速检查。适配变化将分为运行版本影响和Target版本影响,并提供可能影响的功能以便测试参考。
官方行为变更文档 getConnectionInfo
使用 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_STATE 或TelephonyManager.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解码相关的功能 |
更多网易技术、产品、运营经验分享请点击。