如何创建更加灵活的App

转载:https://github.com/mmin18/Create-a-More-Flexible-App

作者:屠毅敏

移动应用的部署方式,即发布->下载->安装->运行,决定了他不具备Web的高灵活性。这是多数互联网公司在移动应用开发的过程中所遇到的一个限制。如何打破这一瓶颈,让程序更灵活,让开发更敏捷,让迭代更迅速,是提高开发流程整体效率的一条捷径。

HTML5的发展给开发人员提供了一种可能,PhoneGap就是目前比较成熟的结合原生与HTML的一种方案。其带来的优势不仅仅在于跨平台,同时可以将业务逻辑部署在服务器上,不需要进行客户端的升级即可灵活的进行调整。

但是就目前看,HTML5要全面达到原生应用的用户体验还有很长的路要走。并且与原生结合的开发方式虽能够取长补短,但同时也会对程序的复杂度、可维护性及开发人员的技能产生更高的要求。

本文分别介绍了Android和iOS上的两种基于原生应用开发的灵活性解决方案,可以在不改变开发人员技能要求和已有的开发方式的前提下,给于应用在发布后改变程序行为的能力。相关的代码及示例已共享为开源项目:http://github.com/mmin18

Android

所有的Android应用都被封装在APK包中,一个APK包一般由三部分组成:

  • AndroidManifest.xml描述了APK包的固有属性,是不可变部分。
  • classes.dex包含了Java类(.class)被编译打包成了Dalvik虚拟机的中间代码。
  • res/文件夹下的包含了所有可访问的资源文件。

一个Android应用在启动时,首先Dalvik加载的是Android自身的框架。之后会加载APK包中的classes.dex文件到全局的ClassLoader。最后根据AndroidManifest.xml中指定的类名,创建对应的Activity实例来展示UI。

Android通过dalvik.system.DexClassLoader提供了动态加载Java代码的能力,如果我们能够在Activity启动之前,替换全局的ClassLoader(Application.mBase.mPackageInfo.mClassLoader),那么我们就可以改变载入的Activity类对应的实现。

ActivityLoader

ActivityLoader和ActivityDeveloper项目(https://github.com/mmin18/AndroidDynamicLoader)展示了利用Java反射机制替换全局ClassLoader到我们自定义的dalvik.system.DexClassLoader,从而在程序运行过程中改变Activity的具体实现。

ActivityDeveloper为开发环境,开发完成后,将生成的APK文件(不需要签名)放入ActivityLoader的资源文件中,并重新启动ActivityLoader来装载新的代码,就可以使得ActivityDeveloper中的代码在ActivityLoader中运行。

ActivityLoader

但是这种方式也有局限性,首先在ActivityDeveloper中开发的Activity必须和ActivityLoader.AndroidManifest.xml中指定的类名相同,并且由于AndroidManifest.xml是APK包的固有属性,无法在运行时改变,所以无法动态的增加Activity。另外我们修改的变量并不在Android的文档中提及,所以无法保证在Google升级Android系统后该方法已然有效。

FragmentLoader

每一个Activity的上下文都包含了自身的ClassLoader和资源管理,通过重载以下四个函数就可以替换Activity所载入的资源和代码的路径指向:

  • ClassLoader getClassLoader()
  • AssetManager getAssets()
  • Resources getResources()
  • Theme getTheme()

在Android 3.0引入Fragment后,我们可以在一个应用程序中只实现一个Activity作为入口和运行的容器,在启动的Intent参数中指定Activity需要动态加载的Fragment类名、classes.dex文件和资源文件路径,并在启动完成后把所有的界面响应、生命周期管理和状态可持久化等均交由Fragment处理。(Google在Android 3.0后引入了Fragment,Fragment既有Activity的生命周期管理和状态可持久化,又可以像View那样自由的组合。)

FragmentLoader和FragmentDeveloper项目(https://github.com/mmin18/AndroidDynamicLoader)实现了利用Fragment来负责UI和所有的代码逻辑,Activity作为唯一的启动入口,负责从APK加载Fragment及相关的资源。其项目开发在FragmentDeveloper中进行,FragmentLoader类似模拟器,从外部加载APK并运行。

FragmentLoader

利用这一开发方式,我们可以在应用部署后完全通过动态加载的方式来更新客户端运行的代码和资源文件。该方式的限制主要是无法在运行时变更AndroidManifest.xml的定义,如程序的权限,版本等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值