那些年ant自定义构建dex分包所遇到的坑

来源:互联网 发布:baocms7.6源码下载 编辑:程序博客网 时间:2024/06/08 15:41

前言


这片文章不讲解怎么去使用ant自定义构建分包,网上大有文章所在,但是我发现其中聊坑的文章特别少,因此根据整个dex分包的过程中所遇到的坑以及解决办法跟大家分享。


以下环境均是eclipse

聊坑

一、UNEXPECTED TOP-LEVEL EXCEPTION

这里写图片描述

此时我的JDK版本是1.8,ant版本是apache-ant-1.10.1-bin,贴出在build.xml中的部分编译代码:

<javac            bootclasspath="${android-jar}"            compiler="javac1.8"            destdir="${bin}"            encoding="utf-8"            includeantruntime="false"            listfiles="true"            target="1.8">

随后我查资料可知是由于ant不支持jdk1.8所致,于是我找到jdk1.7的资源下载,下载后,我并没有去卸载jdk1.8,而是直接安装jdk1.7,因此现在我的电脑中有jdk1.8和jre1.8 and jdk1.7和jre1.7两个版本的jdk因为我感觉安装jdk1.7和jre1.7会将之前关于1.8版本的数据替换掉,然后我又将环境变量中的JAVA_HOME的值替换成了jdk1.7的目录。

此时记住一定要关闭CMD,凡是只要我们要使用已经修改了环境变量中的的值中包含的命令,就一定得重启CMD,这样可以避免很多麻烦。

例如:
刚才我修改了关于JDK的环境变量的JAVA_HOME的路径,假如我没有重启CMD,此时我在控制台无论输入java -version 还是javac -version此时的jdk版本依然是1.8版本,但是前面我已经说了我将JAVA_HOME的值已经修改成了jdk1.7的目录,为什么CMD还是输入1.8呢,因为CMD此时会记住之前的设置,只有重启CMD才能重新获取环境变量中的数据。

好的,那么我重启了CMD,但是我发现我输入java -version 还是1.8,而javac -version是1.7

二、javac和java的版本不一致

这里写图片描述

这我就奇怪了,明明环境变量的目录都已经修改成了jdk1.7的绝对路径,还可以是1.8,于是我又打开环境变量再次确定看到JAVA_HOME确实是JDK1.7的路径,我又打开Path分析一下,毕竟CMD中的命令都是由Path路径决定的:

%C:\ProgramData\Oracle\Java\javapath%;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;D:\Program Files\TortoiseSVN\bin;D:\Program Files\Git\cmd;%ADBEXE%;%JDKEXE%;%ZIPALIGN%;D:\Program Files\VisualSVN Server\bin;%ANT_HOME%\bin

经过分析Path的数据,我发现CMD首先会默认去查找排在前面的路径中的命令,我们知道在

%C:\ProgramData\Oracle\Java\javapath%;%SystemRoot%\system32;

这两个中也是包含java三个java程序:

这里写图片描述

于是我想是不是之前我没卸载jdk1.8,这三个程序都是之前jdk1.8的,而CMD默认查找Path中排在最前的路径,于是我复制JDK1.7/bin目录下的这三个程序将以上两个路径中的程序覆盖,
然后再次重启CMD,输入java -version和javac-version,发现一下错误:

三、 Error: Registry key ‘Software\JavaSoft\Java Runtime Environment’\CurrentVersion’ has value ‘1.8’, but ‘1.7’ is required. Error: could not find java.dll Error: Could not find Java SE Runtime Environment.

这里写图片描述

这尼玛,这一复制粘贴还出现一个这样的错误,不过错误也很明显是是注册表中有问题,打开开始输入:

regedit.exe

打开它,找到 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment,一发现jdk1.8还在注册表中使用:

这里写图片描述

于是我点击CurrentVersion将其修改为1.7,然后重启CMD,输入java -version和javac -version,发现这次都是jdk1.7版本:

这里写图片描述

好的,现在既然现在确实都是使用的是jdk1.7,接下来当然我当来是又定位到我的项目,再次输入ant命令:

这里写图片描述

这次又出现了

四、 UnsupportedClassVersionErro :Unsupported major.minor version 52.0

不过错误也很明显,52.0即代表jdk1.8,而现在我编译都是jdk1.7,使用jdk1.7编译jdk1.8的东西,才会出现不支持52.0,即不支持jdk1.8

分析错误:之前使用java -version 和javac -version都是显示出的jdk1.7,到底哪里还有使用了jdk1.8呢,于是我想是不是我需要分包的整个项目的配置还有地方使用了jdk1.8,于是我点击项目–>右键–>点击Properties,如下:

这里写图片描述

果然我发现该项目的java配置里面还是jre1.8,于是我将当前jre的目录修改为jre7的目录,之后再次重启CMD,定位到该项目,使用ant命令,发现还是
UnsupportedClassVersionErro :Unsupported major.minor version 52.0

于是我再次查看环境变量并也确保的确配置的是jdk1.7的目录,再次在cmd输入java -version和javac -version也是显示的 jdk1.7,然后去注册表把关于Jdk1.8的东西也全部删除,并且把

%C:\ProgramData\Oracle\Java\javapath%;%SystemRoot%\system32;

中的三个程序也删除了毕竟环境变量优先考虑以上两个路径中的java命令,然后再次重启CMD,输入ant,情况也是依旧,

再次分析:我想是不是之前说ant不支持jdk1.8是错误的呢,于是我又没有卸载jdk1.7,重新安装了一次jdk1.8,并将环境变量的目录设置成了jdk1.8的目录,然后重启CMD,
输入java -version和javac -version确认是jdk1.8之后,定位到项目目录,输入ant:
又出现错误:

五、javac:目标发行版1.7与默认的源发行版1.8冲突

这里写图片描述

分许错误:我突然想到的build.xml中的配置还是使用的jdk1.7,于是我又修改build.xml的部分编译代码如下:

<property        name="jdk-folder"        value="D:\Program Files\Java\jdk1.8.0_101" /><javac            bootclasspath="${android-jar}"            compiler="javac1.8"            destdir="${bin}"            encoding="utf-8"            includeantruntime="false"            listfiles="true"            target="1.8">

然后再次输入ant命令,发现又转到了第一个错误,真是又回到了革命的起点:

这里写图片描述

于是我又再次相信ant 确实不支持jdk1.8了,我想又得重复刚才一切的的动作了,但是这一次不同的是:

1.我的项目中一直是存在两个jdk版本,因为之前我一直是覆盖式的安装,我想可能这也是原因,首先我来到控制面版的程序与功能找到java相关的全部卸载,如下图:

这里写图片描述

2.找到jdk1.7的程序,重新安装,安装成功后将环境变量的目录设置为jdk1.7的目录,将build.xml的编译环境设为jdk1.7如下:

<property        name="jdk-folder"        value="D:\Program Files\Java\jdk1.7.0_80" /><javac            bootclasspath="${android-jar}"            compiler="javac1.7"            destdir="${bin}"            encoding="utf-8"            includeantruntime="false"            listfiles="true"            target="1.7">

并查看并确保eclipse中的编译环境是jdk1.7:
这里写图片描述

3.重启CMD,输入java -version 和javac -version,
出现java -version 是显示有用的,然而javac不是内部命令:

这里写图片描述

据经验可知,这是环境变量的问题,于是我来到环境变量,发现JAVA_HOME的目录确实是jdk1.7的目录,于是我又分析Path目录:

%C:\ProgramData\Oracle\Java\javapath%;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;D:\Program Files\TortoiseSVN\bin;D:\Program Files\Git\cmd;%ADBEXE%;%JDKEXE%;%ZIPALIGN%;D:\Program Files\VisualSVN Server\bin;%ANT_HOME%\bin

前面也说过,CMD是根据Path数据中的路径先后去查找命令的,因为%C:\ProgramData\Oracle\Java\javapath%;中也有java命令,肯定是先运用了里面的,发现里面没有,于是我将Path路径中的这一段路径删除:

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;D:\Program Files\TortoiseSVN\bin;D:\Program Files\Git\cmd;%ADBEXE%;%JDKEXE%;%ZIPALIGN%;D:\Program Files\VisualSVN Server\bin;%ANT_HOME%\bin

再次重启CMD,发现java -version和javac -version都是jdk1.7:

这里写图片描述

随后我又试了直接将JAVA_HOME相关放在Path路径最前面:

%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%C:\ProgramData\Oracle\Java\javapath%;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;D:\Program Files\TortoiseSVN\bin;D:\Program Files\Git\cmd;%ADBEXE%;%JDKEXE%;%ZIPALIGN%;D:\Program Files\VisualSVN Server\bin;%ANT_HOME%\bin

以及又修改成了原始的:

%C:\ProgramData\Oracle\Java\javapath%;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;D:\Program Files\TortoiseSVN\bin;D:\Program Files\Git\cmd;%ADBEXE%;%JDKEXE%;%ZIPALIGN%;D:\Program Files\VisualSVN Server\bin;%ANT_HOME%\bin

发现javac命令都是有效的,这使我知道了如果第一次解决了这个问题,之后只要系统会自动生成的目录也会响应解决这个问题,不然后面我又改回了和第一次相同的目录为什么第一次没用,之后我改了之后就有用了。

3.重启CMD,定位到项目目录,输入ant,发现又是一次回到解放前:

这里写图片描述

这次又出现了 四、 UnsupportedClassVersionErro :Unsupported major.minor version 52.0

刚才的步骤已经彻底将jdk1.8卸载了,所以电脑中应该是没有了jdk1.8的东西,为什么还会出现这个问题呢?我看到网上有一个这样的解决办法:
点击该项目的build.xml–>右键–>Run As–>External Tools Configurations,配置如下:

这里写图片描述

这里写图片描述

但是我发现完全没用

第二个解决办法,之前我说我使用的ant版本是:apache-ant-1.10.1-bin,有网友说是这个ant的问题,于是我下载了较低版本的ant,此时的ant版本为:apache-ant-1.7.1,然后再次修改了环境变量中ant的目录为1.71的目录,重启CMD,定位到项目目录,输入ant,结果真的解决了
四、 UnsupportedClassVersionErro :Unsupported major.minor version 52.0
我可谓是欣喜若狂啊,毕竟终于看到一点效果,可是让我惊喜的是又出现了一个这样的错误:

六、build.xml:209:Class not found javac1.7

这里写图片描述

不过这个错误也是挺明显的,直接告诉你在build.xml的209行,没有找到javac 1.7

首先我来到build.xml的209行:

这里写图片描述

之前java -version 和javac -version都显示其版本为1.7我想应该不会找不到javac1.7,所以我想是不是209行:

target="1.7">

这个有问题,于是我删除了这一行,重启CMD,定位到项目目录,输入ant,发现这个错误依旧会有,

所以最终的解决办法是,删除:

compiler="javac1.7"

因为javac 根本没有这个命令,所以compiler=”javac1.7” 完全就是一个错误的指令放在这里,删除即可,所以最后的编译代码如下:

<javac            bootclasspath="${android-jar}"            destdir="${bin}"            encoding="utf-8"            includeantruntime="false"            listfiles="true"            >

最后再次重启CMD,定位到项目目录,输入ant,发下如下错误:

七、 D:\android\project\antCustomBuilderDexPatch\build.xml:357: Problem: failed to create task or type foreach Cause: The name is undefined. Action: Check the spelling. Action: Check that any custom tasks/types have been declared. Action: Check that any / declarations have taken place.

这里写图片描述

在build.xml的357行有错误:

这里写图片描述

问题原因,因为foreach ,forin,switch等循环语句需要用到一个jar包,而这个jar包ant不自带,需要自己去下载,这个jar包叫做ant-contrib.jar,于是我去网上下载了版本为ant-contrib-1.0b3.jar,然后将其放置于ant的lib目录下。

然后在build.xml中添加如下代码:

<taskdef resource="net/sf/antcontrib/antlib.xml">    <classpath>      <pathelement location="/D:/apache-ant-1.10.1/lib/ant-contrib-1.0b3.jar"/>    </classpath>  </taskdef> 

引用这个jar的路径。

最后重启CMD,定位到项目目录,输入ant,

这里写图片描述

最后很显然的build 成功了,成功进行了dex分包。

以上便是进行dex分包所遇到的坑,将整个从错误到成功的过程分享给大家,希望能帮到大家,也希望大家在dex分包或者其他问题的时候分享出来,大家一起解决。点个赞,谢谢。


以下 是后来我分析dex分包时出现的错误:

无效的目标发行版1.8

这里写图片描述

原因是build.xml中target=”1.8”,修改成1.7即可

原创粉丝点击