Android动态载入JAR包的实现方法
有时候我们须要使用动态更新技术,简单来说就是:当我们把开发jar包发送给用户后。假设后期升级了部分代码。这时让用户的jar包自己主动更新,而不是用户主动手动地去更新的技术就是动态更新。这个须要使用的技术之中的一个就是Android动态载入JAR包。
基本的过程分为两步,一个是将须要导出的java文件导出位jar包,java文件代码例如以下所看到的:
package adapter; public class RoutePlanManager { private String name = "RoutePlanManager";
public static String get() {
return "hello world";
}
}
导出为Hello.jar,这时我们须要使用Android SDK提供的工具(在platform-tools文件夹下),有些版本号的没有,能够网上下载。
利用dx工具,将java的jar包转为Android虚拟机能够认识的字节码。详细来说,就是运行例如以下的命令:
dx --dex --output=dex.jar Hello.jar
当中,Hello.jar是我们的源jar包,dex.jar是我们用dx工具处理后的jar包。是Android虚拟机能够识别的jar文件,接下来就能够进行第二步操作了。
这里,我们须要使用DexClassLoader类实现Jar的动态载入,该类构造方法的官方文档例如以下所看到的:
public DexClassLoader (String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent) Added in API level 3
Creates a DexClassLoader that finds interpreted and native code. Interpreted classes are found in a set of DEX files contained in Jar or APK files. The path lists are separated using the character specified by the path.separator system property, which defaults to :. Parameters
dexPath the list of jar/apk files containing classes and resources, delimited by File.pathSeparator, which defaults to ":" on Android
optimizedDirectory directory where optimized dex files should be written; must not be null
libraryPath the list of directories containing native libraries, delimited by File.pathSeparator; may be null
parent the parent class loader
该接口具有四个參数。第一个是dex.jar包的路径。第二个能够觉得是挂载路径,就是优化后的dex文件的存放路径,对权限有要求,所以须要通过上下文获取路径。第三个參数设置为null,第四个代表父亲类载入器。
我们在Android中实现动态载入的代码例如以下所看到的:
String sdcard = Environment.getExternalStorageDirectory().getAbsolutePath();
String jarPath = sdcard + "/Jar/dex.jar";
String tmpPath = getApplicationContext().getDir("Jar", 0).getAbsolutePath();
DexClassLoader cl = new DexClassLoader(jarPath, tmpPath
, null, this.getClass().getClassLoader());
Class<?> libProviderCls = null;
try {
libProviderCls = cl.loadClass("adapter.RoutePlanManager");
Constructor<? > localConstructor = libProviderCls.getConstructor(new Class[] {});
Object obj = localConstructor.newInstance(new Object[] {});
Method mMethodWrite = libProviderCls.getDeclaredMethod("get");
mMethodWrite.setAccessible(true);
String str = (String) mMethodWrite.invoke(obj);
Toast.makeText(LoadJarActivity.this, str, Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
当载入了Jar包之后。我们须要运行Jar包中的方法。这个时候我们须要使用Java的反射来处理。
以上就是实现动态载入的方式。
Android动态载入JAR包的实现方法的更多相关文章
- 深入浅出Android动态载入jar包技术
在实际项目中.因为某些业务频繁变更而导致频繁升级client的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路.将核心的易于变更的业务封装在jar包里然后通过网络下载下来 ...
- Android动态载入Dex机制解析
1.什么是类载入器? 类载入器(class loader)是 Java™中的一个非常重要的概念.类载入器负责载入 Java 类的字节代码到 Java 虚拟机中. Java 虚拟机使用 Java 类的方 ...
- 如何制作Jar包并在android中调用jar包
android制作jar包: 新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmani ...
- Android Studio导出Jar包
这篇博客将介绍一下如何用Android Studio导出jar包,希望能给大家带来帮助. 首先需要修改build.gradle文件,在Android Studio中会显示多个build.gradle文 ...
- jar包冲突排解方法(sbt)
jar包依赖冲突,版本不兼容会导致各种各样的问题.这里推荐一款sbt插件用于查找项目中的jar包依赖关系,通过该插件可以轻松的看出某个jar包依赖哪些jar,以及某个jar被哪些jar所依赖.此外该插 ...
- 使用命令动态更新JAR包中的文件
动态更新JAR包中的文件,经本人实际测试可正常执行! 一.查询jar包中要替换的文件位置 jar -tvf gateway.jar | grep topjui.config.js 二.在当前 ...
- 【Maven】【IDEA】在idea中开发web项目,解决maven的jar包冲突的方法
在idea中开发web项目,解决maven的jar包冲突的方法 第一步: 先对项目进行 clean ,再进行install 第二步: 出现NoSuchMethodException,ClassNotF ...
- Eclipse笔记-sun.misc.BASE64Encoder找不到jar包的解决方法
从SVN检出新项目,在Eclipse中报错如下: 转: Eclipse笔记-sun.misc.BASE64Encoder找不到jar包的解决方法 2018-01-04 00:36:20 雨临Lewis ...
- android 如何引用jar包
首先,把jar包放到项目目录app/libs下,然后是项目引用:三个方法 方法一.添加compile 打开app下的build.gradle,在dependencies里面添加 implementat ...
随机推荐
- Autodesk 举办的 Revit 2015 二次开发速成( 1.5 天),教室培训, 地点武汉
2014年8月26日9:00 – 17:00 2014年8月27日9:00 – 12:00 培训地点: Ø 湖北工业大学 实训楼605教室 Ø 地址:武汉市武昌区南湖李家墩一村一号 Ø 交通路线说明: ...
- hdoj--1087--Super Jumping! Jumping! Jumping!(贪心)
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- 7. Reverse Integer[E]整数反转
题目 Given a 32-bit signed integer, reverse digits of an integer. Example1: x = 123, return 321 Exampl ...
- ZYQAssetPickerController的使用,不错的图片选择
import UIKit class ViewController: UIViewController,ZYQAssetPickerControllerDelegate,UIImagePickerCo ...
- 后缀自动机 (WJMZBMR讲稿的整理和注释)
链接放在这里,有点难理解,至少我个人是的. 后缀自动机是一种有限状态自动机,其功能是识别字符串是否是母串的后缀.它能解决的问题当然不仅仅是判断是不是后缀这种事,跟字符串的连续子串有关的问题都可以往这个 ...
- PopupWindow实现点击外部不消失
View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.alert_ip, null); final Po ...
- X Macro
30年前我念大学时从一个朋友那里学来的一个技巧. 它是汇编语言的一个宏,但很容易转换为C语言宏. 我一直在使用它,但有意思的是我还从没在别人的代码中看到过.现在该我把这个小技巧传递下去了. 让我们举个 ...
- Win10 build package error collections
1. 打包Released的时候出现问题意思是说 本地项目,类里有这个Visibility属性不能进行序列化 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 error CS0029: 无法将 ...
- Codeforces Round #282 (Div. 2) A
解题思路:用数组将每一个显示数字可能表示的数字种数存储起来即可 反思:第一次做的时候没有做出来是因为题意理解错误,第二次WA是因为情况没有考虑完全,1对应有7个数字,5对应有4个数字 A. ...
- RocketMQ学习笔记(11)----RocketMQ的PushConsumer和PullConsumer
1. PushConsumer 推,Broker主动向Consumer推消息,它Consumer的一种,应用通常向对象注册一个Listener接口,一旦接收到消息,Consumer对象立刻回调Lins ...