java获取apk启动activity_兼容 Android 10 启动 APK 实现方案

本文探讨了如何在Android 10及以上版本通过反射启动APK程序,由于Android 10中IActivityMessage的变化,需使用ActivityManagerServer的shellCommand方法。文章详细介绍了技术方案,包括获取ActivityManagerNative、IActivityManager对象,反射调用shellCommand等步骤,并展示了在Android 10设备上的运行效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

我们想启动 APK 程序,有很多种方法,可以使用 Intent,也可以使用 adb shell 命令来启动,还有通过反射来启动 APk 程序。

我们这里主要讨论通过反射的方式来启动 apk 程序。Android10 之前,我们通过反射来启动 APK,反射的是 startActivityAndWait(…) 方法,该方法是在 IActivityMessage.java 实现的,通过来启动 APk 程序。

在 Android10 的时候,该方案不太适用,需要反射 shellCommand(…) 来启动 Android 系统 10 的 APK 程序。

本方案是基于 AM 启动 Activity 的方式来实现的。

核心技术方案和原理图

Android 10 为了增加安全性 IActivityMessage.java 类去掉了,变为 IActivityMessage.aidl 文件,其中 startActivityAndWait(…) 方法转移到了 ActivityManagerServer.java 服务类中。所以,我们不能使用 IActivityMessage.java 去执行 startActivityAndWait(…) 方法。

Android 10 AM.java 启动源码:

ce949409afee63996584f2a880d99421.png

Android 10 原先 AM.java 功能逻辑转移到 ActivityManagerShellCommand.java 源码如下:

a167d4a39cb2a8a543645e8d2a1bdebe.png

我们要反射 mAm.asBinder().shellCommand 来启动 APK。方案实现时序图如下:

9d20bfe59674f45a681393bce20a11e8.png

技术优势

兼容了 Android10 通过反射启动 APK 。

技术实现

1.首先获取 ActivityManagerNative 类对象。

7cabb961ed8aad60a1ddc5a4cae08848.png

2.获取 IActivityManager 对象。

84fc141922d867bd150303126453328e.png

3.获取当前的手机系统版本。

afe9c1aad17f2503474fd27f924fbe6b.png

4.调用 IActivityManager 中的 asBinder 方法,可以通过该方法获取 BinderProxy 对象。

f7af1bee00e690517af0f68f2fadf658.png

5.反射获取 ShellCallback 类对象和 ResultReceiver 类对象。

049704a3f09a30e36bded3a553eea3cd.png

6.获取 shellCommand 方法。

75149052e7b261d3b25b4458cecd56d6.png

7.调用 shellCommand 方法。

74a4432309e1112244751d510303ce86.png

整体实现代码

362b25851bf73ef691b8996e8f81aeca.png

效果展示

16b95128825a970dd1b51e571ad1cd92.png

Android 10 手机

315668a833c39a7573aceafb5b81b9b0.png

&nbsp 运行成功 cmd 界面截图

21e12d4c5ff89b3e2bbf2f4e673dc98a.png

&nbsp 启动成功后的 APK 界面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值