Android实现插件化(热加载)和插件加密
16lz
2021-01-23
读刊推荐:
脑袋有点大暂时不做知识整理,给出几个较好的链接吧:
先学习DexClassLoader:
- Android中的类装载器DexClassLoader: http://blog.csdn.net/com360/article/details/14125683
- Java ClassLoader基础及加载不同依赖 Jar 中的公共类: http://www.trinea.cn/android/java-loader-common-class/
在学习插件化,组件化,动态加载的概念:
- Android 插件化 动态升级: http://www.trinea.cn/android/android-plugin/
- Android 使用动态加载框架DL进行插件化开发:http://blog.csdn.net/t12x3456/article/details/39958755/
- android基于插件式开发: http://www.2cto.com/kf/201409/333007.html
- 最后,分享几个好的动态加载的项目:
- Small: https://github.com/wequick/Small/wiki
- HotFix:http://p.codekk.com/detail/Android/dodola/HotFix
- 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
- 设置jar包位置(内部、外部存储)和jar解压位置(只能为内部存储)
- new DexClassLoader
- 反射得到并执行需要的方法
@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(); } }
- 运行输出结果:
- 把jar包放在代码指定位置
- 执行程序(函数)
- 观察具体调用函数的输出结果(本文给出的jar包输出Log Tag=elvis)
二、实现对含Activity类的动态加载
·······················
三、实现插件框架
·······················
四、实现插件的加密
·······················
五、对资源文件实现插件化
·······················
更多相关文章
- 使用ProgressBar实现加载进度条
- Android P SystemUI之StatusBar加载流程
- Android系统修改导航栏显示位置
- 使用 Kotlin 开发 Android 应用 | 8 个最优秀的 Android Studio
- 使用 Kotlin 开发 Android 应用 | 8 个最优秀的 Android Studio
- Android改变Spinner弹出框的位置
- 【Android】安卓中常用的图片加载方法
- android异步图片加载三之handler+线程池+消息队列模式
- Android dp方式的屏幕适配工具使用(Android Studio插件方式)