Android 12 已来,你的 App 崩溃了吗? 我们已经开始做 Android 12 的适配了,在 Android 12 中包含了很多的功能和一些行为的变更,接下来我们一起来分析这些行为的变更对我们的应用产生了那些影响。

通过这篇文章你将学习到以下内容:

  • 为什么在 Android 12 上需要显示声明 android:exported 属性?
  • 为什么在 Android 12 上需要显示指定 PendingIntent 的可变性?
  • 为什么在 Android 12 上限制 adb 备份的默认行为?
  • 如何检查 App 的安全漏洞?

android:exported 属性

在 Android 12 中包含 <intent-filter>activityservicereceiver 必须为这些应用组件显示声明 android:exported 属性,如下所示。

<activityandroid:name=".TestActivity"android:exported="false"><intent-filter>......</intent-filter>
</activity>

如果在包含 <intent-filter>activityservicereceiver 组件中,没有显示声明 android:exported 的值,你的应用将无法安装,错误日志如下所示。

Installation did not succeed.
The application could not be installed: INSTALL_FAILED_VERIFICATION_FAILURE
List of apks:
[0] '.../build/outputs/apk/debug/app-debug.apk'
Installation failed due to: 'null'

如果您的应用在需要声明 android:exported 的值时未进行此声明,错误日志如下所示。

Targeting S+ (version 10000 and above) requires that an explicit value for \
android:exported be defined when intent filters are present

如果对上面的异常产生的条件,不是很理解,可以点击下方链接查看,目前已经有很多开源项目都已经开始适配这个行为的变更了,例如 leakcanary 等等,详情前往查看下列地址:

  • Update launcher activity attribute to Android 12
  • Declared android:exported explicitly for components with intent-filter. Android 12 requirement

这个行为的变更无论是对库开发者 和 还是应用开发者影响都非常大。

为什么在 Android 12 上需要显示声明 android:exported 属性

android:exported 属性的默认值取决于是否包含 <intent-filter>,如果包含 <intent-filter> 那么默认值为 true,否则 false。

  • android:exported="true" 时,如果不做任何处理,可以接受来自其他 App 的访问
  • android:exported="false" 时,限制为只接受来自同一个 App 或一个具有相同 user ID 的 App 的访问

正因为 android:exported 的属性的默认值的问题,Twicca App 发生过一次安全性问题,因为另一个没有访问 SD 卡或网络权限的 App,可以通过 Twicca App 将存储在 SD 卡上的图片或电影上传到 Twicca 用户的 Twitter 账户上的社交网络上。

产生问题的代码如下所示:

<activity android:configChanges="keyboard|keyboardHidden|orientation" android:name=".media.yfrog.YfrogUploadDialog" android:theme="@style/Vulnerable.Dialog" android:windowSoftInputMode="stateAlwaysHidden">           <intent-filter android:icon="@drawable/yfrog_icon" android:label="@string/YFROG"><action android:name="jp.co.vulnerable.ACTION_UPLOAD" />                <category android:name="android.intent.category.DEFAULT" />                <data android:mimeType="image/*" />                <data android:mimeType="video/*" />            </intent-filter>
</activity>

因为添加了 intent-filter 所以 android:exported 的属性的默认值为 true,因此可以接受来自其他 App 的访问,进而造成了上述问题(通过 Twicca App 将存储在 SD 卡上的图片或电影上传到 Twicca 用户的 Twitter 账户上的社交网络上),而解决方案有两个:

  • 方案一:添加 android:exported="false" 属性
<activity android:exported="false" android:configChanges="keyboard|keyboardHidden|orientation" android:name=".media.yfrog.YfrogUploadDialog" android:theme="@style/ VulnerableTheme.Dialog" android:windowSoftInputMode="stateAlwaysHidden" >
</activity>
  • 方案二: Twicca App 没有使用方式一,而是检查调用者的包名是否与自身的包名相同
public void onCreate(Bundle arg5) {super.onCreate(arg5);...ComponentName v0 = this.getCallingActivity();if(v0 == null) {this.finish();} else if(!jp.r246.twicca.equals(v0.getPackageName())) {this.finish();} else {this.a = this.getIntent().getData();if(this.a == null) {this.finish();}...}}
}

这种方案也是可行的,因为在一台设备上,不可能会出现两个包名相同的应用,更多详细的信息可以前往查看 Restrict access to sensitive activities。

这仅仅是关于 activity 的安全漏洞的其中一个,在不同的场景下利用这些漏洞做的事情也可能不一样。当然还有 servicereceiver 组件也都是一样,存在安全性问题。

指定 PendingIntent 的可变性

在 Android 12 中创建 PendingIntent 的时候,需要显示的声明是否可变,请分别使用 PendingIntent.FLAG_MUTABLEPendingIntent.FLAG_IMMUTABLE 标志,如果您的应用试图在不设置任何可变标志的情况下创建 PendingIntent 对象,系统会抛出 IllegalArgumentException 异常,错误日志如下所示。

PACKAGE_NAME: Targeting S+ (version 10000 and above) requires that one of \
FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if \
some functionality depends on the PendingIntent being mutable, e.g. if \
it needs to be used with inline replies or bubbles.

为什么在 Android 12 上需要显示的指定 PendingIntent 的可变性

在 Adnroid 12 之前,默认创建一个 PendingIntent 它是可变的,因此其他恶意应用程序可能会拦截,重定向或修改此 Intent。(但是是有条件限制的)

一个 PendingIntent 是一个可以给另一个应用程序使用的 Intent,PendingIntent 接收待处理意图的应用程序可以使用与产生待处理意图的应用程序相同的权限和身份执行待处理意图中指定的操作。

因此,创建待处理意图时必须小心,为了安全性 Google 在 Android 12 中需要开发者自己来指定 PendingIntent 的可变性。

更多关于 PendingIntent 安全性介绍,可以前往查看 Always pass explicit intents to a PendingIntent。

adb 备份限制

Android 开发者都应该知道这个命令 adb backup , 它可以备份应用的数据,在 Android 12 中,为了保护私有应用数据,用户运行 adb backup 命令时,从设备导出的任何其他系统数据都不包含应用数据。

如果你在测试和开发过程中需要使用 adb backup 来备份应用数据,你可以在 AndroidManifest 中将 android:debuggable 设置为 true 来导出应用数据。

<applicationandroid:name=".App"android:debuggable="true"....../>

注意:在发布应用前将 android:debuggable 设置为 false。

为什么在 Android 12 上限制了 adb backup 命令的默认行为

因为这个存在严重的安全问题,当初 Google 为了提供 App 数据备份和恢复功能,可以在 AndroidManifest 中添加 android:allowBackup 属性,默认值为 true, 当你创建一个应用的时候,会默认添加这个属性,如下所示。

<applicationandroid:name=".App"android:allowBackup="true"....../>

android:allowBackup="true" 时,用户可以通过 adb backupadb restore 命令对应用数据进行备份和恢复,也就是说可以在其他的 Android 手机上安装同一个应用,通过如上命令恢复用户的数据。

为了安全起见,我们在发布出去的 Apk 中一定要将 android:allowBackup 属性设置为 false 来关闭应用程序的备份和恢复功能,以免造成信息泄露。国民级应用 XX 信, 在曾今发出的版本中 allowBackup 的属性值是 true,被其他逆向开发者利用之后,现在的版本中这个值已经修改为 false了,有兴趣的小伙们可以反编译看看。

如何检查 App 的安全漏洞

在这里推荐一个开源项目 linkedin/qark 这是由 LinkedIn 开源的项目,这个工具被设计用来寻找与安全相关的 Android 应用程序漏洞,无论是源代码还是打包的 APK,具体的用法文档上写的非常的清楚了,这里不做详细的介绍了。

这个开源项目的检查结果,作为参考即可。当然也有很多公司花了重金去购买第三方的服务来检查 App 的安全漏洞。

在 Android 12 上这几个行为的变更它们都有一个共性:安全性,可见 Google 这几年在安全上做了很多的努力,当然还有其他的一些行为的变更,可以前往查看 行为变更:以 Android 12 为目标平台的应用。

参考文章

  • 行为变更:以 Android 12 为目标平台的应用
  • Update launcher activity attribute to Android 12
  • Declared android:exported explicitly for components with intent-filter. Android 12 requirement
  • confluence

如果有帮助 点个赞 就是对我最大的鼓励

代码不止,文章不停


最后推荐长期更新和维护的项目:

  • 个人博客,将所有文章进行分类,欢迎前去查看 https://hi-dhl.com

  • KtKit 小巧而实用,用 Kotlin 语言编写的工具库,欢迎前去查看 KtKit

  • 计划建立一个最全、最新的 AndroidX Jetpack 相关组件的实战项目 以及 相关组件原理分析文章,正在逐渐增加 Jetpack 新成员,仓库持续更新,欢迎前去查看 AndroidX-Jetpack-Practice

  • LeetCode / 剑指 offer / 国内外大厂面试题 / 多线程 题解,语言 Java 和 kotlin,包含多种解法、解题思路、时间复杂度、空间复杂度分析

    • 剑指 offer 及国内外大厂面试题解:在线阅读
    • LeetCode 系列题解:在线阅读

近期必读热门文章

  • Android 进化史 1.0 到 12 ,还记得第一次使用是哪个版本?
  • LinkedList 落幕了吗?
  • Oracle 官方推荐,使用 ReentrantLock 需要注意的细节
  • Kotlin 宣布一个重磅特性
  • Google 宣布废弃 LiveData.observe 方法
  • 使用 kotlin 需要注意的一个细节
  • 影响性能的 Kotlin 代码(一)
  • Jetpack Splashscreen 解析 | 助力新生代 IT 农民工 事半功倍
  • 为数不多的人知道的 Kotlin 技巧及解析(三)
  • 为数不多的人知道的 Kotlin 技巧以及 原理解析(二)
  • 为数不多的人知道的 Kotlin 技巧以及 原理解析(一)
  • 揭秘 Kotlin 中的 == 和 ===
  • Kotlin 密封类进化了
  • Kotlin 中的密封类 优于 带标签的类
  • Kotlin Sealed 是什么?为什么 Google 都在用
  • Android 12 行为变更,对应用产生的影响
  • 图解多平台 AndroidStudio 技巧(三)

Android 12 已来,你的 App 崩溃了吗?相关推荐

  1. Android 12 “致命”崩溃解决之路

    作者:林作健 UC内核在Android 12上发现一个致命的崩溃.约有10%的用户在冷启动的时候会遇到这个问题,严重影响了UC内核的发布.它的调用栈是这样的: 10-12 19:03:21.461 1 ...

  2. Android 12 三星ONE UI 4.0 卸载应用不彻底重装APP后还有旧数据问题分析。

    海外项目遇到一个奇怪得异常,客户有一台三星 one ui 4.0 android 12的手机,卸载APP后重装APP,旧数据还在.该行为会因为修改一点业务代码重新打的包有差异,我们又测试了S22  o ...

  3. Android 12 新版本泄露,隐私安全可媲美 iOS 系统?

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 去年,由于突发的形势,谷歌取消了一年一度的 I/O 开 ...

  4. android 发布最新系统更新包,Android 12系统

    详情 Android 12系统,非常好用的安卓最新上线的系统工具,通知中心.弹窗进行改动,且字体.手机布局轻松使用,用户可以根据自己的喜欢的手机型号进行使用,新增"Silky Home&qu ...

  5. Android 12.0 rom定制专栏系列解读

    一.前言 在从事android系统rom定制化的这几年里,经历了坎坎坷坷,开发过好几种类型的产品,也随着google对android系统的更新加快,也需要跟随上时代的进步,所以需要把平时工作中遇到的问 ...

  6. Android 12 新APP启动画面(SplashScreen API)简介源码分析

    以往的启动画面 默认情况下刚启动APP时会显示一会白色背景 如果把这个启动背景设置为null,则一闪而过的白色会变成黑色 如果把启动Activity设置为背景透明[< item name=&qu ...

  7. 解决 Android WebView 多进程导致App崩溃

    应用场景 应用内有两个位置用到WebView加载页面,具体处理逻辑不能通用.分别扩展了WebView了.应用内独立页面使用Fragment来展示,(采用单Activity架构).应用提供切换语言功能. ...

  8. android 内存播放视频播放器,视频流媒体播放器EasyPlayer-RTSP安卓版在RK3399上运行APP崩溃问题...

    原标题:视频流媒体播放器EasyPlayer-RTSP安卓版在RK3399上运行APP崩溃问题 我们的流媒体服务器现在都已经支持H.265编码视频的播放,流媒体播放器EasyPlayer就是目前比较稳 ...

  9. 首台android手机号码,国内首批手机Android 12尝鲜列表已公布,华为与荣耀不在名单之上...

    今天凌晨,谷歌在 I/O 2021大会上正式发布Android 12操作系统,并且开放了Android 12 Beta 1的下载链接,除了可支持谷歌Pixel机型以外,国内的众多手机品牌也在首次尝鲜名 ...

  10. Android 利用Intent启动另一个app应用时,一个崩溃的问题

    今天在做Launcher项目时,需要显示所有app,并且点击调用,在调用时,遇到一个崩溃问题.在此做一记录. 问题:在本地写的一个demo应用,里面有一个bug,点击这个demo应用,应用崩溃.在la ...

最新文章

  1. vb与S7200PLC通信源代码下载
  2. STM32F0xx_EXIT中断配置详细过程
  3. 解决ASP.NET中的各种乱码问题
  4. python 深度 视差 计算_OpenCV-Python教程:49.立体图像的深度图
  5. Apache负载均衡+Tomcat集群
  6. 机器学习中防止过拟合方法
  7. 什么是数据标准管理系统
  8. ORB-SLAM3:一个用于视觉、视觉惯性和多地图SLAM系统
  9. LimeSDR新手入门教程(一)
  10. Mac苹果电脑总是自动重启?怎么解决自动重启问题
  11. 芯片前端设计面经笔经总结
  12. 风影ASP.NET基础教学 6用户控件
  13. 如何放大图片不模糊?教你一招
  14. Xtensa处理器架构基础-架构简介与常见寄存器
  15. cad转dxf格式文件太大,将CAD图纸文件进行转换成低版本DXF格式如何进行?
  16. 阿里云服务器好吗?阿里云服务器ECS有什么优势
  17. Unity 引擎报错集锦
  18. Home Assistant初学者指南 -1之 Home Assistant安装
  19. duplicate symbol in....
  20. Meta-Classifier in Membership Inference

热门文章

  1. 科技热点周刊|马斯克卖掉特斯拉 10% 股票;Facebook 停用面部识别系统;微软拥抱 Metaverse;雅虎退出中国
  2. Netty 如何做到单机百万并发?
  3. python代码使用dns进行调试_python脚本实现分析dns日志并对受访域名排行
  4. 在华为外包的工作体验
  5. 转:罗永浩写给俞敏洪的求职信
  6. php 页面字体大小,网页中各种设置字体大小的方法总结
  7. 百度市值要被京东超越了?你投百度还是京东?
  8. 素数and约数and反素数
  9. 关于动态创建option 【copy from 姬光】
  10. 在局域网内互传文件的方法