为Android应用程序添加超过65K方法的外部JAR

时间:2016-04-06 05:09:27

标签: java android gradle proguard multidex

我最近开始进行Android开发,所以我仍然习惯了它。我找到了一个我想在Android应用中使用的API。我将外部jar添加到我的libs文件夹中,并确保将其添加为库并在build.gradle文件中进行编译。当我去运行应用程序时,我在gradle构建过程中遇到错误:

Error:Execution failed for task ':app:preDexDebug'.
> com.android.ide.common.process.ProcessException:
org.gradle.process.internal.ExecException: Process 'command 'C:\Program
Files\Java\jdk1.7.0_51\bin\java.exe'' finished with non-zero exit value 1

我在网上搜索并发现这是因为我的外部jar太大了,并且包含超过65K方法的限制。我试过在网上找到很多不同的解决方案。我尝试了多索引并遵循官方Android网站上的所有说明。这是我的build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        ...
        multiDexEnabled true
    }
    buildTypes {
        ...
    }
}

dependencies {
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:multidex:1.0.0'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile files('libs/my-external-jar.jar')
}

还改变了我的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myapp.app" >
    ...
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        <activity
            ...
        </activity>
    </application>
</manifest>

我没有更改我的应用程序java文件以扩展MultiDexApplication,因为我没有使用Application类,而是使用MainActivity。无论如何,这没有用,我得到了同样的错误。然后我了解到我应该使用ProGuard来缩小我的罐子,这样所有未使用的类和方法都不会引起问题(至少那是我对它的理解,请纠正我,如果我和# 39;我错了)。所以我还按照Android网站上的说明配置了ProGuard。这是我的build.gradle

apply plugin: 'com.android.application'

android {
    ...
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
            'proguard-rules.pro'
        }
    }
}

dependencies {
    ...
}

我还编辑了proguard-rules.pro文件,以便保留我计划使用的所有类:

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\neelz_000\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

-keep public class com.myexternalapi.Class1
-keep public class com.myexternalapi.Class2
-keep public class com.myexternalapi.Class3

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

这也不起作用,我得到了同样的错误信息。

我觉得在设置ProguardMultiDex时我一定做错了。如果我确实做错了什么或忘记了什么,有人可以解释我应该做些什么来解决它?如果没有,有没有其他方法可以使用API​​,即使它有超过65K的方法?谢谢:D

1 个答案:

答案 0 :(得分:0)