应用兼容性

前言

因国内Android开发环境特殊性,兼容性一直备受开发者关注。每Android新版发布,国内很多应用因没遵循最佳开发实践或用依赖底层非公开API“黑科技”而无法直接在新版运行,须改相应代码兼容。

注意事项

不用私有API

私有API指Android系统内部用并未提供公开接口API,开发者可通Java反射等技术调这些私有API。但如此风险是私有API无任何公开文档,须查看源代码才能理解其行为逻辑。

私有API接口信息、函数签名(包括参数列表、返回值)、行为逻辑都可能在下Android版被大幅修改,甚至API本身也可能删除。这导致用私有API应用在新Android版无法运行或运行产生不符预期行为,开发者须投相当研发资源保持在未来每Android新版适配。

直接用底层私有API可能绕过一些Android对用户安全性和隐私性方面保护,不但影响用户体验、妨害用户隐私,也可能被Google Play Protect判定为恶意软件而提示用户卸载应用。

故强烈建议开发者只用Android公开API。公开API有详细技术文档和支持渠道,未来Android新版也保证公开API兼容性(改动则文档会详细阐明)。

不直接调用dex2oat

一开始dex2oat即被设计为系统内部用编译部署工具,Android从未支持开发者直接调用dex2oat场景。Google会持续而不定期对该工具优化,而很多时候其行为变更(如生成文件及其格式)都与前不兼容。大多情况标准类加载器(BaseDexClassLoader/DexClassLoader/PathClassLoader)无法找到或用由直接调用dex2oat所生文件。需从内存加载dex文件而不愿在存储中留痕则用Android O新增加载器InMemoryDexClassLoader

不注入或篡改Android Studio所生dex和so文件

Android Studio所生dex文件虽有公开布局格式,但具体内容仍运行时被系统在后台编译优化。若在dex文件中写入自定义内容,这些自定义写入操作很可能与系统优化冲突致自定义内容被擦除或覆盖,甚至导致优化后的dex执行时直接崩溃。

Android Studio所生so文件包含一些元数据(如ELF headerssection headers)以备动态链接器完整性检查。篡改so文件并不带来安全性提升(很多工具可重生成元数据)反而可能致应用在未来Android版无法启动(因动态链接器可能执行更严格检查)。更多关于so文件要求查看文档(不定期更新)。

不干扰或篡改系统内部加载dex逻辑

Android系统内部加载dex逻辑较复杂,考虑很多因素(安全性、隐私性等),其具体行为逻辑也可能在新版修改。干扰或篡改dex加载逻辑不但增安全性方面风险,也可能在新系统更新后不再工作,甚至导致应用无法运行。

不用DexFile类

DexFile类已在Android O废弃。DexFile在应用开发中用暴露很多问题致应用崩溃或错误结果。

如当多个类加载器试图用同一DexFile对象定义某个类时,Android系统抛InternalError,错误信息为 Attempt to register dex file with multiple class loaders。这是因运行环境将DexFile与一些附加内部状态信息关联,而这些内部状态信息不能在类加载器间共享。故不要在应用代码再用DexFile类型。

及时升级第三方SDK

中国Android生态中应用常依赖第三方SDK(特别加固和热修复框架)有很多直接dex操作致应用在Android版升级时无法正常运行。我们开始与一些常见SDK提供商合作(并计划覆盖更多),在Android新预览版尽早解决兼容性问题。开发者只需常检查第三方SDK升级公告,及时升级至最新版即可解决大部分与其相关兼容性问题。

你可能感兴趣的:(android)