Импортировать класс из сторонней библиотеки. Android Studio 3.1, Gradle 3.1

После обновления Android Studio и gradle до 3.1 я изменил все операторы compile на implementation. Но когда я создаю, студия Android не может разрешить импорт, найденный в сторонних библиотеках.

Сценарий: основные проекты импортируют подмодуль, который также импортирует файл jar.

Когда я пытаюсь импортировать класс из файла jar в основной проект, студия Android не может его разрешить.

Как я могу импортировать один файл, не добавляя файл jar в качестве зависимости в основной проект?


person Bubunyo Nyavor    schedule 03.04.2018    source источник
comment
используйте api вместо этого новый compile или имейте зависимость непосредственно в вашем основном проекте   -  person Nongthonbam Tonthoi    schedule 03.04.2018
comment
Я не понимаю. Используйте API где.   -  person Bubunyo Nyavor    schedule 03.04.2018
comment
изменить implementation на api   -  person Nongthonbam Tonthoi    schedule 03.04.2018
comment
это не сработало, плюс можно ли будет сделать это без повторного импорта всей библиотеки?   -  person Bubunyo Nyavor    schedule 03.04.2018
comment
@NongthonbamTonthoi понял это, хитрость заключается в том, чтобы изменить implementation импорта файла jar на api. Раньше я менял if для импорта модуля. Пожалуйста, добавьте это как ответ, чтобы я мог выбрать его как правильный ответ.   -  person Bubunyo Nyavor    schedule 03.04.2018


Ответы (3)


Вместо этого вы должны использовать api, это новый compile или иметь зависимость непосредственно в вашем основном проекте. Простое изменение implementation на api решит проблему, но вы рассматриваете возможность использования implementation везде, где это возможно, чтобы сократить время сборки.

Вы можете увидеть разницу между api и implemenation здесь.

person Nongthonbam Tonthoi    schedule 03.04.2018

Ответ @nongthonbam-tonthoi правильный, но он не объясняет почему.

Краткая версия

Реализация — скрыть эту зависимость от других модулей (которые зависят от этого модуля). если B зависит от A, он не может использовать никакое dep, объявленное в A с помощью implementation.

api — сделайте это доступным для других модулей, которые зависят от этого модуля. Например, если вы добавите GSON в качестве зависимости в модуль A, используя api, а не implementation, все другие модули, которые depend A может использовать GSON без повторного объявления.

Длинная версия

implementation — это способ объявления зависимостей только для данного модуля. Это означает, что зависимость может использоваться только в этом конкретном модуле. compile, с другой стороны, "утекает" зависимости в другие модули, поэтому вы можете импортировать и использовать классы, которые dep привносит в другие модули. Если вам нужно такое поведение, новый способ сделать это — использовать api.

Это изменение особенно нацелено на многомодульные проекты, поскольку оно может помочь Gradle избежать повторной компиляции модуля во время сборки, когда он не меняется.

Однако, если вы переходите из старого проекта, скорее всего, вы (ab) используете компиляцию для использования зависимостей, объявленных в других модулях, без явного объявления их снова.

Вы можете продолжать использовать compile, но помните, что он устарел и скоро будет удален.

Подробнее см. здесь.

person The-null-Pointer-    schedule 03.04.2018

Отредактируйте build.gradle (Module:app) и измените версию SDK на 27.1.1 Например:

defaultConfig {
        applicationId "com.projectname"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

implementation 'com.android.support:appcompat-v7:27.1.1'

и перестройте проект и перезапустите студию Android

person LEGEND MORTAL    schedule 06.04.2018