一、前言:

现在,已经有实力强大的公司用这个技术开发应用了,比如淘宝,大众点评,百度地图等,之所以采用这个技术,实际上,就是方便更新功能,当然,前提是新旧功能的接口一致,不然会报Not Found等错。

二、原理:

2.1 JAR文件:

Android使用动态加载的方法,和Java加载类似,都是加载.jar文件来实现,只不过,不同的是,这两者的虚拟机不同,导致.jar的格式也不同。

Android只认识.dex格式的.class文件,因为,需要做的是:

1. 正常的方法Export出一个.jar文件;

2. 使用命令将.jar转成.dex格式的.jar文件;

命令: dx --dex --output=[path]/[dest].jar [path]/[src].jar

2.2 ClassLoader:

Android系统提供了两种ClassLoader:

1. DexClassLoader

这个可以加载jar/apk/dex,也可以从SD卡中加载,也是本文的重点。

2. PathClassLoader

只能加载已经安装到Android系统中的apk文件。

三、实战:

3.1 创建一个Jar的空工程(这里我取名叫:DynamicLoaderLib)

1. 新建两个.java文件,一个是IDynamicLoader.java(接口类),一个是LibDexJar.java(接口的实现类)

2. 代码

IDynamicLoader.java

package com.chris.dynamic.loader;

public interface IDynamicLoader {
public String getHelloWorld();
}

LibDexJar.java

package com.chris.dynamic.loader;

public class LibDexJar implements IDynamicLoader {
@Override
public String getHelloWorld() {
return "HelloWorld! (使用动态加载方法)";
}
}

3. 导出jar包 (Export -> jar文件)

然后点"完成"就行了(千万不要将接口定义类也打包进去,否则在运行时会报错,只打包接口实现类就行)。

大家可以随意存放,不过,为了方便维护,我在当前这个工程下面建了一个jar目录来存放。

然后,打开命令行,输入命令:

dx --dex --output=[全路径]/dst.jar [全路径]/src.jar

注:大家需要把Android SDK的路径添加到系统的环境变量中,这样才能让系统找到dx工具,否则系统会报找不到。

这样,就生成好了我们所需要的dex格式.class的jar包,然后把这个放到手机的/mnt/sdcard目录下(因为这个目录是可读写的)。

3.2 创建一个Test工程(DynamicLoaderTest)

IDynamicLoader.java就是上一个JAR工程中的接口定义类,这里只给出MainActivity.java的实现:

         @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button dloader = (Button) findViewById(R.id.dload_jar);
dloader.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
File dexJar = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
File.separator + "LibDexJar.jar");
if(dexJar.exists()){
DexClassLoader dcl = new DexClassLoader(dexJar.getAbsolutePath(),
Environment.getExternalStorageDirectory().toString(),
null, getClassLoader());
try {
Class dloaderClass = dcl.loadClass("com.chris.dynamic.loader.LibDexJar");
IDynamicLoader IDloader = (IDynamicLoader) dloaderClass.newInstance();
Toast.makeText(MainActivity.this, "Android动态加载Demo:" + IDloader.getHelloWorld(), Toast.LENGTH_SHORT).show();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
});
}

这里可以分为4步:

1. 判断是否存在LibDexJar.jar文件在sdcard目录下;

2. 使用DexClassLoader加载JAR文件;

3. 载入Class;

4. 获取接口类的实例;

然后,就可以使用接口类中开放的接口了。

附上我运行的截图:

  

最后,附上我的两个工程的源码供大家下载参考:

http://download.csdn.net/detail/qingye_love/6386981

大家多在本文章中来讨论,多多交流,谢谢!

另附上将导致的jar生成dex的jar(在代码的JAR目录下,这里我也贴出来):

dexjar.bat

@echo off
rem 使用前请先设置自己的Android SDK路径
set ANDROID_SDK="E:\chris\Android_Dev\Android\android-sdk" set path=%path%;%ANDROID_SDK%\platform-tools; rem 设置jar所存放的路径
set JAR_ROOT="E:\chris\Android_Dev\eclipse\workspace\DynamicLoaderLib\jar" rem 编译
@echo on
dx --dex --output=%JAR_ROOT%\LibDexJar.jar %JAR_ROOT%\dynamic.jar

Android动态加载技术初探的更多相关文章

  1. Android动态加载技术(插件化技术)

    No1: 插件化技术的好处: 1)减轻应用的内存和CPU占用 2)实现热插拔,即在不发布新版本的情况下更新某些模块 No2: 插件化方案必须要解决三个基础性问题:资源访问.Activity生命周期的管 ...

  2. Android动态加载代码技术

    Android动态加载代码技术 在开发Android App的过程当中,可能希望实现插件式软件架构,将一部分代码以另外一个APK的形式单独发布,而在主程序中加载并执行这个APK中的代码. 实现这个任务 ...

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

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

  4. Android 动态加载 (一) 态加载机制 案例一

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

  5. Android 动态加载(防止逆向编译) jar混淆加密

    最近工作中接到了一个研究防止逆向编译的任务.研究了几天资料,最后基本实现了防破解技术,在这个工程中,也略有一些心得体会,现整理下来分享,供大家探讨参考研究.文中如有纰漏.失实之处,请大家及时给与指正. ...

  6. 插件化开发—动态加载技术加载已安装和未安装的apk

    首先引入一个概念,动态加载技术是什么?为什么要引入动态加载?它有什么好处呢?首先要明白这几个问题,我们先从 应用程序入手,大家都知道在Android App中,一个应用程序dex文件的方法数最大不能超 ...

  7. android动态加载

    转载自: http://www.cnblogs.com/over140/archive/2012/03/29/2423116.html http://www.cnblogs.com/over140/a ...

  8. [转载] Android动态加载Dex机制解析

    本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...

  9. flash的动态加载技术

    这里所说的动态加载技术, 主要是指代码模块(可以是swc也可以是swf)的动态加载.即主swf在运行的时候, 可以根据需要动态加载所需的代码模块. 为了讨论方便, 下面所说的代码模块都用swc表示,用 ...

随机推荐

  1. 使用JProfiler进行内存分析

    在最近的工作中,通过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析记录下来,已备今后遇到相似问题时可以作为参考. 运行环境: Tomcat6,jdk6,JProfiler8 内存 ...

  2. Document字段发生变化后,报的错

    2016-10-11 15:27:47,828 [ERROR] [main] SpringApplication:838 - Application startup failedorg.springf ...

  3. Java 输入流读取文本文件换行符问题

    一问题 在学习流编程的过程中,我遇到了一下问题.首先来看一下我写的java源程序: package StreamLearn; import java.io.*; public class TestFi ...

  4. Samba ‘dcerpc_read_ncacn_packet_done’函数缓冲区溢出漏洞

    漏洞名称: Samba ‘dcerpc_read_ncacn_packet_done’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201312-169 发布时间: 2013-12-12 更新时间 ...

  5. 详解强大的SQL注入工具——SQLMAP

    1. 前言  Windows下的注入工具好的又贵,免费的啊D.明小子等又不好用,我们根本没必要花 时间去找什么破解的havij.pangolin什么的,特别是破解的工具很可能被绑了木马.其实 Linu ...

  6. wuzhicms发送邮件

    //邮件发送 $config = get_cache('sendmail'); $siteconfigs = get_cache('siteconfigs'); $password = decode( ...

  7. Clean Code–Chapter 7 Error Handling

    Error handling is important, but if it obscures logic, it's wrong. Use Exceptions Rather Than Return ...

  8. SecureCRT中文乱码解决方法

    在windows下使用SecureCRT访问MAC主机,发现中文总是乱码.而且默认会话选项设置的字符编码就是UTF-8,和MAC主机默认字符编码一样. 后来通过设置,解决了中文乱码问题. 具体使用了两 ...

  9. 问题-关于sharemem程序访问WEB出现内存错误处理

    [delphi技术] 关于sharemem造成dll错误的处理办法问题现象:如果程序和dll之间用string作为参数传递时容易出现错误问题处理:需要在程序的uses中使用sharemem.这个sha ...

  10. ScheduledExecutorFactoryBean忽略异常继续执行

    ScheduledExecutorFactoryBean忽略异常继续执行 程序中有一个定时任务,每10分钟把满足条件的任务从一个表迁移到另一张表,程序启动的时候数据库异常了一段时间,之后数据库恢复了. ...