背景
我们想启动 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 启动源码:
Android 10 原先 AM.java 功能逻辑转移到 ActivityManagerShellCommand.java 源码如下: