Android P 应用兼容常见错误及建议

如果您使用的第三方 SDK 尚不支持 Android 新版本,请报告给其提供商,帮助推动它解决兼容性问题。

问题 3: 开启应用时显示 “Detected problems with API compatibility”,或调用非 SDK 接口时遭遇 NoSuchFieldException 或 NoSuchMethodException

原因:

非 SDK 接口指的是 Android 系统内部使用、并未提供在 SDK 中的接口,开发者可能通过 Java 反射、JNI 等技术来调用这些接口。但是,这么做是很危险的:非 SDK 接口没有任何公开文档,必须查看源代码才能理解其行为逻辑。

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

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

从 Android P 开始,系统会限制非 SDK 接口的使用

建议:

只使用 Android SDK 中的公开接口进行应用开发。公开 SDK 接口有详细的技术文档和支持渠道,未来的 Android 新版本也会保证公开 SDK 接口的兼容性 (即使有改动,也会在文档中详细阐明)。

请尽早在 Android P 预览版中测试您的应用,您可以运行并操作应用,然后在 adb logcat 中查找类似下方的内容,其中包含了应用调用的非 SDK 接口名,所属黑/灰名单和调用的方式: Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI) Accessing hidden method Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread; (dark greylist, reflection)

如果您有合理的理由,必须使用某个非 SDK 接口,请在文章下方留言给我们,我们非常期待聆听和与您进行讨论,并会在充分评估必要性和可行性后,提供可能的方案来满足合理的功能需求。

问题 4: 直接调用 dex2oat,或者使用不支持 / 不正确的方式编译 dex 文件

原因:

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

此外请注意,从 Android O 开始,BaseDexClassLoader 和 DexClassLoader 构造函数中的 “optimizedDirectory” 参数已废弃,并在加载 dex 文件时不起作用。

建议:

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

问题 5: 注入或篡改 Android Studio 生成的 dex 和 so 文件

原因:

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

Android Studio 生成的 so 文件包含一些元数据 (如 ELF headers 和 section headers),以备动态链接器进行完整性检查。篡改 so 文件并不会带来安全性的提升 (很多工具可以重新生成元数据),反而可能导致应用无法在未来的 Android 版本中启动 (由于动态链接器可能执行更严格的检查)。更多关于 so 文件的要求,您可在公众号平台发送信息 “so文件” 获取相关链接。

建议:

不要修改 Android Studio 生成的 dex 和 so 文件。

问题 6: 应用在 Android P 上启动时显示 “This app was built for an older version of Android and may not work properly…”

原因:

应用的 targetSdkVersion 太旧 ( <17 )

建议:

升级您应用的 targetSdkVersion 至最新版本,您可在公众号平台发送信息 “targetsdkversion” 获取相关文档链接。

问题7: 应用在特长屏幕上未能正确显示,部分内容超出屏幕

原因:

Android O 开始支持特长屏幕,而且已经有很多厂商开始发布特长屏幕的手机。应用对屏幕的显示比例做出错误的假设,而未能支持 16:9 以上的纵横比,进而影响用户体验。

建议:

修改您的应用,使他能够适应不同的屏幕尺寸 (包括 16:9 以上的纵横比)。

如果自适应式 UI 不适合您的场景,可以考虑在 manifest 中的 内设置 resizableActivity = false,并加上 android:MaxAspectRatio 来声明最大支持纵横比。这会在特长屏幕的设备上启用兼容模式,把应用边缘的显示空间以黑色填充。

问题 8: 应用在特长屏幕上未能正确显示,上下出现黑边

原因:

Android O 开始支持特长屏幕,而且已经有很多厂商开始发布特长屏幕的手机。应用对未能支持 16:9 以上的纵横比会在特长屏幕的设备上启用兼容模式,把应用边缘的显示空间以黑色填充。

建议:
升级您应用的 targetSdkVersion 至最新版本,您可在公众号平台发送信息 “targetsdkversion” 获取相关文档链接。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结语

看到这篇文章的人不知道有多少是和我一样的Android程序员。

35岁,这是我们这个行业普遍的失业高发阶段,这种情况下如果还不提升自己的技能,进阶发展,我想,很可能就是本行业的职业生涯的终点了。

我们要有危机意识,切莫等到一切都成定局时才开始追悔莫及。只要有规划的,有系统地学习,进阶提升自己并不难,给自己多充一点电,你才能走的更远。

千里之行始于足下。这是上小学时,那种一元钱一个的日记本上每一页下面都印刷有的一句话,当时只觉得这句话很短,后来渐渐长大才慢慢明白这句话的真正的含义。

有了学习的想法就赶快行动起来吧,不要被其他的事情牵绊住了前行的脚步。不要等到裁员时才开始担忧,不要等到面试前一晚才开始紧张,不要等到35岁甚至更晚才开始想起来要学习要进阶。

给大家一份系统的Android学习进阶资料,希望这份资料可以给大家提供帮助。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值