在Android中动态载入自定义类

普通的Android程序Dalvik虚拟机都是从一个默认的地方载入程序需要的类文件(dex文件),而Dalvik虚拟机还提供了从其他地方载入类的能力(比如从设备的内部存储空间以及互联网).

这种自定义类加载机制可以使用于一些场景:

  • dex文件只能包含最多64K的函数引用,对于大型的程序如果超过了该数字,就可以通过把程序打包为多个dex文件来实现,在程序运行的时候在加载这些需要的类
  • 一些开发框架可以通过运行时自定义类加载机制来设计出更加可扩展的框架
  • 通过该方式实现更加强壮的程序注册机制,防止被人破解

Android有个示例项目演示了如何使用, 项目地址

http://code.google.com/p/android-custom-class-loading-sample/

要使用该示例,不能使用Eclipse插件ADT来打包必需通过该项目提供的Ant脚本, 另外该Ant脚本需要Android SDK 12版本, 可以通过Android SDK Manager来下载或者到如下地址下载,然后解压到对应的目录中

https://dl-ssl.google.com/android/repository/tools_r12-windows.zip

https://dl-ssl.google.com/android/repository/platform-tools_r06-windows.zip

在示例中有3个类文件:

  • com.example.dex.MainActivity: UI界面,在这个类中动态载入需要的类
  • com.example.dex.LibraryInterface: 动态载入类的接口定义
  • com.example.dex.lib.LibraryProvider: 动态载入类的实现,该类在打包的时候会打包到另外一个dex文件中

在打包的时候需要修改项目目录下的local.properties文件,把sdk.dir的值修改为对应的android SDK目录.例如:sdk.dir=E:\\google\\android-sdk-windows

另外不要忘记在default.properties中指定需要的android平台: 例如 target=android-9

然后就可以执行android install来build并且安装到模拟器或者手机上了.

载入自定义类的过程

  1. 获取需要载入的自定义类的dex文件,可以是设备本地的文件或者互联网上的文件
  2. 把获取到的自定义类dex文件保存到程序的内部储存空间中:new File(getDir(“dex”, Context.MODE_PRIVATE),SECONDARY_DEX_NAME);
  3. 通过DexClassLoader类加载器来解析优化前面的dex文件
  4. 通过DexClassLoader的loadClass函数来载入类
  5. 通过获得到的类的newInstance函数来生成需要的对象
  6. 开始使用获取到的动态类对象~\(≧▽≦)/~啦啦啦

Android提供的示例项目中,通过Ant打包后把com.example.dex.lib.LibraryProvider类放入了程序的assets文件夹中,然后从这里读取需要动态载入的类. 为了演示从互联网载入类和使用Eclipse ADT插件来build该示例,我们对该项目做了简单修改,修改后的示例项目地址:

http://code.google.com/p/goodev-demo 中 的android-custom-class-loading-goodev-demo

在该示例中删除了com.example.dex.lib.LibraryProvider类,我们把该类打包为dex文件并且放入到了互联网上下载地址: http://goodev.sinaapp.com/and/secondary_dex.jar

在程序运行的时候先从该地址下载需要的类文件,然后解析.

详细情况请参考项目中的代码注释

修改后的项目可以通过Eclipse ADT来build.

本文出自 云在千峰,转载时请注明出处及相应链接。

本文永久链接: http://blog.chengyunfeng.com/?p=87



Read more: http://blog.chengyunfeng.com/?p=87#ixzz352CyqeCn
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值