前言

   在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势。本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病。

声明

  欢迎转载,但请保留文章原始出处:)

    博客园:http://www.cnblogs.com

    农民伯伯: http://over140.cnblogs.com

    Android中文翻译组: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.jar

      3.2.2  将打包好的jar拷贝到SDK安装目录android-sdk-windows\platform-tools下,DOS进入这个目录,执行命名:

dx--dex--output=dynamic.dexdynamic.jar

    3.3  修改调用例子

      修改MainActivity,如下:

 注意:在实践中发现,自己新建一个Java工程然后导出jar是无法使用的,这一点大家可以根据文章一来了解相关原因,也是本文的重点之一。这里打包导出为dynamic.jar

      3.2.2  将打包好的jar拷贝到SDK安装目录android-sdk-windows\platform-tools下,DOS进入这个目录,执行命名:

dx--dex--output=dynamic.dexdynamic.jar

    3.3  修改调用例子

      修改MainActivity,如下:

 四、参考文章

    [推荐]在Android中动态载入自定义类

    Android app中加载jar插件

    关于Android的ClassLoader探索

    Android App 如何动态加载类

  五、补充

    大家可以看看DexClassLoader的API文档,里面不提倡从SD卡加载,不安全。此外,我也正在组织翻译组尽快把这个命名空间下的几个类都翻译出来,以供大家参考。

    工程下载:这里,Dex文件下载:这里。大家可以直接把Dex文件拷贝到SD卡,然后运行例子。

更多相关文章

  1. android窗体加载过程剖析之消息处理的注册机制
  2. [Android]关于换肤功能的遐想篇
  3. android Apk打包过程概述_android是如何打包apk的
  4. Android热更新简介
  5. Android高德地图加载WMS服务应用实践
  6. Android应用程序打包时,出现错误:"XXX" is not translated in "af
  7. Linux中Jenkins+Git+Gradle自动化打包Android
  8. android UI进阶之实现listview的下拉加载
  9. Android(安卓)APP设计加载使用gif动图需要注意的一般性问题

随机推荐

  1. 学习笔记-Android Gallery实现
  2. Android中Notification详解【android进化
  3. Android 项目开发基础再回顾(一)
  4. android studio设置debug.keystore
  5. Android安装配置注意
  6. Android监控外接USB设备和获取USB等设备
  7. Android Asynchronous HTTPClient tutori
  8. 开源项目之Android RibbonMenu(导航菜单)
  9. android studio 中使用fastjson
  10. 收藏的Android非常好用的组件或者框架