2015-01-26 31 views
15

Ho due progetti A e B in cui B viene aggiunto come modulo del progetto A. Ho aggiunto dipendenze nel file di build Gradle di A. Ora posso importare la classe di B in A senza errori (nell'editor) ma non posso costruire. Preferenze è una classe di progetto di B.Impossibile trovare la classe di simboli in Android Studio

errore

file di generazione di un

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.0.0" 

    defaultConfig { 
     applicationId "com.example.A" 
     minSdkVersion 9 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:21.0.3' 
    compile project(':B') 
} 

file di generazione di B

import org.apache.tools.ant.taskdefs.condition.Os 

apply plugin: "android-library" 

android { 
    compileSdkVersion 18 
    buildToolsVersion "21.0.0" 

    defaultConfig { 
     minSdkVersion 9 
     targetSdkVersion 11 
    } 

    buildTypes { 
     release { 
      minifyEnabled true 
      proguardFiles 'proguard.cfg' 
     } 
    } 
    sourceSets.main { 
     jniLibs.srcDir 'src/main/jniLibs' 
     jni.srcDirs = [] //disable automatic ndk-build call 
    } 

    task ndkBuild(type: Exec) { 
     if (Os.isFamily(Os.FAMILY_WINDOWS)) { 
      commandLine 'ndk-build.cmd', '-C', file('src/main/jni').absolutePath 
     } else { 
      commandLine '/opt/adt-bundle-linux/android-ndk-r8e/ndk-build', '-C', file('src/main/jni').absolutePath 
     } 
     tasks.withType(JavaCompile) { 
      compileTask -> compileTask.dependsOn ndkBuild 
     } 
    } 

} 

dependencies { 
    compile 'com.android.support:support-v4:18.0.0' 
} 

posso costruire con successo il progetto (A), se rimuovi l'importazione.

risposta

3

Ho indicato il problema. TargetSdk version e support package version di due progetti non sono uguali. Dopo averli modificati con l'ultima versione, il mio problema è risolto.

10

Per me era un problema simile ma su proguard conf. proguard era attivo su una prima libreria e inattivo su un secondo.

Copia lo stesso proguard conf su tutto build.gradle ha risolto l'errore "Impossibile trovare la classe di simboli".

+3

Il mio problema era correlato - sotto buildTypes, "minifyEnabled" era impostato su "true" in un modulo e "false" nel modulo dell'app. L'ho impostato su false in entrambi e ora funziona. – BeccaP

1

Ho riscontrato questo errore quando ho aggiunto un nuovo modulo al mio progetto.

Per risolvere il problema, ho anche dovuto cambiare minSdkVersion, targetSdkVersion, buildToolsVersion, e compileSdkVersion modo che corrispondano al build.gradle nel mio modulo originale.

Dopo aver fatto queste cose, l'errore era ancora in arrivo, quindi ho impostato minifyEnabled su false e poi è stato compilato ed eseguito!

+0

È possibile impostare 'minifyEnabled' su' false' per farlo funzionare o mantenere 'minifyEnabled' impostato su' true' e correggere le regole proguard nel proprio file di configurazione proguard. –

+1

@Adil - come si impostano le regole corrette? – Fra

+0

@Fra - le regole differiscono per app e richiede una comprensione della sintassi delle regole Proguard. Non esiste un set di regole che funzioni per tutte le app. –

41

Può accadere se la libreria (sia essa un modulo locale o una dipendenza esterna) ha un minifyEnabled true, ma la configurazione di ProGuard della libreria è mancante o non corretta (la classe è idonea per la rimozione da ProGuard). Questo porta alla classe che non viene compilata.

+1

Osservazione superba. Saluto uomo! – Smeet

+0

come possiamo minimizzare la nostra libreria in questo caso? –

+2

In generale, la decisione se le classi della biblioteca devono essere ridotte deve essere lasciata al consumatore della biblioteca. Ma se devi forzare il minify della tua libreria puoi semplicemente impostare 'minifyEnabled true' ma devi essere sicuro che la tua configurazione di ProGuard non rimuova qualcosa di importante. Non sono sicuro che ciò possa essere garantito. ProGuard è sempre stato fonte di grattacapi "last-minute-before-release". – WindRider

Problemi correlati