命令行指定的类打入单独的DEX

本文档详细介绍了如何在Android中为特定需求创建单独的DEX文件。通过编写Java代码,编译成class,打包成jar,然后利用dx命令生成DEX。过程中讨论了可能出现的版本错误和类不匹配问题,并提供了解决方案。最后,验证了生成的DEX的正确性,强调在实际开发中使用gradle的便利性。
摘要由CSDN通过智能技术生成

需求

       Android有的时候有分DEX的需求,当方法数超过了66535这个数,我们就需要开启MultiDex,还有的时候我们有的部分需求是一直不会改变,那这个时候我们可以将对应的代码单独打包成DEX,可以预先放置到Assert目录下, 在需要的时候进行加载

       热更新也有这样的需求,将出问题的代码单独打入一个path dex中,我们知道在加载dex到内存中时,如果不存在odex文件,那么就会先执行dexOpt,代码中会执行dvmVerifyClass,这个方法主要是为了防止类被篡改,改变了类的合法性,如果当前的类和引用的类都在同一个dex时,会被打上CLASS_ISVERIFYED标志,这个如果有问题,path中dex肯定与调用代码不在同一个dex,这时就会出问题,很多解决该问题的方案都是类都引用一个其他dex中的类, 防止被打上该标记。

生成过程

       生成DEX有很多方式,比如官方的Multi dex,可以指定那些类被打入到main dex中,其他的类打入其他的dex中,那我们这里主要是采用命令行的方式将指定的类打入指定的dex中,

       将代码打入dex主要有以下步骤:

  1. 编写java代码
  2. 编译成class
  3. 打包成jar
  4. dx命令生成对应的dex

编写java代码

       比如我们写了下面的一个java代码:

package com.demo.bean;

/**
 * Created by xxx on 2017/7/20.
 */

public class DexDemo {
   

    public String call() {
        return "dex demo";
    }
}

class生成

       这里我们可以直接用javac命令来编译,也可以采用Android Studio build一次生成,build 后可以可以在如下路径找到class文件:

这里写图片描述

       我们可以在build目录下找到对应的calss。也可以采用如下命令,在cmd或者mac的terminal中进入对应java的目录输入:

:JavaTest doc$ javac DexDemo.java

生成jar

       我们将编译后的class成jar包,生成jar包的方式也有很多中,比如网上有:可能是最通用全面的Android studio打包jar方法,这里我们采用命令行的方式进行,这里生成的时候要注意一下不同的生成方式会出现在dex过程时会出现不同的错误,以下就一种一种的演示:

1:命令行的class生成jar

       在命令行输入如下的命令:

jar cvf dexdemo1.jar /Users/doc/JavaTest/DexDemo.class

       这时我们会生成dexdemo1的jar包,这里主要是为了演示不同的class来生成jar后dex的不同。

2:build class生成jar

       命令同1:

jar cvf dexdemo2.jar /Users/doc/Android/Demo/app/build/intermediates/classes/debug/com/demo/bean/DexDemo.class

       只是路径变化了,其他的都没有变化

       经过上述两个步骤,我们生成了两个jar:
这里写图片描述

       可以发现两个jar的大小不一样,同样的代码生成的居然大小不一样,后面就会知道为什么?

生成dex

       生成了jar后,我们就可以采用命令来生成对应的dex了,我们采用dx命令来生成,这里命令主要在Android sdk下bulid-tools中的dx工具。

jar1生成

       输入如下的命令:

dx --dex --output dex1.dex dexdemo1.jar

       前面dex1.dex是生成的dex文件,后面是对应的jar,我还是在之前生成的jar路径下操作的,如果你发现dx不可用,可以加入到环境变量。

       执行命令后成功的生成了如下错误:

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Exception parsing classes
    at com.android.dx.command.dexer.Main.processClass(Main.java:752)
    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:718)
    at com.android.dx</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值