我们都知道,在Android手机中,应用程序需要通过下载apk文件然后安装才能正常运行,如果说可以不用安装直接运行,那就很方便了。这种想法是可以实现的,我们可以在一个应用中去动态加载一个APK文件中的功能逻辑,这并不是在任何情况下都可以的,这对APK是有一定的要求的,也就是这种APK不仅可以通过手动安装来运行,也要能够被其它的应用进行动态加载来运行。当然这里的运行并不是它自身的运行,而是依托于一个现有的,可以正常运行的应用程序。这个应用程序相当于是一个代理,它除了有自身的功能逻辑外,还要能够加载其它APK中的功能逻辑。讲了这么多不知道大家有没有看明白呢,总结一下,实现这种情况有两点要求
- 一个正常运行的应用程序,它除了有自身的功能外还要能够动态加载其它APK文件中的方法。
- 一个APK文件,它不仅要能够正常的安装运行,还要能被第一条对应的应用程序加载,执行APK文件中的方法逻辑。
下面我们就这两点来具体实现下,这也就是Android中的动态加载机制
一、创建宿主程序
首先我们需要创建一个应用,在这里称它为宿主程序,这个应用功能很简单,只有两个界面,我们分别用MainActivity和ProxyActivity来表示。这里主要关注的是这个ProxyActivity,这个页面相当于是一个‘壳’,它提供一个Activity完整的声明周期以及交互逻辑,这个代理Activity只负责提供一个平台,其中的具体实现都是由另一个APK文件中的具体类来实现的。主要是通过类加载ClassLoader的方式去加载APK文件中的具体Class,然后再通过反射的方式调用Class中的方法并执行,这样APK中的Activity就被调起来了。这就是大致的实现方案,下面我们看下具体的实现
private void launchTargetActivity(final String className){
File dexDir = getDir("dex", 0);
final String dexOutputPath = dexDir.getAbsolutePath();
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
DexClassLoader dexClassLoader = new DexClassLoader(dexPath, dexOutputPath, null, classLoader);