有时候我们须要使用动态更新技术,简单来说就是:当我们把开发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包的实现方法的更多相关文章

  1. 深入浅出Android动态载入jar包技术

    在实际项目中.因为某些业务频繁变更而导致频繁升级client的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路.将核心的易于变更的业务封装在jar包里然后通过网络下载下来 ...

  2. Android动态载入Dex机制解析

    1.什么是类载入器? 类载入器(class loader)是 Java™中的一个非常重要的概念.类载入器负责载入 Java 类的字节代码到 Java 虚拟机中. Java 虚拟机使用 Java 类的方 ...

  3. 如何制作Jar包并在android中调用jar包

    android制作jar包: 新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmani ...

  4. Android Studio导出Jar包

    这篇博客将介绍一下如何用Android Studio导出jar包,希望能给大家带来帮助. 首先需要修改build.gradle文件,在Android Studio中会显示多个build.gradle文 ...

  5. jar包冲突排解方法(sbt)

    jar包依赖冲突,版本不兼容会导致各种各样的问题.这里推荐一款sbt插件用于查找项目中的jar包依赖关系,通过该插件可以轻松的看出某个jar包依赖哪些jar,以及某个jar被哪些jar所依赖.此外该插 ...

  6. 使用命令动态更新JAR包中的文件

    动态更新JAR包中的文件,经本人实际测试可正常执行! 一.查询jar包中要替换的文件位置 jar  -tvf  gateway.jar  |  grep  topjui.config.js 二.在当前 ...

  7. 【Maven】【IDEA】在idea中开发web项目,解决maven的jar包冲突的方法

    在idea中开发web项目,解决maven的jar包冲突的方法 第一步: 先对项目进行 clean ,再进行install 第二步: 出现NoSuchMethodException,ClassNotF ...

  8. Eclipse笔记-sun.misc.BASE64Encoder找不到jar包的解决方法

    从SVN检出新项目,在Eclipse中报错如下: 转: Eclipse笔记-sun.misc.BASE64Encoder找不到jar包的解决方法 2018-01-04 00:36:20 雨临Lewis ...

  9. android 如何引用jar包

    首先,把jar包放到项目目录app/libs下,然后是项目引用:三个方法 方法一.添加compile 打开app下的build.gradle,在dependencies里面添加 implementat ...

随机推荐

  1. Android studio 自己主动排版

    一開始非常纠结于Android studio怎样有快捷键自己主动排版换行.找了网上非常多的快捷键并没实用.有说ctrl+shift+L的,我试了试全然没用.只是最后我还是找到了一个最好的办法.事实上有 ...

  2. HDU 2054 A==B? 大数

    Problem Description Give you two numbers A and B, if A is equal to B, you should print "YES&quo ...

  3. ios 导航栏 点击barbutton的按钮 下拉列表

    环境:xocde5.0.2+ios7.0.1 1.导航栏 ----点击科目--------下拉列表 代码:NGRightTableViewViewController.h #import <UI ...

  4. angularjs1-8,cacheFactory,sce

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  5. uninstall OpenJDK9

    sudo apt--jre openjdk--jdk ///要慎用auto命令,会把所有的软件包删掉 https://www.linuxidc.com/Linux/2017-11/148941.htm ...

  6. c++ std

    高中只是听说过stl,每次问老师老师都会说“有毒,千万别学”,于是stl有毒的言论深深的印在我脑海,看到就恐惧,于是一直没有学,但是大学后确实很多用到stl的地方必须去学习了. 现在想想老师当年的说法 ...

  7. Migrations有两个文件迁移数据的方法

    不分开迁移报错如下; 解决方案 1 迁移Migration/nfoManage EntityFramework\Enable-Migrations -ContextTypeName InfoModel ...

  8. 7.matlab字符串分析

    1 字符串处理函数 clc; clear all; str='My name is Robin.'; disp(str); %字符串的输出 str_size=size(str) %字符串的长度 str ...

  9. iris中间件

    最近使用golang写的时候涉及到权限校验,用中间件(使用iris框架内的东西) 自己摸索出一种自己的方式 iris.UseFunc(MiddlewareFunc)使用这个方法,会在所有的请求之前执行 ...

  10. canvas绘制三等分饼型图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...