Android开发之动态加载,运行未安装apk

Android运行未安装apk可以使用Android的DexClassLoader类
这个也可以再Android的官方文档中看到

A class loader that loads classes from .jar and .apk files containing a classes.dex entry. This can be used to execute code not installed as part of an application.

This class loader requires an application-private, writable directory to cache optimized classes. Use Context.getDir(String, int) to create such a directory:

   File dexOutputDir = context.getDir("dex", 0);

Do not cache optimized classes on external storage. External storage does not provide access controls necessary to protect your application from code injection attacks.

上面说了,可以加载jar文件和apk文件
还有一句加粗的话,不要把dex文件的目录设置到外部存储设备上,否则可能会引起注入攻击,这个问题困扰了我很久,后来看到官方文档,终于有了答案,所以有了疑问第一时间看官方文档才是最靠谱的
不过最近斯巴达开的,google好难打开。。。你妹的
现在知道了怎么加载apk文件,下来说关键的地方
dex文件其实就是一堆的class文件,怎么调用呢?
反射呗
通过动态加载可以加载任何的java类,包括Activity,但是加载出来的Activity是没有生命周期的,我们可以通过在宿主的APP中,通过反射那七个on什么方法,来模拟出一个生命周期,通过反射吧宿主的activity和Resources传到要启动的Activity中,这样就可以在里面正常使用了
补充:
加载所有的class文件:
生成dexClassLoader后,如果想要加入其它的class,必须知道class类名。
可以通过
DexFile.loadDex(sourcePathName, outputPathName, flags)
这个方法获取到这个dex文件中的所有类名称。
加载进去即可

你可能感兴趣的:(Android开发)