这个问题一直困扰了很久,然后一度有过念头想要转成as开发;最后在这快要过年的时候终于搞出来了;
第一步把项目中的一些jar包合并成一个大的jar包:最好选那些不什么更新的jar包合并
ant合并的方法如下(直接从网上考的)附上链接:http://blog.youkuaiyun.com/gzl003csdn/article/details/53539133
多个jar包合并成一个jar 使用Apache的Ant是一个基于Java的生成工具。这个工具的全名是another neat tool 可以到官网下载 apache-ant-1.9.7-bin.zip
计算机>>>右键>>>属性>>>高级系统配置>>> 环境变量>>>
Window + R 然后输入cmd 回车 >>> 在命令框中输入ant 如果提示如下就表示你已经成功的安装了
Buildfile: build.xml does not exist!
注意:ant默认运行build.xml文件,这个文件到目前为止是不存在的 需要我们创建。
如果不想命名为build.xml,运行时可以使用 ant -buildfile test.xml 命令指明要运行的构建文件。
注意:把你需要合并的jar包 和 build.xml 文件 放到同一个目录下面
[html] view plain copy
- <?xml version="0" encoding="utf-8"?>
- <project
- name="lzg_dlna"
- basedir="D:\Android\android_tool\ant_test"
- default="makeSuperJar" >
- <target
- name="makeSuperJar"
- description="description" >
- <jar destfile="lzg_dlna.jar" >
- <zipfileset src="cdi-api.jar" />
- <zipfileset src="http-2.2.1.jar" />
- <zipfileset src="httpclient-4.2.2.jar"/>
- <zipfileset src="httpcore-4.2.3.jar" />
- <zipfileset src="javax.annotation_1.0.jar" />
- <zipfileset src="javax.inject.jar" />
- <zipfileset src="javax.servlet-3.0.0.v201103241009.jar" />
- <zipfileset src="jetty-client-8.1.9.v20130131.jar" />
- <zipfileset src="jetty-continuation-8.1.9.v20130131.jar" />
- <zipfileset src="jetty-http-8.1.9.v20130131.jar" />
- <zipfileset src="jetty-io-8.1.9.v20130131.jar" />
- <zipfileset src="jetty-security-8.1.9.v20130131.jar" />
- <zipfileset src="jetty-server-8.1.9.v20130131.jar" />
- <zipfileset src="jetty-servlet-8.1.9.v20130131.jar" />
- <zipfileset src="jetty-util-8.1.9.v20130131.jar" />
- <zipfileset src="seamless-http-1.0-alpha2.jar" />
- <zipfileset src="seamless-util-1.0-alpha2.jar" />
- <zipfileset src="seamless-xml-1.0-alpha2.jar" />
- <zipfileset src="slf4j-api-1.6.1.jar" />
- <zipfileset src="slf4j-jdk14-1.6.1.jar" />
- </jar>
- </target>
- </project>
name : 表示的是你即将合成的jar包的名字 可以随便写
basedir : 表示你存放jar包的目录(D:\Android\android_tool\ant_test这个目录下放的是你当前需要合并的所有jar 和build.xml文件)
ant -buildfile D:\Android\android_tool\ant_test\build.xml
出现上图的时候就表示你已经合并成功了 去下面的目录找一下你的jar吧
D:\Android\android_tool\ant_test
OK 合并成功 ! 该有小伙伴问了 能不能用啊 这么简单就成功了
如果你的instant run里面第一个选项是勾选的 运行会可能会报错 如果报错的话直接取消勾选
[html] view plain copy
- Error:注: 某些输入文件使用或覆盖了已过时的 API。
- 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
- 注: 某些输入文件使用了未经检查或不安全的操作。
- 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
- FAILURE: Build failed with an exception.
- * What went wrong:
- Execution failed for task ':app:transformClassesWithInstantRunForDebug'.
- > Invalid signature file digest for Manifest main attributes
- * Try:
- Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output.
第二步:把合并的jar包通过下面的步骤转为apk文件(网上考的附上链接)http://blog.youkuaiyun.com/lxlyhm/article/details/52608190
1、将可以分到第二个包的jar文件利用ant合并为一个jar包,如libs.jar。对ant不熟悉的同学也可以采用手动方式合并jar文件,将要合并的jar文件解压到同一目录下,然后将该目录压缩成libs.zip,再重命名为libs.jar
2、使用Android SDK提供的dx工具将libs.jar转换为dex文件,命名为classes.dex。
dx工具可以在Android SDK下找到,如\SDK\build-tools\23.0.1\dx.bat
打开命令行工具,进入到dx.bat所在的目录下,执行命令 如:dx --dex --output=D:\test\classes.dex D:\test\libs.jar
D:\test\classes.dex为打包生成的dex文件的目标路径,D:\test\libs.jar为jar文件的路径
3、将上一步打包生成的classes.dex添加为压缩文件libs.zip, 然后重命名为libs.apk
5.将步骤1中的被分出的jar包从项目libs文件夹下删除,将合并后的jar包依照外部jar的方式引入项目,android.jar就是采用了此种依赖方式
项目--右键--Build Path --Configure Build Path --- Libraries ---AddExternal JARs
public class App extends Application {
* Copy the following code and calldexTool() after super.onCreate() in
* This method hacks the defaultPathClassLoader and load the secondary dex
File dexDir = newFile(getFilesDir(), "dlibs");
File dexFile = newFile(dexDir, "libs.apk");
File dexOpt = newFile(dexDir, "opt");
InputStream ins = getAssets().open("libs.apk");
if (dexFile.length() != ins.available()) {
FileOutputStream fos = new FileOutputStream(dexFile);
while ((l = ins.read(buf)) != -1) {
throw new RuntimeException(e);
ClassLoader cl =getClassLoader();
ApplicationInfo ai =getApplicationInfo();
String nativeLibraryDir= null;
if(Build.VERSION.SDK_INT > 8) {
nativeLibraryDir = ai.nativeLibraryDir;
nativeLibraryDir = "/data/data/" + ai.packageName +"/lib/";
DexClassLoader dcl = newDexClassLoader(dexFile.getAbsolutePath(),
dexOpt.getAbsolutePath(), nativeLibraryDir, cl.getParent());
Field f = ClassLoader.class.getDeclaredField("parent");
throw new RuntimeException(e);
注:Application 中的静态全局变量会比MutiDex的 instal()方法优先加载,所以建议避免在 Application类中使用引用classes.dex文件的静态变量
Cannot merge new index 66375 into a non-jumbo instruction!
这个错误并不是方法数超过的问题,只要在你的project.properties文件中增加一句配置:dex.force.jumbo=true