登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

查看: 71448|回复: 0

在Android中动态载入自定义类

[复制链接]

476

主题

478

帖子

2275

安币

Android大神

Rank: 6Rank: 6

发表于 2011-12-7 19:28:24 | 显示全部楼层 |阅读模式
普通的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并且安装到模拟器或者手机上了.
载入自定义类的过程
  • 获取需要载入的自定义类的dex文件,可以是设备本地的文件或者互联网上的文件
  • 把获取到的自定义类dex文件保存到程序的内部储存空间中:new File(getDir(“dex”, Context.MODE_PRIVATE),SECONDARY_DEX_NAME);
  • 通过DexClassLoader类加载器来解析优化前面的dex文件
  • 通过DexClassLoader的loadClass函数来载入类
  • 通过获得到的类的newInstance函数来生成需要的对象
  • 开始使用获取到的动态类对象~\(≧▽≦)/~啦啦啦
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.

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表