读刊推荐:

脑袋有点大暂时不做知识整理,给出几个较好的链接吧:

  • 先学习DexClassLoader:

    1. Android中的类装载器DexClassLoader: http://blog.csdn.net/com360/article/details/14125683
    2. Java ClassLoader基础及加载不同依赖 Jar 中的公共类: http://www.trinea.cn/android/java-loader-common-class/
  • 在学习插件化,组件化,动态加载的概念:

    1. Android 插件化 动态升级: http://www.trinea.cn/android/android-plugin/
    2. Android 使用动态加载框架DL进行插件化开发:http://blog.csdn.net/t12x3456/article/details/39958755/
    3. android基于插件式开发: http://www.2cto.com/kf/201409/333007.html
  • 最后,分享几个好的动态加载的项目:
    1. Small: https://github.com/wequick/Small/wiki
    2. HotFix:http://p.codekk.com/detail/Android/dodola/HotFix
    3. AndFix: http://p.codekk.com/detail/Android/alibaba/AndFix

一、DexClassLoader的使用:

项目下载地址(jar包见plugin目录):https://github.com/conghongjie/Android_Elvis_Note

  • 首先需要实现一个dex二进制jar包:
    实现SayHello类,具体代码如下。然后输出的jar包(右键->export->JAR file), 执行dx命令(dx –dex –output = elvis_plugin_dex_sayhello.jarelvis_plugin_sayhello.jar),将jar包打包成一个dex二进制jar包。
package com.elvis.plugin.sayhello;import android.util.Log;public class SayHello {    public SayHello(){        Log.e("elvis", "SayHello类已经被构造!");      }      public void say(){        Log.e("elvis", "Hello Elvis!!!");    }}
  • 使用dexClassLoader
    1. 设置jar包位置(内部、外部存储)和jar解压位置(只能为内部存储)
    2. new DexClassLoader
    3. 反射得到并执行需要的方法
    @SuppressLint("NewApi")          public void test() {              // dex下载的位置--可以是内部存储或外部存储位置              File dexInputFile = new File(Environment.getExternalStorageDirectory().toString() + File.separator                      + "elvis_plugin_dex_sayhello.jar");              String dexInputFileDir = dexInputFile.getAbsolutePath();              // dex输出位置--只能是内部存储位置              String dexOutputFileDir = getFilesDir().getAbsolutePath();              // dexClassLoader对象              DexClassLoader dexClassLoader = new DexClassLoader(dexInputFileDir, dexOutputFileDir, null,                      this.getClass().getClassLoader());              // 利用反射调用插件包内的类的方法              try {                  Class<?> clazz = dexClassLoader.loadClass("com.elvis.plugin.sayhello.SayHello");                  Object obj = clazz.newInstance();                  // //设置参数格式                  // Class[] param = new Class[2];                  // param[0] = Integer.TYPE;                  // param[1] = Integer.TYPE;                  Method method = clazz.getMethod("say");                  // method.invoke(obj,1,12);                  method.invoke(obj);              } catch (ClassNotFoundException e) {                  Log.e("elvis", "ClassNotFoundException");                  e.printStackTrace();              } catch (InstantiationException e) {                  Log.e("elvis", "InstantiationException");                  e.printStackTrace();              } catch (IllegalAccessException e) {                  Log.e("elvis", "IllegalAccessException");                  e.printStackTrace();              } catch (NoSuchMethodException e) {                  Log.e("elvis", "NoSuchMethodException");                  e.printStackTrace();              } catch (IllegalArgumentException e) {                  Log.e("elvis", "IllegalArgumentException");                  e.printStackTrace();              } catch (InvocationTargetException e) {                  Log.e("elvis", "InvocationTargetException");                  e.printStackTrace();              }          }  
  • 运行输出结果:
    1. 把jar包放在代码指定位置
    2. 执行程序(函数)
    3. 观察具体调用函数的输出结果(本文给出的jar包输出Log Tag=elvis)
      运行结果:

二、实现对含Activity类的动态加载

·······················

三、实现插件框架

·······················

四、实现插件的加密

·······················

五、对资源文件实现插件化

·······················

更多相关文章

  1. 使用ProgressBar实现加载进度条
  2. Android P SystemUI之StatusBar加载流程
  3. Android系统修改导航栏显示位置
  4. 使用 Kotlin 开发 Android 应用 | 8 个最优秀的 Android Studio
  5. 使用 Kotlin 开发 Android 应用 | 8 个最优秀的 Android Studio
  6. Android改变Spinner弹出框的位置
  7. 【Android】安卓中常用的图片加载方法
  8. android异步图片加载三之handler+线程池+消息队列模式
  9. Android dp方式的屏幕适配工具使用(Android Studio插件方式)

随机推荐

  1. Zerodium公开Tor浏览器0day代码执行漏洞
  2. 企业服务器中了.PGP后缀的勒索病毒该如何
  3. eNSP:静态路由中的路由备份
  4. eNSP:实现不同网段不同vlan主机之间的互访
  5. eNSP:实现不同网段不同vlan主机之间的互访
  6. eNSP:实现不同网段不同vlan主机之间的互访
  7. Servlet监听器使用实例(提高程序运行速度)
  8. 详解eNSP中Trunk端口和Access端口收发数
  9. Servlet过滤器使用实例(防止用户恶意登录)
  10. eNSP:RIP基本配置