Android 快速发布
&持续集成
Agenda
• 目标
• 实现方式
• 代码讲解
• 经验&感想
目标

• 刚发布,用户的需求又变了……怎么办?
• 项目组采用敏捷开发,需要快速迭代,持续集成……怎么办?
• App的不同功能由不用的小组负责开发,整合经常出问题……
  怎么办?




            肿么办?
实现方式

• PhoneGap(android)
  一个用基于HTML,CSS和JavaScript的,创建跨平台移动应用的快速
  开发平台
  • 原生+HTML结合
  • 重网页+轻原生app

  • 性能差
  • Webview释放不及时,会引起crash

  参考资料:
  http://www.aliued.cn/2012/04/11/%E5%88%9D%E8%AF%86pho
  negap.html
实现方式(原生)

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


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

• Java反射
  利用Java反射机制替换全局ClassLoader到我们自定义的
  dalvik.system.DexClassLoader,从而在程序运行过程中改变
  Activity的具体实现

• Activity上下文
  每一个Activity的上下文都包含了自身的ClassLoader和资源管
  理,通过重载以下四个函数就可以替换Activity所载入的资源
  和代码的路径指向:
  • ClassLoader getClassLoader()
  • AssetManager getAssets()
  • Resources getResources()
  • Theme getTheme()
代码讲解
注意点

• 在Hotfix中开发的Activity必须和主程序AndroidManifest.xml
  中指定的类名相同
• 无法动态的增加Activity
• 无法保证在Google升级Android系统后该方法仍然有效
经验和感想
参考资料
• https://github.com/mmin18/AndroidDynamicLoader
• https://github.com/probablycorey/wax(iOS)
•  http://www.aliued.cn/2012/04/11/%E5%88%9D%E8%AF%86pho
negap.html

Android快速发布&持续集成

Editor's Notes

  • #7 一个Android应用在启动时,首先Dalvik加载的是Android自身的框架。之后会加载APK包中的classes.dex文件到全局的ClassLoader。最后根据AndroidManifest.xml中指定的类名,创建对应的Activity实例来展示UI。
  • #11 Android框架本身就是一个插件系统,FragmentLoader项目利用了这一特性,采用极少的代码就实现了较完善的动态加载特性,几乎所有的业务逻辑代码和界面所需的资源文件都可以实现动态加载。