Android 12 行为变更,对应用产生的影响 - 知乎专栏

文章推薦指數: 80 %
投票人數:10人

在Android 12 中包含 的 activity 、 service 或 receiver 必须为这些应用组件显示声明 android:exported 属性,如下所示:. 无障碍写文章登录/注册众所周知在春节过后Google发布了「Android12首个开发者预览版」,3月份的时候发布了「开发者预览版2」,在Android12中让人眼前一亮的是系统界面做了很大改动,根据Google今年的发版计划,预计在今年9月份正式版将会发出来。

在Android12中包含了很多的功能和一些行为的变更,接下来我们一起来分析这些行为的变更对我们的应用产生了那些影响以及Google为什么需要这么做。

通过这篇文章你将学习到以下内容:为什么Google需要开发者显示声明android:exported属性?为什么Google需要开发者显示指定PendingIntent的可变性?Google为什么限制adb备份的默认行为?如何检查App的安全漏洞?PS:文章中分析Google为什么需要做此行为的变更,纯属个人根据一些案例来分析,如果你遇到过其他安全性问题欢迎留言一起讨论。

android:exported属性在Android12中包含的activity、service或receiver必须为这些应用组件显示声明android:exported属性,如下所示: ...... 如果在包含的activity、service或receiver组件中,没有显示声明android:exported的值,你的应用将无法安装,错误日志如下所示。

Installationdidnotsucceed. Theapplicationcouldnotbeinstalled:INSTALL_FAILED_VERIFICATION_FAILURE Listofapks: [0]'.../build/outputs/apk/debug/app-debug.apk' Installationfaileddueto:'null' 如果您的应用在需要声明android:exported的值时未进行此声明,错误日志如下所示。

TargetingS+(version10000andabove)requiresthatanexplicitvaluefor\ android:exportedbedefinedwhenintentfiltersarepresent 如果对上面的异常产生的条件,不是很理解,可以点击下方链接查看,目前已经有很多开源项目都已经开始适配这个行为的变更了,例如leakcanary等等,详情前往查看下列地址:UpdatelauncheractivityattributetoAndroid12Declaredandroid:exportedexplicitlyforcomponentswithintent-filter.Android12requirement这个行为的变更无论是对库开发者和还是应用开发者、或者是开源项目影响都非常大。

为什么Google需要开发者显示声明android:exported属性android:exported属性的默认值取决于是否包含,如果包含那么默认值为true,否则false。

当android:exported="true"时,如果不做任何处理,可以接受来自其他App的访问当android:exported="false"时,限制为只接受来自同一个App或一个具有相同userID的App的访问正因为android:exported的属性的默认值的问题,TwiccaApp发生过一次安全性问题,因为另一个没有访问SD卡或网络权限的App,可以通过TwiccaApp将存储在SD卡上的图片或电影上传到Twicca用户的Twitter账户上的社交网络上。

产生问题的代码如下所示:
因为添加了intent-filter所以android:exported的属性的默认值为true,因此可以接受来自其他App的访问,进而造成了上述问题(通过TwiccaApp将存储在SD卡上的图片或电影上传到Twicca用户的Twitter账户上的社交网络上),而解决方案有两个:方案一:添加android:exported="false"属性 方案二:TwiccaApp没有使用方式一,而是检查调用者的包名是否与自身的包名相同publicvoidonCreate(Bundlearg5){ super.onCreate(arg5); ... ComponentNamev0=this.getCallingActivity(); if(v0==null){ this.finish(); }elseif(!jp.r246.twicca.equals(v0.getPackageName())){ this.finish(); }else{ this.a=this.getIntent().getData(); if(this.a==null){ this.finish(); } ... } } } 这种方案也是可行的,因为在一台设备上,不可能会出现两个包名相同的应用,更多详细的信息可以前往查看Restrictaccesstosensitiveactivities。

这仅仅是关于activity的安全漏洞的其中一个,在不同的场景下利用这些漏洞做的事情也可能不一样。

当然还有service和receiver组件也都是一样,存在安全性问题。

指定PendingIntent的可变性在Android12中创建PendingIntent的时候,需要显示的声明是否可变,请分别使用PendingIntent.FLAG_MUTABLE或PendingIntent.FLAG_IMMUTABLE标志,如果您的应用试图在不设置任何可变标志的情况下创建PendingIntent对象,系统会抛出IllegalArgumentException异常,错误日志如下所示:PACKAGE_NAME:TargetingS+(version10000andabove)requiresthatoneof\ FLAG_IMMUTABLEorFLAG_MUTABLEbespecifiedwhencreatingaPendingIntent. StronglyconsiderusingFLAG_IMMUTABLE,onlyuseFLAG_MUTABLEif\ somefunctionalitydependsonthePendingIntentbeingmutable,e.g.if\ itneedstobeusedwithinlinerepliesorbubbles. 为什么Google需要开发者显示的指定PendingIntent的可变性?在Adnroid12之前,默认创建一个PendingIntent它是可变的,因此其他恶意应用程序可能会拦截,重定向或修改此Intent。

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

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

更多关于PendingIntent安全性介绍,可以前往查看AlwayspassexplicitintentstoaPendingIntentadb备份限制Android开发者都应该知道这个命令adbbackup,它可以备份应用的数据,在Android12中,为了保护私有应用数据,用户运行adbbackup命令时,从设备导出的任何其他系统数据都不包含应用数据。

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

注意:在发布应用前将android:debuggable设置为false为什么Google在Android12限制了adbbackup命令的默认行为因为这个存在严重的安全问题,当初Google为了提供App数据备份和恢复功能,可以在AndroidManifest中添加android:allowBackup属性,默认值为true,当你创建一个应用的时候,会默认添加这个属性,如下所示: 当android:allowBackup="true"时,用户可以通过adbbackup和adbrestore命令对应用数据进行备份和恢复,也就是说可以在其他的Android手机上安装同一个应用,通过如上命令恢复用户的数据。

为了安全起见,我们在发布出去的Apk中一定要将android:allowBackup属性设置为false来关闭应用程序的备份和恢复功能,以免造成信息泄露。

国民级应用XX信,在曾今发出的版本中allowBackup的属性值是true,被其他逆向开发者利用之后,现在的版本中这个值已经修改为false了,有兴趣的小伙们可以反编译看看。

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

这个开源项目的检查结果,作为参考即可。

当然也有很多公司花了重金去购买第三方的服务来检查App的安全漏洞。

在Android12上这几个行为的变更它们都有一个共性:安全性,可见Google这几年在安全上做了很多的努力,当然还有其他的一些行为的变更,可以前往查看行为变更:以Android12为目标平台的应用开发中App安全的注意事项从Google在Android12上的安全行为变更来看,Google应该收到了很多安全漏洞的案例,是通过这几个基本组件来进行的,要不然也不会做此重要的改变(纯属个人看法)。

在很早之前,看到过一篇文章谈谈Android下App的安全性问题,这篇文章包含:activity、service、Broadcast、webview、ContentProvider开发中的一些注意事项和安全编码建议,以及一些测试方法,找了很久才找到,有兴趣的小伙们可以前往查看,这里就不详细列出来了,原文有更加详细的介绍。

参考文章行为变更:以Android12为目标平台的应用UpdatelauncheractivityattributetoAndroid12Declaredandroid:exportedexplicitlyforcomponentswithintent-filter.Android12requirementconfluence结语这篇文章主要介绍了在Android12上行为的变更,对App都有些影响,以及这些行为在App中都有那些安全漏洞,我们在开发中应该如何注意这些潜在的问题。

全文到这里就结束了,如果有帮助点个赞就是对我最大的鼓励代码不止,文章不停持续分享最新的技术最后推荐我一直在更新维护的项目和网站:全新系列视频:现代Android开发(MAD)技巧系列教程:计划建立一个最全、最新的AndroidXJetpack相关组件的实战项目以及相关组件原理分析文章,正在逐渐增加Jetpack新成员,仓库持续更新,欢迎前去查看:LeetCode/剑指offer/国内外大厂面试题/多线程题解,语言Java和kotlin,包含多种解法、解题思路、时间复杂度、空间复杂度分析剑指offer及国内外大厂面试题解:在线阅读LeetCode系列题解:在线阅读最新Android10源码分析系列文章,了解系统源码,不仅有助于分析问题,在面试过程中,对我们也是非常有帮助的,仓库持续更新,欢迎前去查看整理和翻译一系列精选国外的技术文章,每篇文章都会有译者思考部分,对原文的更加深入的解读,仓库持续更新,欢迎前去查看「为互联网人而设计,国内国外名站导航」涵括新闻、体育、生活、娱乐、设计、产品、运营、前端开发、Android开发等等网址,欢迎前去查看历史文章为数不多的人知道的Kotlin技巧以及原理解析(一)为数不多的人知道的Kotlin技巧以及原理解析(二)Jetpack最新成员AndroidXAppStartup实践以及原理分析Jetpack成员Paging3实践以及源码分析(一)Jetpack成员Paging3网络实践及原理分析(二)Jetpack成员Paging3获取网络分页数据并更新到数据库中(三)Jetpack成员Hilt实践(一)启程过坑记Jetpack成员Hilt结合AppStartup(二)进阶篇)进阶篇Jetpack新成员Hilt与Dagger大不同(三)落地篇全方面分析Hilt和Koin性能神奇宝贝(PokemonGo)眼前一亮的Jetpack+MVVM极简实战KotlinSealed是什么?为什么Google都用KotlinStateFlow搜索功能的实践DB+NetWork再见吧buildSrc,拥抱Composingbuilds提升Android编译速度[Google]再见SharedPreferences拥抱JetpackDataStoreKotlin插件的落幕,ViewBinding的崛起竟然如此简单,DataBinding和ViewBinding图解多平台AndroidStudio技巧(三)发布于2021-04-1410:41AndroidAndroid开发Android手机​赞同3​​添加评论​分享​喜欢​收藏​申请转载​



請為這篇文章評分?