Android动态加载jar/dex[转]
前言
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势。本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病。
声明
欢迎转载,但请保留文章原始出处:)
博客园:http://www.cnblogs.com
农民伯伯: http://over140.cnblogs.comAndroid中文翻译组:http://androidbox.sinaapp.com/
正文
一、 基本概念和注意点
1.1 首先需要了解一点:在Android中可以动态加载,但无法像Java中那样方便动态加载jar
原因:Android的虚拟机(Dalvik VM)是不认识Java打出jar的byte code,需要通过dx工具来优化转换成Dalvik byte code才行。这一点在咱们Android项目打包的apk中可以看出:引入其他Jar的内容都被打包进了classes.dex。
所以这条路不通,请大家注意。
1.2 当前哪些API可用于动态加载
1.2.1 DexClassLoader
这个可以加载jar/apk/dex,也可以从SD卡中加载,也是本文的重点。
1.2.3 PathClassLoader
只能加载已经安装到Android系统中的apk文件。
二、 准备
本文主要参考"四、参考文章"中第一篇文章,补充细节和实践过程。
2.1 下载开源项目
http://code.google.com/p/goodev-demo
将项目导入工程,工程报错的话应该是少了gen文件夹,手动添加即可。注意这个例子是从网上下载优化好的jar(已经优化成dex然后再打包成的jar)到本地文件系统,然后再从本地文件系统加载并调用的。本文则直接改成从SD卡加载。
三、实践
3.1 编写接口和实现
注意,直接在这个开源项目里面编写以下代码!
3.1.1 接口IDynamic
packagecom.dynamic;public interfaceIDynamic{
publicStringhelloWorld();
}
3.1.2 实现类DynamicTest
packagecom.dynamic;public classDynamicTest implementsIDynamic{
@Override
publicStringhelloWorld(){
return"HelloWorld!";
}
}
3.2 打包并转成dex
3.2.1 选中工程,常规流程导出即可,如图:
注意:在实践中发现,自己新建一个Java工程然后导出jar是无法使用的,这一点大家可以根据文章一来了解相关原因,也是本文的重点之一。这里打包导出为dynamic.jar3.2.2 将打包好的jar拷贝到SDK安装目录android-sdk-windows\platform-tools下,DOS进入这个目录,执行命名:
dx--dex--output=dynamic.dexdynamic.jar3.3 修改调用例子
修改MainActivity,如下:
注意:在实践中发现,自己新建一个Java工程然后导出jar是无法使用的,这一点大家可以根据文章一来了解相关原因,也是本文的重点之一。这里打包导出为dynamic.jar
3.2.2 将打包好的jar拷贝到SDK安装目录android-sdk-windows\platform-tools下,DOS进入这个目录,执行命名:
dx--dex--output=dynamic.dexdynamic.jar3.3 修改调用例子
修改MainActivity,如下:
四、参考文章[推荐]在Android中动态载入自定义类
Android app中加载jar插件
关于Android的ClassLoader探索
Android App 如何动态加载类
五、补充
大家可以看看DexClassLoader的API文档,里面不提倡从SD卡加载,不安全。此外,我也正在组织翻译组尽快把这个命名空间下的几个类都翻译出来,以供大家参考。
工程下载:这里,Dex文件下载:这里。大家可以直接把Dex文件拷贝到SD卡,然后运行例子。
更多相关文章
- android窗体加载过程剖析之消息处理的注册机制
- [Android]关于换肤功能的遐想篇
- android Apk打包过程概述_android是如何打包apk的
- Android热更新简介
- Android高德地图加载WMS服务应用实践
- Android应用程序打包时,出现错误:"XXX" is not translated in "af
- Linux中Jenkins+Git+Gradle自动化打包Android
- android UI进阶之实现listview的下拉加载
- Android(安卓)APP设计加载使用gif动图需要注意的一般性问题