1.Android Activity Deeplink启动来源获取源码分析
2.Android 中的 Activity Launch Mode 详解
Android Activity Deeplink启动来源获取源码分析
Deeplink在业务模块中作为外部应用的入口提供,不同跳转类型可能会导致应用提供不一致的服务,通常通过反射调用Activity中的mReferrer字段获取跳转来源的包名。然而,mReferrer存在被伪造的风险,可能导致业务逻辑出错或经济损失。ERP表单源码因此,我们需要深入分析mReferrer的来源,并寻找更为安全的获取方法。
为了深入了解mReferrer的来源,我们首先使用搜索功能在Activity类中查找mReferrer,发现其在Attach方法中进行赋值。进一步通过断点调试跟踪调用栈,发现Attach方法是由ActivityThread.performLaunchActivity调用的。而performLaunchActivity在调用Attach时,传入的referrer参数实际上是一个ActivityClientRecord对象的referrer属性。深入分析后,发现referrer是在ActivityClientRecord的构造函数中被赋值的。通过进一步的调试发现,ActivityClientRecord的实例化来自于LaunchActivityItem的mReferrer属性。接着,源码资本赛道我们分析了mReferrer的来源,发现它最终是由ActivityStarter的setCallingPackage方法注入的。而这个setCallingPackage方法的调用者是ActivityTaskManagerService的startActivity方法,进一步追踪调用链路,我们发现其源头是在App进程中的ActivityTaskManager.getService()方法调用。
在分析了远程服务Binder调用的过程后,我们发现获取IActivityTaskManager.Stub的方法是ActivityTaskManager.getService()。这使得我们能够追踪到startActivity方法的调用,进而找到发起Deeplink的应用调用的具体位置。通过这个过程,源码新增功能我们确定了mReferrer实际上是通过Activity的getBasePackageName()方法获取的。
为了防止包名被伪造,我们注意到ActivityRecord中还包含PID和Uid。通过使用Uid结合包管理器的方法来获取对应的包名,可以避免包名被伪造。通过验证Uid的来源,我们发现Uid实际上是通过Binder.getCallingUid方法获取的,且Binder进程是无法被应用层干涉的,因此Uid是相对安全的。接下来,阅读框架源码我们可以通过Uid来置换包名,进一步提高安全性。
总结,mReferrer容易被伪造,应谨慎使用。通过使用Uid来获取包名,可以提供一种更为安全的获取方式。此过程涉及对源代码的深入分析和调试,作者Chen Long为vivo互联网客户端团队成员。
Android 中的freertos项目源码 Activity Launch Mode 详解
Android中的Activity启动模式详解
本文将从不同角度解析Android中Activity的几种重要启动模式:Standard、SingleTop、SingleTask、SingleInstance,并通过示例展示在不同场景下,每种模式的行为。
理解Activity栈是一个关键,它遵循先进后出原则。在每一步操作后关注栈内容的变化,有助于更好地理解不同启动模式下的行为。
本文提供了一个简单的Demo,代码已放置在GitHub上,网址为/Gracker/AndroidLaunchModeTest,供读者自行测试不同模式下的结果。只需修改StandardActivity中的跳转Activity即可。
**Standard**模式是最基本的,每次启动都会创建一个新的Activity。
**SingleTop**模式下,如果当前Activity已经在栈顶,将调用onNewIntent方法;否则会重新创建Activity。
**SingleTask**模式的使用则涉及栈内复用。在Manifest中设置android:taskAffinity="”,启动SingleTask会启动一个新的Task。
**SingleInstance**模式为单实例模式,启动时,无论从哪里启动都会创建一个唯一的任务栈,后续创建都不会再创建新的实例,除非实例被销毁。
**TaskAffinity**是Activity与任务的亲和关系概念,具有相同亲和关系的Activity归属同一Task(对用户而言,属于同一Application)。亲和关系由根Activity的亲和关系决定。
**ActivityRecord、TaskRecord、ActivityStack**之间关系:在无分屏功能与虚拟屏的情况下,ActivityStackSupervisor与ActivityDisplay为系统唯一。示例dump显示当前手机的ActivityRecord、TaskRecord与ActivityStack。
**Activity类型**:介绍Activity的不同类型,如没有分屏功能与虚拟屏情况下的基本关系。
**总结**:通过上述内容,对不同启动模式有了深入理解,每个模式在不同场景下展现出独特的行为特性。
**分享**:如果觉得文章有帮助,请分享到社交网站,希望对读者有所帮助。
**版权声明**:本文遵循知识共享署名-非商业性使用4.0国际许可协议。