在Android中动态载入自定义类
来源:互联网 发布:c语言的封装例子 编辑:程序博客网 时间:2024/05/13 06:20
普通的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.
Read more: http://blog.chengyunfeng.com/?p=87#ixzz2ZNv0s95G
- 在Android中动态载入自定义类
- 在Android中动态载入自定义类
- 在Android中动态载入自定义类
- 在页面中动态载入外部javascript
- 在页面中动态载入外部javascript
- 在可执行jar中动态载入第三方jar(转贴)
- 在可执行jar中动态载入第三方jar
- 在可执行jar中动态载入第三方jar(转贴)
- 在可执行jar中动态载入第三方jar
- 在可执行jar中动态载入第三方jar(转贴)
- 在页面中动态载入外部javascript和CSS
- 【Unity3d】如何在Unity中动态载入Lightmapping
- Android中如何在“自定义布局”中“动态”添加控件
- Android自定义progressDialog实现 loading 载入中 动画效果
- Android 在自定义view中动态设置布局规则
- java中动态载入类、方法的几个玩意儿
- 在可执行jar 包中动态载入第三方jar class的有关问题
- 在可执行jar 包中动态载入第三方jar class的有关问题
- Android中有关文件存储的函数
- ibaits2.x+spring2.x 批量插入
- PowerDesigner Unable to list the users 解决办法
- 排列组合的实现
- Android自定义ExpandableListView
- 在Android中动态载入自定义类
- 网络基础
- 你太猖狂
- mysql的grant用法
- postgresq与mysql中timestampdiff(SECOND,字段,NOW())相同求时间差值的秒值
- POJ2629
- oracle学习笔记
- sharepoint 2010 window域认证修改成基于声明的认证
- memo:Liferay中的sequence