Android 动态加载dex

学习Android插件化需了解动态加载dex。Android用Dalvik虚拟机加载程序,需将class转化为dex字节码。可通过dx命令将class的jar包转化为dex。Android支持动态加载的方式有DexClassLoader和PathClassLoader,前者可加载多种文件且支持SD卡加载,后者据说只能加载已安装APK。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要学习这个,动态加载dex,因为学习android插件化必须要了解这个才行。

  Android使用Dalvik虚拟机加载可执行程序,所以不能直接加载基于class的jar,而是需要将class转化为dex字节码,从而执行代码。优化后的字节码文件可以存在一个*.jar中,只要其内部存放的是*.dex即可使用。

       将class的jar包转化为dex需要用到命令dx(在*\android-sdk\build-tools\version[23.0.1] 或 *\android-sdk\platform-tools下能找到);命令使用方式为:dx --dex --output=output.jar origin.jar,该命令将包含class的origin.jar转化为包含dex的output.jar文件。

 Android支持动态加载的两种方式是:DexClassLoader和PathClassLoader,DexClassLoader可加载jar/apk/dex,且支持从SD卡加载;PathClassLoader据说只能加载已经安装在Android系统内APK文件

 

 public void loadDex(View view){
        String dexpath = Environment.getExternalStorageDirectory().toString() + File.separator + "output.jar";
        File dexOutputDir = getDir("dex", 0);
         DexClassLoader loader = new DexClassLoader(dexpath, dexOutputDir.getAbsolutePath(), null, getClassLoader());
        Class libProviderClazz = null;
        try {
            libProviderClazz = loader.loadClass("com.example.DynamicImp");
            IDynamic lib = (IDynamic)libProviderClazz.newInstance();
            Toast.makeText(MainActivity.this, lib.helloWorld(), Toast.LENGTH_SHORT).show();
        } catch (Exception exception) {
             exception.printStackTrace();
        }

    }

参考链接:https://blog.youkuaiyun.com/u013478336/article/details/50734108

                  http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值