Android 开发者 | 应用兼容性注意事项

由于国内 Android 开发环境的特殊性,兼容性一直是很多开发者极为关注的问题。为此,我们特意请来了负责 Android 在中国兼容性问题的 Google 工程师为大家对一些常见问题做出解答,来看看我的工程师提到了哪些要点吧!

"大家好,我是谷歌的开发技术推广工程师,主要负责 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 的兼容性(即使有改动,也会在文档中详细阐明)。

如果您有合理的理由,必须使用某个私有 API,请告诉我们!我们很乐意聆听和讨论,并会在充分评估必要性和可行性后,在 Android 系统或 Support Library 中提供方案来满足合理的功能需求。

不要直接调用 dex2oat

从一开始,dex2oat 就被设计为系统内部使用的编译部署工具,Android 从来都未支持过开发者直接调用 dex2oat 的场景。我们会持续而不定期地对这个工具进行优化,而很多时候其行为变更(如:生成的文件及其格式)都是与之前不兼容的。在大多数情况下,标准的类加载器(BaseDexClassLoader / DexClassLoader / PathClassLoader)无法找到或使用由直接调用 dex2oat 生成的文件。

如果您需要从内存中加载 dex 文件,而不愿在存储中留下痕迹,请使用 Android O 中新增的加载器 InMemoryDexClassLoader。

不要注入或篡改 Android Studio 生成的 dex 和 so 文件

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

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

android.googlesource.com/platform/bi…

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

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

不要使用 DexFile 类

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

比如,当多个类加载器试图使用同一个 DexFile 对象来定义某个类时,Android 系统会抛出 InternalError,其错误信息为 “Attempt to register dex file <filename> with multiple class loaders”。这是因为运行环境将 DexFile 与一些附加的内部状态信息进行关联,而这些内部状态信息不能在类加载器之间进行共享。

所以,请不要在应用代码中再使用 DexFile 类型。

及时升级第三方 SDK

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

看了工程师划的重点,不知您是否有种豁然开朗的感觉呢?面对复杂的中国 Android 开发生态,很多朋友都会遇到一些特殊的问题,为了更好地服务于国内的 Android 开发者,我们会在收集到一定量特定领域的咨询后,为大家带来 Google 工程师的解决建议及规避方法。

您还有哪些难以解决的开发问题呢?欢迎在我们平台留言!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【专业技术】Node.js 究竟是什么?

简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:“Node 究竟是什么东西?” 即便是在参阅 Node 的主页...

34270
来自专栏魏琼东

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET平台开发指南 - 实现业务

业务分层         依据行业经验来看,分层是解决复杂问题的简单方法,通过分层,可以把一个复杂问题分解为不同层次应用的小问题,解决各层小问题的难度小于总的问...

203110
来自专栏jerryteng的专栏

如何利用最低配的腾讯云快速搭建高并发在线服务

这里是作为开发用,我们就选择一个普通的服务器,我也是很不好意思的申请了相关的学生机,那我们就用学生机来搭建一个高并发的在线服务。这个机器配置很低,我还进行了降级...

1.1K100
来自专栏CSDN技术头条

携程开源Redis多数据中心解决方案XPipe

Redis在携程内部得到了广泛的使用,根据客户端数据统计,整个携程全部Redis的读写请求在每秒200W,其中写请求约每秒10W,很多业务甚至会将Redis当成...

47790
来自专栏匠心独运的博客

过来人的经验,谈谈一致性处理方案—分布式事务(DTS)

传统事务是使用数据库自身的事务属性(ACID),而数据库自身的事务属性是局限于当前实例,不能实现跨库。而对于大型分布式/微服务集群系统中,不仅存在着跨库的事务,...

47540
来自专栏FreeBuf

利用HTTP参数污染方式绕过谷歌reCAPTCHA验证机制

今年初,我上报了一个谷歌reCAPTCHA验证码绕过漏洞,该漏洞在于能用一种HTTP参数污染的不安全方式,让Web页面上的reCAPTCHA构造一个针对 /re...

48230
来自专栏古时的风筝

学了两天 react,乱讲一下学习思路,顺便弄了一个脚手架

现在的项目基本上都是前后端分离的,后端就先不提了。前端的框架也是层出不穷,使用最多的就是 angular、vue、react 。angular 是前几年用的比较...

11230
来自专栏腾讯NEXT学位

阅读前端项目源码的正确姿势!

18740
来自专栏BestSDK

一提交代码系统就崩溃? 给你8个避免此尴尬的技巧

当一群人作为一个整体同时进行一个程序的编写时,每个个体都会面临两方面的权衡: ●个人部分的实现——你需要保证你负责的代码部分可以正常运行; ● 整体部分的实现—...

38270
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(39)-在线人数统计探讨

基于web的网站在线统计一直处于不是很精准的状态!基本上没有一种方法可以确实的统计在线用户! Discuz!NT 在线用户功能算是做得比较好的!参考资料 他的原...

22880

扫码关注云+社区

领取腾讯云代金券