来源:
https://www.jianshu.com/p/e761c0ba0855
https://www.cnblogs.com/liemng/p/5982221.html
整理记录下,万一以后用到了。
将用到的一堆jar合并成一个jar,完事在转换为dex文件
步骤如下:
- 工程根目录下新建build.xml文件
name:工程的名字
basedir :基准目录,不懂,反正写个点没啥影响
destfile:合并后的jar存放的位置以及合并后的jar文件名字
default:默认的运行目录,不管,反正用不到
src:后边是我们要合并的lib的路径,记得加上libs目录。
<?xml version="1.0" encoding="utf-8"?>
<project name="SmartPhone" basedir="." default="makeSuperJar">
<target name="makeSuperJar" description="description">
<jar destfile="all.jar">
<zipfileset src="libs/android-advancedrecyclerview.jar"/>
<zipfileset src="libs/android-support-v7-recyclerview.jar"/>
<zipfileset src="libs/aws-android-sdk-core-2.6.31.jar"/>
<zipfileset src="libs/aws-android-sdk-s3-2.6.31.jar"/>
<zipfileset src="libs/crashlytics.jar"/>
<zipfileset src="libs/dom4j-2.0.2.jar"/>
</jar>
</target>
</project>
工程目录右键,如下图
image.png
然后左侧点击builder,右侧点击new,弹框出来选择ant,如下图
image.png
弹框如下,分别点击红框的地方,第一个是选择我们刚才新建的那个build.xml文件,第二个选择目标工程即可
image.png
点击菜单栏的build project,就可以在控制台看到编译的信息了
我们上边的build.xml文件destfile 没有相对路径,所以就直接在工程根目录下了,这个自己可以改
image.png
合并完jar以后这个ant也就不需要了,要不每次build都执行一次也是浪费,用完可以去下掉勾选了
image.png
- 把这个合并的jar转成dex。使用sdk下的工具dx.bat
打开command命令窗口,完事把路径切换到dx.bat所在的目录,然后执行下边的命令
output后边跟的是生成dex文件保存的位置以及名字,最后是要转换的jar文件路径【就是我们上边打包的那个all.jar】
dx --dex --output=D:\classes2.dex(生成的路径和名称) 路径\myjar.jar
image.png
注意
由于apk默认会将项目中的class文件编译成classes.dex,所以这里你需要更改下你的输出文件名,这里这个名字要有规范,严格的命名classes2.dex,classes3.dex
换句话说这dex文件在这里名字必须是classes2.dex,如果以后这个classex2.dex也超65535了,需要合并新的dex,那么名字就classes3.dex了。
继续操作
-
复制上边生成的classex2.dex文件到工程的src目录下
-
libs目录下删除用来合并的 jar 。
但是删除后为了能编译通过我们得使用外部引用:通过工程右键》 bulidPath 下的 add external archives 引用被我们合并的 all.jar -
找个mutildex包导入libs,这个就不要参与合并了。application里用到的不要合并
完事可以让application继承MultiDexApplication 或者在oncreate里调用multidex的install方法 -
测试
运行后正常安装到手机了,点了下,有个页面就挂了。其他页面正常。
看下出错的log,提示的是fragment$1找不到,点进去是下边的代码
看来上边合并的recyclerView的库没加载对啊
private RecyclerView.OnScrollListener mRecyclerViewOnScrollListener = new RecyclerView.OnScrollListener()
原因已经找到了并修改了,就是上边的classex.dex名字弄错了【写成了classex1.dex】,系统默认会把java文件打包成classex.dex,我们新加的需要从数字2开始,也就是classex2.dex
网友评论