2015-01-26 2 views
15

У меня есть два проекта A и B, где B добавлен как модуль проекта A. Я добавил зависимости в файл сборки A Gradle. Теперь я могу импортировать класс B в A без какой-либо ошибки (в редакторе), но не могу построить. Предпочтения класс проекта Б.Не удается найти класс символов в Android Studio

Ошибка

файл построить в

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') 
} 

файл сборки Б

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' 
} 

Я могу успешно построить проект (A), если удалите импорт.

ответ

3

Я указал на проблему. TargetSdk version и support package version двух проектов не одинаковы. После изменения их с последней версией моя проблема решена.

10

Для меня это была аналогичная проблема, но на proguard conf. proguard был активен в первой библиотеке и неактивен на секунду.

Копию того же proguard conf на все build.gradle решила ошибку «не могу найти символ класса».

+3

Моя проблема была связана - в buildTypes «minifyEnabled» было установлено значение «true» в одном модуле и «false» в модуле приложения. Я установил его в false, и теперь он работает. – BeccaP

1

У меня возникла эта ошибка, когда я добавил новый модуль в свой проект.

Чтобы исправить это, я должен был изменить minSdkVersion, targetSdkVersion, buildToolsVersion и compileSdkVersion соответствовать build.gradle в моем оригинальном модуле.

После того, как я сделал это, ошибка все еще возникала, поэтому я установил minifyEnabled в false, а затем он скомпилирован и запущен!

+0

Вы можете установить 'minifyEnabled' в' false', чтобы запустить его или сохранить 'minifyEnabled' значение' true' и исправить правила proguard в вашем файле конфигурации proguard. –

+1

@Adil - как установить правильные правила? – Fra

+0

@Fra - правила отличаются для каждого приложения и требуют понимания синтаксиса правил Proguard. Существует не один набор правил, который работает для всех приложений. –

41

Это может произойти, если библиотека (будь то локальный модуль или внешняя зависимость) имеет minifyEnabled true, но отсутствует конфигурация ProGuard в библиотеке или нет (класс имеет право на удаление с помощью ProGuard). Это приводит к тому, что класс не компилируется.

+1

Превосходное наблюдение. Салют! – Smeet

+0

как мы можем минимизировать нашу библиотеку в этом случае? –

+2

Вообще говоря, решение, если классы библиотеки должны быть минимизированы, должно быть оставлено потребителю библиотеки. Но если вам нужно принудительно минимизировать свою библиотеку, вы можете просто установить «minifyEnabled true», но вы должны быть уверены, что ваша конфигурация ProGuard не удаляет что-то важное. Я не совсем уверен, что это может быть гарантировано. ProGuard всегда был источником головных болей «с последней минуты до релиза». – WindRider

Смежные вопросы