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常用自动化测试框架有哪几种?

1、Monkey是Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出。实际上该工...
  • wuxiaobingandbob
  • wuxiaobingandbob
  • 2016年11月28日 08:30
  • 1273

APK动态加载框架(DL)解析

好久没有发布新的文章,这次打算发表一下我这几个月的一个核心研究成果:APK动态加载框架(DL)。这段时间我致力于github的开源贡献,开源了2个比较有用且有意义的项目,一个是PinnedHeader...
  • singwhatiwanna
  • singwhatiwanna
  • 2014年10月10日 00:20
  • 70582

Android App的插件化和动态加载框

携程Android App的插件化和动态加载框架已上线半年多,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验。本文将详细介绍Android平台插件式开发和动态加载技术的原理和...
  • hudashi
  • hudashi
  • 2016年03月21日 15:12
  • 5144

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

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

Android apk动态加载机制的研究

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

Android apk动态加载机制的研究

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/22597587 (来自singwhatiwanna的csdn博客) 背景 ...
  • chuyouyinghe
  • chuyouyinghe
  • 2015年08月17日 17:19
  • 213

Android apk动态加载机制的研究

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/22597587 (来自singwhatiwanna的csdn博客) 背景 问...
  • u012532559
  • u012532559
  • 2016年05月26日 16:52
  • 209

Android APK 动态加载研究(1)

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/22597587 (来自singwhatiwanna的csdn博客) 感谢原文...
  • langmb
  • langmb
  • 2016年11月03日 14:16
  • 84

Android apk动态加载机制的研究【转】

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/22597587 (来自singwhatiwanna的csdn博客) 背景 问...
  • LANG791534167
  • LANG791534167
  • 2016年03月06日 12:23
  • 503

Android apk动态加载机制的研究

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/22597587 (来自singwhatiwanna的csdn博客) 背景 ...
  • omnispace
  • omnispace
  • 2016年03月14日 01:51
  • 227
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 动态加载框架的研究(一)
举报原因:
原因补充:

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