Android 动态加载框架的研究(一)

原创 2015年07月08日 16:08:38



前言

       最近研究了一下安卓的插件化开发框架,查阅了几篇大牛的Blog:

                             http://blog.csdn.net/singwhatiwanna/article/details/22597587

膜拜的同时也引发了一些疑问,特在此提出拙见,有不对的地方还请指正。这篇博主给出的插件化开发解决方案是在主应用里使用反射调用本地apk中的activity,使用这种方式调用的activity对象为什么没有activity的特性呢?带着这个问题,我研究了一下activity创建和启动的过程。

       android应用程序运行的本质其实是运行dex文件,所以我们能够通过ClassLoader获取apk包里的dex文件,利用反射机制实例化其中的对象。但是通过这种方式调用的activity对象为什么没有activity的特性,这是为什么呢?


Android应用程序的安装过程

       首先我们看看一个android应用程序是怎么被安装到手机上的:这篇博客已经做了详细介绍:

http://blog.csdn.net/luoshengyang/article/details/6766010

       简单来说,对于第三方应用的安装,首先系统会将apk复制到data/app这个目录下,并且扫描,解压,将解压出来的dex文件放置在data/dalvik-cache这个目录下,并在data/data目录下创建应用的数据目录。解析AndroidManifest.xml文件,提取出所需信息,包括具有intent-filter的四大组件信息(Activity、Service、BroadcastReceiver、ContentProvider)和声明的系统权限等。


Activity的创建和启动

        再来看看应用程序的启动:关于Launcher是如何启动应用程序的这里不做介绍,我们只关心activity的创建,初始化和启动过程。

        参考文献:http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html

                    http://blog.csdn.net/qinjuning/article/details/7310620

        实际上,activity和context有着密不可分的关系,context是一个抽象类,它描述的是一个应用程序环境的信息,即上下文,通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作Context代表了用户和系统的交互过程。侠义理解,获得Context就获得了和系统进行交互的可能性。contextImp是context的实现类,activity既继承了context,并且activity中包含一个指向contextImp的属性。

        理解了这些以后,我们再看activity启动的关键代码:android.app.ActivityThread.performLaunchActivity()

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

    ...
    Activity activity = null;
    try {
        java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
        activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);
        StrictMode.incrementExpectedActivityCount(activity.getClass());
        r.intent.setExtrasClassLoader(cl);
        if (r.state != null) {
            r.state.setClassLoader(cl);
        }
    } catch (Exception e) {
        if (!mInstrumentation.onException(activity, e)) {
            throw new RuntimeException(
                "Unable to instantiate activity " + component
                + ": " + e.toString(), e);
        }
    }

    try {
        ...
        if (activity != null) {
            ...

            activity.attach(appContext, this, getInstrumentation(), r.token,
                    r.ident, app, r.intent, r.activityInfo, title, r.parent,
                    r.embeddedID, r.lastNonConfigurationInstances, config);
            ...
            activity.mCalled = false;
            mInstrumentation.callActivityOnCreate(activity, r.state);
            ...
        }
        ...
    }
    ...
}

            实际上activity的初始化,也是通过反射机制构建一个activity对象,看似与我们上面的方法没有什么区别,但是,Activity在创建的时候会new一个ContextImpl对象并在attach方法中关联它,需要注意的是,创建Activity使用的数据结构是ActivityClientRecord,我们在应用层通过反射去启动activity是很难完成系统所做的初始化工作的,所以activity的大部分特性都无法使用。





相关文章推荐

Android apk动态加载机制的研究demo

  • 2016年01月04日 16:06
  • 1.24MB
  • 下载

Android apk动态加载机制的研究

转自: http://blog.csdn.net/singwhatiwanna/article/details/22597587  先感谢大神! 背景 问题是这样的:我们知道...

Android中apk动态加载技术研究(1)基础知识研修

java classloader 和android中DexClassloader对比: Java ClassLoader : 作用: 主要用来加载class 到jvm中,以供程序使用,也就是...

Android apk动态加载机制的研究(二)

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言...
  • zcxwww
  • zcxwww
  • 2016年05月02日 18:39
  • 362

Android apk动态加载机制的研究

问题是这样的:我们知道,apk必须安装才能运行,如果不安装要是也能运行该多好啊,事实上,这不是完全不可能的,尽管它比较难实现。在理论层面上,我们可以通过一个宿主程序来运行一些未安装的apk,当然,实践...

Android之Android apk动态加载机制的研究

背景 问题是这样的:我们知道,apk必须安装才能运行,如果不安装要是也能运行该多好啊,事实上,这不是完全不可能的,尽管它比较难实现。在理论层面上,我们可以通过一个宿主程序来运行一些未安装的apk...

Android中apk动态加载技术研究(2)android插件化及实现

了解了android中类加载的前期知识点后,来看看android中DexClassLoader具体的实现     具体加载流程如下:     宿主程序会到文件系统比如SD卡中去加载APK【1】,然后通...

Android 使用动态加载框架DL进行插件化开发

如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456    (来自时之沙的csdn博客) 概述:          随着应用的不断迭代,...
  • xu_song
  • xu_song
  • 2014年10月24日 09:02
  • 597

[造轮子]Android动态加载框架总结

用了一周多,做了一个Android动态加载的小玩具DCommand。支持下载APK,获取其中的资源、执行代码、启动Activity(这个是抄的,非常粗糙)。 最开始只是觉得动态加载逻辑代码很有用,如...

Android动态加载框架DL的架构与基本原理解析

动态加载框架DL的基本结构、原理解析
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 动态加载框架的研究(一)
举报原因:
原因补充:

(最多只允许输入30个字)