2015-04-24 2 views
7

У меня есть несколько проектов, которые я создаю для создания .aar. Затем я импортирую этот .aar в Android Studio под/libs. Файл build.gradle для этой зависимости выглядит следующим образом:Использование .aar NoClassDefFoundError Но класс существует и находится в Dexed

repositories{ 
    flatDir{ 
     dirs 'libs' 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.0.0' 
    compile 'com.google.android.gms:play-services:7.0.0' 
    compile 'com.android.support:multidex:+' 
    compile(name: 'customApi-debug', ext:'aar') 
} 

Поскольку библиотека является довольно большим я поставил multiDexEnabled = верно. Android Studio находит, что библиотека и автозаполнение работают. Строительные работы тоже хорошо, но работает приложение выдает следующую ошибку:

java.lang.NoClassDefFoundError: com.companyx.android.api.ui.vision.metaio.MetaIoView 
      at com.companyx.android.api.ui.vision.metaio.MetaIoView$$InjectAdapter.<init>(MetaIoView$$InjectAdapter.java:29) 

Я несжатое и разобрали .aar и Декс файлы, соответственно, и проверить, что классы его жалующихся на самом деле существует. Я пробовал существующие подходы к решению этой проблемы, но никто из них не работал.

Кто-нибудь еще испытал это? Заранее спасибо.

+0

Там может быть проверка ошибка с классом. Посмотрите журналы в logcat сразу после установки приложения, в то время как он odexed/oated, и посмотрите, есть ли какие-либо ошибки проверки для этого класса. – JesusFreke

+0

По всей видимости, во время установки не было ошибок. То, что я заметил, это то, что когда я нажимаю, чтобы перейти к Activity, который использует этот источник, я получаю I/art: Отклонение повторного инициализации в ранее не пройденном классе java.lang.Class несколько раз, прежде чем я получу свое исключение. –

+0

Да, это означает, что во время установки были некоторые ошибки проверки. Еще раз посмотрите на logcat во время установки :) – JesusFreke

ответ

4

Я столкнулся с тем же вопросом. Исправление заключается, во-первых, в том, чтобы развернуть файл AAR на локальный maven (я использовал плагин по адресу https://github.com/dcendents/android-maven-gradle-plugin). Затем я ссылался на местный maven, как описано в https://stackoverflow.com/a/23045791/2563009. И в конце концов я объявил зависимости с переходным вариантом, например:

dependencies { 
    compile('com.myapp.awesomelib:awesomelib:[email protected]') { 
    transitive = true 
    } 
} 

Ошибка исчезла бы тогда.

+0

приятный, его работающий штраф. долгое время сохранял мое время –

+0

Получил какое-либо объяснение по * почему * это работает? – tir38

+0

@ thuy-trinh Да, мне любопытно, почему тоже – draksia

0

Просто FYI, вы можете использовать более простой синтаксис, который действует слишком

compile 'com.myapp.awesomelib:awesomelib:0.0.1' 

Не забудьте опустить @aar вещь в конце имени библиотеки

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