Eclipise环境下什么处理方法数超过最大数

这个问题一直困扰了很久,然后一度有过念头想要转成as开发;最后在这快要过年的时候终于搞出来了;

我用的是ant 合并jar包的方法,

第一步把项目中的一些jar包合并成一个大的jar包:最好选那些不什么更新的jar包合并

ant合并的方法如下(直接从网上考的)附上链接:http://blog.csdn.net/gzl003csdn/article/details/53539133

多个jar包合并成一个jar 使用Apache的Ant是一个基于Java的生成工具。这个工具的全名是another neat tool    可以到官网下载 apache-ant-1.9.7-bin.zip

下载好了之后接下来就是 解压   配置环境   使用 

安装和配置

计算机>>>右键>>>属性>>>高级系统配置>>> 环境变量>>>

编辑系统变量

然后修改系统变量的path的值

然后一路确定回去  接下来就是测试一下是否配置成功!

Window + R 然后输入cmd  回车 >>> 在命令框中输入ant 如果提示如下就表示你已经成功的安装了

C:\Users\user>ant

Buildfile: build.xml does not exist!

Build failed

如图

OK >>>>>>>接下来开始使用

注意:ant默认运行build.xml文件,这个文件到目前为止是不存在的 需要我们创建。

如果不想命名为build.xml,运行时可以使用 ant -buildfile test.xml 命令指明要运行的构建文件。

注意:把你需要合并的jar包 和 build.xml 文件 放到同一个目录下面

build.xml 文件的格式如下

[html] view plain copy

  1. <?xml version="0" encoding="utf-8"?>  
  2. <project  
  3.     name="lzg_dlna"  
  4.     basedir="D:\Android\android_tool\ant_test"  
  5.     default="makeSuperJar" >  
  6.   
  7.     <target  
  8.         name="makeSuperJar"  
  9.         description="description" >  
  10.   
  11.         <jar destfile="lzg_dlna.jar" >  
  12.         <zipfileset src="cdi-api.jar" />  
  13.         <zipfileset src="http-2.2.1.jar" />  
  14.         <zipfileset src="httpclient-4.2.2.jar"/>  
  15.         <zipfileset src="httpcore-4.2.3.jar" />  
  16.         <zipfileset src="javax.annotation_1.0.jar" />  
  17.         <zipfileset src="javax.inject.jar" />  
  18.         <zipfileset src="javax.servlet-3.0.0.v201103241009.jar" />  
  19.         <zipfileset src="jetty-client-8.1.9.v20130131.jar" />  
  20.         <zipfileset src="jetty-continuation-8.1.9.v20130131.jar" />  
  21.         <zipfileset src="jetty-http-8.1.9.v20130131.jar" />  
  22.         <zipfileset src="jetty-io-8.1.9.v20130131.jar" />  
  23.         <zipfileset src="jetty-security-8.1.9.v20130131.jar" />  
  24.         <zipfileset src="jetty-server-8.1.9.v20130131.jar" />  
  25.         <zipfileset src="jetty-servlet-8.1.9.v20130131.jar" />  
  26.         <zipfileset src="jetty-util-8.1.9.v20130131.jar" />  
  27.         <zipfileset src="seamless-http-1.0-alpha2.jar" />  
  28.         <zipfileset src="seamless-util-1.0-alpha2.jar" />  
  29.         <zipfileset src="seamless-xml-1.0-alpha2.jar" />  
  30.         <zipfileset src="slf4j-api-1.6.1.jar" />  
  31.         <zipfileset src="slf4j-jdk14-1.6.1.jar" />  
  32.         </jar>  
  33.     </target>  
  34.   
  35. </project>  

name  : 表示的是你即将合成的jar包的名字 可以随便写

basedir :  表示你存放jar包的目录(D:\Android\android_tool\ant_test这个目录下放的是你当前需要合并的所有jar 和build.xml文件)

以上都转备好之后开始运行ant -buildfile命令

ant -buildfile D:\Android\android_tool\ant_test\build.xml

如下图

出现上图的时候就表示你已经合并成功了 去下面的目录找一下你的jar吧

D:\Android\android_tool\ant_test 

OK 合并成功  !  该有小伙伴问了 能不能用啊 这么简单就成功了 

接下开始把lzg_dlna.jar配置到项目里使用

如果你的instant run里面第一个选项是勾选的 运行会可能会报错 如果报错的话直接取消勾选

一般如果你的这个按钮是勾选的话运行就会报错

[html] view plain copy

  1. Error:注: 某些输入文件使用或覆盖了已过时的 API。  
  2. 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。  
  3. 注: 某些输入文件使用了未经检查或不安全的操作。  
  4. 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。  
  5. FAILURE: Build failed with an exception.  
  6.   
  7. * What went wrong:  
  8. Execution failed for task ':app:transformClassesWithInstantRunForDebug'.  
  9. > Invalid signature file digest for Manifest main attributes  
  10.   
  11. * Try:  
  12. Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output.  

如果是的话直接取消勾选在次运行就OK了

合并完成了

第二步:把合并的jar包通过下面的步骤转为apk文件(网上考的附上链接)http://blog.csdn.net/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

 

4、将libs.apk放入项目的assets文件夹下

 

5.将步骤1中的被分出的jar包从项目libs文件夹下删除,将合并后的jar包依照外部jar的方式引入项目,android.jar就是采用了此种依赖方式

 

        项目--右键--Build Path --Configure Build Path --- Libraries ---AddExternal JARs

 

6、在项目的Application中添加下面的方法

 

public class App extends Application {

 

    @Override

    public void onCreate() {

        super.onCreate();

        dexTool();

    }

 

    /**

     * Copy the following code and calldexTool() after super.onCreate() in

     * Application.onCreate()

     * <p>

     * This method hacks the defaultPathClassLoader and load the secondary dex

     * file as it's parent.

     */

    @SuppressLint("NewApi")

    private void dexTool() {

 

        File dexDir = newFile(getFilesDir(), "dlibs");

        dexDir.mkdir();

        File dexFile = newFile(dexDir, "libs.apk");

        File dexOpt = newFile(dexDir, "opt");

        dexOpt.mkdir();

        try {

           InputStream ins = getAssets().open("libs.apk");

           if (dexFile.length() != ins.available()) {

               FileOutputStream fos = new FileOutputStream(dexFile);

               byte[] buf = new byte[4096];

               int l;

               while ((l = ins.read(buf)) != -1) {

                   fos.write(buf, 0, l);

               }

               fos.close();

           }

           ins.close();

        } catch (Exception e) {

           throw new RuntimeException(e);

        }

 

        ClassLoader cl =getClassLoader();

        ApplicationInfo ai =getApplicationInfo();

        String nativeLibraryDir= null;

        if(Build.VERSION.SDK_INT > 8) {

           nativeLibraryDir = ai.nativeLibraryDir;

        } else {

           nativeLibraryDir = "/data/data/" + ai.packageName +"/lib/";

        }

        DexClassLoader dcl = newDexClassLoader(dexFile.getAbsolutePath(),

               dexOpt.getAbsolutePath(), nativeLibraryDir, cl.getParent());

 

        try {

           Field f = ClassLoader.class.getDeclaredField("parent");

           f.setAccessible(true);

           f.set(cl, dcl);

        } catch (Exception e) {

           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

如果还不行的话那么可以试试再增加manifestmerger.enabled=true这一句试试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值