2016-04-06 12 views
1

Ich begann Android-Entwicklung vor kurzem, so dass ich mich immer noch daran gewöhnen. Ich habe eine API gefunden, die ich in einer Android-App verwenden möchte. Ich fügte das externe Glas meinem libs-Ordner hinzu und stellte sicher, es als eine Bibliothek hinzuzufügen und kompilierte es in der build.gradle-Datei. Wenn ich gehe, um die App zu laufen bekomme ich einen Fehler während der gradle Build:Hinzufügen einer externen JAR mit mehr als 65K Methoden für Android-Anwendung

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 

Ich suchte online rund um und entdecken, war dies, weil mein äußerees Glas zu groß war, und enthielt mehr als die Grenze 65K Methoden. Ich habe versucht, viele verschiedene Lösungen zu finden, die ich online gefunden habe. Ich habe versucht, Multidexing und befolgte alle Anweisungen auf der offiziellen Android-Website. Hier ist meine 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') 
} 

Und auch meine AndroidManifest.xml geändert:

<?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> 

Ich habe nicht meine Anwendung Dateien java ändern MultiDexApplication zu erweitern, da ich nicht die Application-Klasse verwenden, aber MainActivity. Wie auch immer, das hat nicht funktioniert und ich habe den gleichen Fehler. Ich habe dann gelernt, dass ich ProGuard verwenden sollte, um mein Glas zu verkleinern, so dass alle nicht verwendeten Klassen und Methoden keine Probleme verursachen (zumindest habe ich das verstanden, korrigiere mich, wenn ich falsch liege). Also habe ich auch ProGuard wie auf der Android-Website angewiesen konfiguriert. Hier ist meine build.gradle:

apply plugin: 'com.android.application' 

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

dependencies { 
    ... 
} 

ich auch die proguard-rules.pro Datei bearbeitet, so dass es alle Klassen hält ich verwenden möchten:

# 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 *; 
#} 

Dies hat nicht funktioniert entweder, und ich bekam die gleiche Fehlermeldung .

Ich fühle mich wie ich muss etwas falsch gemacht haben beim Einrichten Proguard oder MultiDex. Wenn ich etwas falsch gemacht habe oder etwas vergessen habe, könnte mir jemand genau erklären, was ich tun sollte, um es zu reparieren? Wenn nicht, gibt es noch andere Möglichkeiten, wie ich die API verwenden kann, obwohl sie über mehr als 65K-Methoden verfügt? Vielen Dank: D

+1

Können Sie mit gradlew auf der Kommandozeile mit --debug und --stacktrace laufen die ausführlichsten Informationen des Fehlers zu bekommen? –

+0

Einzelheiten hier zur Verfügung gestellt konfigurieren multidex http://developer.android.com/tools/building/multidex.html – USKMobility

+1

diese Abhängigkeiten try { Kompilierung 'com.android.support:multidex:1.0.1' } –

Antwort

0

Sie müssen Multi-Dex aktivieren. Überprüfen Sie bitte die folgende Website, um weitere Informationen zu

http://developer.android.com/tools/building/multidex.html

How to enable multidexing with the new Android Multidex support library

+0

Viele der Lösungen, die ich online, einschließlich dieser, für multidex zu sehen scheinen stattdessen eine Application-Klasse von "MainActivity". Wie verwende ich eine Application-Klasse anstelle der Standard-MainActivity? – NeelZilla

+0

Ich bin nicht sicher, ob ich Ihre Frage verstanden, aber dies könnte das, was Sie suchen _ sein ... _ Überprüfen Sie auch die Hinweise. _Wenn Ihre App die Application-Klasse erweitert, können Sie die attachBaseContext() -Methode überschreiben und MultiDex.install (this) aufrufen, um Multidex zu aktivieren. Weitere Informationen finden Sie in der Referenzdokumentation zu MultiDexApplication._ – am110787

+0

Entschuldigung, wenn ich nicht klar war, wollte ich sagen, wie würde ich meine Application-Klasse erstellen, die die MultiDexApplication erweitern würde, und in welchem ​​Verzeichnis würde ich sie speichern? Ich habe den Java-Teil nie in einer Application-Klasse programmiert und habe immer alle Java-Sachen in der MainActivity-Klasse gemacht. – NeelZilla