不能使用外部jar创建多个Android dex文件与Ant

我正在开发一个需要多个图书馆(适用于Facebook,Google Maps v2和Quickblox等)的Android应用程序,导致超过64K限制的方法金额溢出:

Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

因为我没有任何这些库,我找不到方法限制bug的解决方案。我发现了一个Android开发人员的热门博客文章,其中建议使用源代码部门。 (我在说的博客条目可以在这里找到:http://android-developers.blogspot.com.es/2011/07/custom-class-loading-in-dalvik.html)。我一直在尝试这个解决方案没有成功。

现在我遇到的问题是最大的代码不在我的应用程序本身,而是在所需的库中,所以我必须在我的应用程序中加载不同的dex文件之间传播这些库。我对Ant的知识是非常有限的,我想知道的是我应该在我的build.xml文件中写入,以使每个库都位于我想要的地方:

            <!-- Primary dex to include my source code and some libraries. -->
            <copy todir="${out.classes.absolute.dir}.1" >
                <fileset dir="${out.classes.absolute.dir}" >

                ...

                </fileset>
            </copy>


            <!-- Secondary dex to include some other libraries. -->
            <copy todir="${out.classes.absolute.dir}.2" >
                <fileset dir="${out.classes.absolute.dir}" >

                ...  

                </fileset>
            </copy>

任何帮助将真正的赞赏。提前感谢,恭候!

到目前为止,我听说过这个问题的最好的答案是使用ProGuard在优化模式(proguard-android-optimize.txt)中使用-dontobfuscate标志来从最终的APK中删除未使用的类和方法(而不会混淆它们)。然后,您可以使用ProGuard mapping.txt来帮助您将未使用的类从您使用的库JAR中删除(我不知道有一个很好的工具来执行此操作)。不幸的是我不认为ProGuard有一个功能可以自动执行。

ProGuard仅在Eclipse中执行导出时运行,而不是在执行Run As – > Android应用程序这意味着除非您使用自定义构建过程,否则它将无法避免调试版本的限制。 ProGuard的创建者建议使用其商业兄弟DexGuard,它将在Eclipse中运行在调试和发布版本上。

强烈建议使用ProGuard进行发布版本,因为它会减少代码大小,提高性能(例如通过内联代码),也会使您的源代码模糊。确保您对最终的APK进行足够的测试,因为它将与调试版本截然不同。不幸的是,ProGuard本身不足以解决我的问题,所以我删除了我的一个JAR依赖项作为解决方法。

我使用以下命令检查了我的依赖JAR中的方法数:

dx --dex --output=temp.dex library.jar
cat temp.dex | head -c 92 | tail -c 4 | hexdump -e '1/4 "%d\n"'

示例我们最大的图书馆的方法数量:

11222 guava-11.0.1.jar    
10452 aws-android-sdk-1.5.0-core.jar    
5761 org.restlet.jar    
5129 protobuf-java-2.4.1.jar    
2499 aws-android-sdk-1.5.0-s3.jar    
2024 ormlite-core-4.41.jar    
1145 gson-2.2.2.jar    
1716 google-http-client-1.11.0-beta.jar    

FYI,您可以使用dexdump检查您的APK中的方法数量(您可以在SDK build-tools文件夹中找到,例如“Android Studio.app/sdk/build-tools/21.0.2/dexdump”):

dexdump -f MyApp.apk | grep method_ids_size
method_ids_size     : 64295

在我们的例子中,我们只使用Guava进行YouTube搜索,所以很容易去除依赖关系,给我们更多的呼吸空间。

更新:我发现从大型JAR中删除未使用的代码的最简单方法是在Proguard构建上使用dex2jar,然后使用JD-GUI将最终的JAR与要修剪的特定输入JAR进行比较。然后我删除我知道的顶级包,被Proguard删除。这允许我从aws-android-sdk-1.5.0-core.jar中删除> 8000种方法。

http://stackoverflow.com/questions/16056442/cant-build-multiple-android-dex-files-with-ant-from-external-jars

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:不能使用外部jar创建多个Android dex文件与Ant