"你们好,我是谷歌的开发技术推广工程师,主要负责 Android 在中国的兼容性问题。咱们发现,每次有 Android 新版本发布时,国内有不少应用因为没有遵循最佳开发实践,或使用了依赖于底层非公开 API 的 “黑科技”,而没法直接在新版本上运行,必须作出至关的代码修改来进行兼容。在这篇文章中,咱们总结了关于应用开发在兼容性方面的注意事项,但愿你们在开发过程当中多加注意。"android
私有 API 是指 Android 系统内部使用、并未提供公开接口的 API,开发者可能经过 Java 反射等技术来调用这些私有 API。可是,这么作是很危险的:私有 API 没有任何公开文档,必须查看源代码才能理解其行为逻辑。安全
私有 API 的接口信息、函数签名(包括参数列表和返回值)、行为逻辑都有可能在下个 Android 版本中被大幅修改,甚至 API 自己也可能被删除。这会致使使用私有 API 的应用在新的 Android 版本中没法运行,或运行时产生不符合预期的行为,开发者必须投入至关的研发资源保持其在将来每一个 Android 新版本中的适配。框架
直接使用底层的私有 API 有可能会绕过一些 Android 对用户的安全性和隐私性方面的保护,不但影响用户体验、妨害用户隐私,也极可能会被 Google Play Protect 断定为恶意软件而提示用户卸载应用。ionic
因此,咱们强烈建议开发者只使用 Android 公开的 API 进行应用开发。公开 API 有详细的技术文档和支持渠道,将来的 Android 新版本也会保证公开 API 的兼容性(即便有改动,也会在文档中详细阐明)。函数
若是您有合理的理由,必须使用某个私有 API,请告诉咱们!咱们很乐意聆听和讨论,并会在充分评估必要性和可行性后,在 Android 系统或 Support Library 中提供方案来知足合理的功能需求。工具
从一开始,dex2oat 就被设计为系统内部使用的编译部署工具,Android 历来都未支持过开发者直接调用 dex2oat 的场景。咱们会持续而不按期地对这个工具进行优化,而不少时候其行为变动(如:生成的文件及其格式)都是与以前不兼容的。在大多数状况下,标准的类加载器(BaseDexClassLoader / DexClassLoader / PathClassLoader)没法找到或使用由直接调用 dex2oat 生成的文件。布局
若是您须要从内存中加载 dex 文件,而不肯在存储中留下痕迹,请使用 Android O 中新增的加载器 InMemoryDexClassLoader。优化
Android Studio 生成的 dex 文件虽然有公开的布局格式,但具体内容仍是会在运行时被系统在后台进行编译优化。若是您在 dex 文件中写入自定义的内容,极可能这些自定义的写入操做与系统优化发生冲突,以至自定义的内容被擦除或覆盖,甚至致使优化后的 dex 在执行时直接崩溃。google
Android Studio 生成的 so 文件包含一些元数据(如 ELF headers 和 section headers),以备动态连接器进行完整性检查。篡改 so 文件并不会带来安全性的提高(不少工具能够从新生成元数据),反而可能致使应用没法在将来的 Android 版本中没法启动(因为动态连接器可能执行更严格的检查)。更多关于 so 文件的要求,请查看如下连接中的文档(会有不按期更新):设计
android.googlesource.com/platform/bi…
Android 系统内部加载 dex 的逻辑比较复杂,会考虑不少因素(如安全性、隐私性等),其具体行为逻辑也可能会在新版本中加以修改。若是您干扰或篡改了 dex 的加载逻辑,不但会增长安全性方面的风险,也极可能在新的系统更新后再也不工做,甚至致使应用没法运行。
DexFile 类已经在 Android O 中被废弃。DexFile 在应用开发中的使用暴露了不少问题,致使应用崩溃或错误结果。
好比,当多个类加载器试图使用同一个 DexFile 对象来定义某个类时,Android 系统会抛出 InternalError,其错误信息为 “Attempt to register dex file with multiple class loaders”。这是由于运行环境将 DexFile 与一些附加的内部状态信息进行关联,而这些内部状态信息不能在类加载器之间进行共享。
因此,请不要在应用代码中再使用 DexFile 类型。
在中国的 Android 生态中,应用常常依赖的第三方 SDK(特别是加固和热修复框架)会有不少直接的 dex 操做,而致使应用在 Android 版本升级时没法正常运行。咱们也开始与一些常见的 SDK 提供商合做(并计划覆盖更多),在 Android 新的预览版本中尽早解决兼容性问题。对于应用开发者来讲,只须要常常检查第三方 SDK 的升级公告,及时升级至其最新版本,就能解决大部分与其相关的兼容性问题。
看了工程师划的重点,不知您是否有种豁然开朗的感受呢?面对复杂的中国 Android 开发生态,不少朋友都会遇到一些特殊的问题,为了更好地服务于国内的 Android 开发者,咱们会在收集到必定量特定领域的咨询后,为你们带来 Google 工程师的解决建议及规避方法。
您还有哪些难以解决的开发问题呢?欢迎留言!