利用DexClassLoader解决方法越界

本文介绍如何通过将部分jar包转换为dex文件来解决Android工程方法数超过65535的问题。详细解释了DexClassLoader的工作原理及其与PathClassLoader的区别,并提供了具体的实现步骤。

背景:
Android工程方法数超过65535,则会提示编译错误(jar包太多)。为了减少jar包,可将一部分jar包转成dex文件(dex:andorid系统对jar的一些优化处理),dex文件在运行期间通过DexClassLoader加载至内存,从而避免方法数越界。
原理:
1.使用ClassLoader的好处:
扩充jar文件;
修改Framework中的已有类文件;
2.为什么使用DexClassLoader:
在Android中,ClassLoader是抽象类,一般使用DexClassLoader或者PathClassLoader加载,他们的区别是
DexClassLoader可以加载jar/apk/dex,可以从SD卡中加载未安装的apk
PathClassLoader只能加载系统中已经安装过的apk
源码,

public class DexClassLoader extends BaseDexClassLoader { public DexClassLoader(String dexPath, String optimizedDirectory,
            String libraryPath, ClassLoader parent) { super(dexPath, new File(optimizedDirectory), libraryPath, parent); } }
public class PathClassLoader extends BaseDexClassLoader { public PathClassLoader(String dexPath, ClassLoader parent) { super(dexPath, null, null, parent); } public PathClassLoader(String dexPath, String libraryPath,
            ClassLoader parent) { super(dexPath, null, libraryPath, parent); } }
  • dexPath: 指目标类所在的jar/apk文件路径, 多个路径使用
    File.pathSeparator分隔, Android里面默认为 “:”
  • optimizedDirectory:
    解压出的dex文件的存放路径,以免被注入攻击,不可存放在外置存储。(DexClassLoader 的optimizedDirectory不能为空)
  • libraryPath :目标类中的C/C++库存放路径。
  • parent: 父类装载器

3.生成所需dex包
cmd至sdk解压目录…\AndroidSDK\build-tools\android-4.4W,
将jar文件转换成dex二进制jar文件:dx –dex –output=classes.dex libs(libs是要转换的jar文件总目录)
4.通过DexClassLoader加载生成的dex文件

  • 将classes.dex放在工程的asserts资源目录下(或者手机内部存储)
  • 生成dex文件输出流

在自定义Application中,重写attachBaseContext,插入

String fileName = "classes.dex";
String internalPath = context.getExternalCacheDir() + File.separator + "classes.dex";
File desFile = new File(internalPath);
InputStream in = null;
OutputStream out = null;
        try {
            in = context.getApplicationContext().getAssets().open(fileName);
            out = new FileOutputStream(desFile.getAbsolutePath());
            byte[] bytes = new byte[1024];
            int i;
            while ((i = in.read(bytes)) != -1)
                out.write(bytes, 0 , i);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (in != null)
                    in.close();
                if (out != null)
                    out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
  • 设置输出流的类加载器
 try
        {
            Field field = ClassLoader.class.getDeclaredField("parent");
            field.setAccessible(true);
            ClassLoader classLoader = context.getApplication().getClassLoader();
            //设置dexclassloader解析的文件目录
            File dexdst = new File(desFile, "dst");
            dexdst.mkdir();
            DexClassLoader dexClassLoader = new DexClassLoader(desFile.getAbsolutePath(), dexdst.getAbsolutePath(),
                    context.getApplication().getApplicationInfo().nativeLibraryDir, classLoader.getParent());
            field.set(classLoader, dexClassLoader);
        } catch (Exception e)
        {
            throw new RuntimeException(e);
        }
.处理病毒 1.acad.lsp 很多以(defun s::startup (/ old_cmd 等开头的lsp病毒代码 中毒后,打开文件自动建立acad.lsp文件等. 2.acaddoc.lsp 以 (setq flagx t) (setq bz "(setq flagx t)")开头lsp代码 中毒后acad.mnl 及cad的support下的所有lsp文件某位都加上此段病毒代码.天正等软件无法启动. 3.acad.fas 版本1 有病毒样本,完美处理. 1.病毒在启动CAD会弹出一个显示间并写有“党是不会亏待你”的对话框 2.注册表增加 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\dwgrun 3.增加文件 c:\WINDOWS\system32\copyfile.vbs c:\WINDOWS\system32\copy.sys(acad.fas副本) cad安装目录,很多子目录中有acad.fas和lcm.fas文件. 版本2 本人无病毒样本,网友提供解决方法. 1.注册表增加 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\sys: "C:\WINDOWS\system32\copyfile.vbs" 2.增加文件 系统目录中增加 winsys.ini、winfas.ini、dwgrun.bat cad安装目录,很多子目录中有acad.sys、acad.fas、acad.ini 版本3 有病毒样本,完美处理. 部分根据nonsmall的帖子处理. 1.注册表增加 HKCU\Software\FileKen HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup 写入BEI_ZHU 值 20030214 2.拷贝文件 C:\Program Files\AutoCAD 2004\Fonts\isohztxt.shx (acad.fas副本) C:\WINDOWS\DivX.fin C:\WINDOWS\system32\SHFR.CMD 3.修改文件 acad.mnl文件中间增加 (setvar "cmdecho" 0) (command "slide") 结尾增加 (princ)(if (null stol) (load "lcm" "")) acad.pgp文件中间增加 SLIDE, SHFR, 5, 4.acad.vlx 版本1 有病毒样本,完美处理. 1. 打开图档会自动生成一个acad.vlx的文件 2.CAD目录的acetauto.lsp ai_utils.lsp acad.mnl文件中间被添加 (vl-file-copy(findfile(vl-list->string'(108 111 103 111 46 103 105 102))) (vl-list->string'(97 99 97 100 46 118 108 120))) 3.Help目录增加logo.gif (acad.vlx文件的副本) 版本2 本人无病毒样本,网友提供解决方法. 1.破坏性的acad.vlx,打开CAD图纸,发现图纸上只有一句英文:MUST re_cover!以前画的图全没有了. 2.运行re_cover就可以恢复被打乱隐藏的图纸 3.全盘搜索acad.vlx删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值