Build.USER.length() % 10; //13 位

try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
serial = android.os.Build.getSerial();
} else {
serial = Build.SERIAL;
}
//API>=9 使用serial号
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
} catch (Exception exception) {
//serial需要一个初始化
serial = “serial”; // 随便一个初始化
}
//使用硬件信息拼凑出来的15位号码
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}

虽然由于唯一标识符权限的更改会导致android.os.Build.getSerial()返回unknown,但是由于m_szDevIDShort是由硬件信息拼出来的,所以仍然保证了UUID的唯一性持久性

经测试上述方法完全相同的手机有可能重复,网上还有其他方案比如androidID,但是androidID可能由于机型原因返回null,所以个人任务两种方法半斤八两。设备ID的获取一个版本比一个版本艰难,如果有好的方法欢迎指出。

  • minSDK警告

在 Android Q 中,当用户首次运行以 Android 6.0(API 级别 23)以下的版本为目标平台的任何应用时,Android平台会向用户发出警告。如果此应用要求用户授予权限,则系统会先向用户提供调整应用权限的机会,然后才会允许此应用首次运行。

谷歌要求运行在Q设备上的应用targetSDK>=23,不然会向用户发出警告。

Q 行为变更:以 Android Q 为目标平台的应用


非 SDK 接口限制

非SDK接口限制在Android P中就已提出,但是在Q中,被限制的接口的分类有较大变化

  • 非SDK接口介绍

为了确保应用稳定性和兼容性,Android 平台开始限制您的应用可在 Android 9(API 级别 28)中使用哪些非 SDK 接口。Android Q 包含更新后的受限非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。

非SDK接口限制就是某些SDK中的私用方法,如private方法,你通过Java反射等方法获取并调用了。那么这些调用将在target>=Ptarget>=Q的设备上被限制使用,当你使用了这些方法后,会报错:

获取方法报错信息
Dalvik instruction referencing a fieldNoSuchFieldError thrown
Dalvik instruction referencing a methodNoSuchMethodError thrown
Reflection via Class.getDeclaredField() or Class.getField()NoSuchFieldException thrown
Reflection via Class.getDeclaredMethod(), Class.getMethod()NoSuchMethodException thrown
Reflection via Class.getDeclaredFields(), Class.getFields()Non-SDK members not in results
Reflection via Class.getDeclaredMethods(), Class.getMethods()Non-SDK members not in results
JNI via env->GetFieldID()NULL returned, NoSuchFieldError thrown
JNI via env->GetMethodID()NULL returned, NoSuchMethodError thrown
  • 非SDK接口查找

如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用进行确认

当你调用了非SDK接口时,会有类似Accessing hidden XXX的日志:

Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)

但是一个大项目到底哪里使用了这些方法,靠review代码和看日志肯定是不现实的,谷歌官方也提供了官方检查器veridex用来检测一个apk中哪里使用了非SDK接口。veridex下载

其中有windows,linuxmac版本,对应下载即可。下载解压后命令行cdveridex目录下使用./appcompat.sh --dex-file=Q.apk即可自动扫描。Q.apk为包的绝对路径,如果包与veridex在相同目录下直接输入包文件名即可。

扫描结果分为两部分,一部分为被调用的非SDK接口的位置,另一部分为非SDK接口数量统计,例如:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • greylist: 灰名单,即当前版本仍能使用的非SDK接口,但在下一版本中可能变成被限制的非SDK接口
  • blacklist:黑名单,使用了就会报错。也是我们项目中必须解决的非SDK接口
  • greylist-max-o: 在targetSDK<=O中能使用,但是在targetSDK>=P中被限制的非SDK接口
  • greylist-max-p: 在targetSDK<=P中能使用,但是在targetSDK>=Q中被限制的非SDK接口

所以从适配Q的角度出发,除了greylist我们可以暂时不解决以外,其余三种类型的非SDK接口需要我们进行适配。

  • 非SDK接口适配

如果您的应用依赖于非 SDK 接口,则应该开始计划迁移到 SDK 替代方案。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API。

官方要求targetSDK>=P的应用不使用这些方法,并寻找其他的公共API去替代这些非SDK接口,如果找不到,则可以向谷歌申请,请求一个新的公共API(一般不需要)。

就我个人扫描并定位的结果来看,项目中使用非SDK接口大概率有以下两种情况:

  • 在自定义View的过程中为了方便,使用反射修改某个参数。
  • 三方SDK中使用了非SDK接口(这种情况比较多)。

第一种是好解决的,毕竟是我们自己写的代码。

第二种就头疼了,只能更新到最新的三方SDK版本,或者提工单、换库(也是整个适配过程中工作量最庞大的部分)。

项目升级遇到的问题


  • 模拟器X86,项目中SO库为v7

  • 找到so库源代码,编译成x86

  • 如果so库只是某个功能点使用,对APP整体没大影响,就可以屏蔽特定so库功能或略过测试

  • 如果so库是项目核心库必须加载,也可使用腾讯云测,上面有谷歌亲儿子Q版本。腾讯云测有adb远程连接调试功能(我没成功过)。adb连不上也没关系,直接安装就行,云测上也可以直接看日志。

  • 至于inter的houdini我尝试研究过,理论上能安装在x86模拟器上让它编译v7的so库,但是由于关于houdini的介绍比较少也比较旧,建议大家时间不充裕的话就别研究了。

  • Requires development platform Q but this is a release platform.

由于目前Q是preview版,所以targetSDK==Q 的应用只能在Q设备上跑。

  • INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2

这个错误是由于打包压缩so库时造成的,具体原因可见 issuetracker.google.com/issues/3704…

在AndroidManifest.xml的application节点下加入android:extractNativeLibs=“true”

可能有人加了上面代码还是不行,在app/build.gradle中的defaultConfig节点下加入

packagingOptions{ doNotStrip “/armeabi/.so” doNotStrip “/armeabi-v7a/.so” doNotStrip “/x86/.so” }

  • Didn’t find class “org.apache.http.client.methods.HttpPost"

在AndroidManifest.xml的application节点下加入

  • 如果你的项目没有适配过android O或P,那么你需要注意:

  • android O的读取已安装应用权限(对应用内自动更新有影响)

  • android P的默认禁止访问http的API

这两个版本的适配问题本文就不做详述,网上有很多详细的介绍。


总结

  • 适配还是不能拉下,如果你一下子从6.0升级到Q,你真的会哭的。
  • 平时也多注意三方库的更新,因为安卓版本的更新势必导致了需要更新三方库。
  • 官方文档的永远是最准确的。
    参考文献

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

总结

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2020面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。

2020面试真题解析
腾讯面试真题解析

阿里巴巴面试真题解析

字节跳动面试真题解析
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

[外链图片转存中…(img-o9sFFJ7l-1711291264888)]

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐