Android实现插件化(热加载)和插件加密


读刊推荐:

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


一、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类的动态加载

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

三、实现插件框架

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

四、实现插件的加密

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值