Использование класса зависимости библиотеки в приложении Android

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

Библиотечный проект:

public class UserDevice {
    private static final String TAG = "UserDevice";
    private static Context mContext;

    public UserDevice(final Context context) {
        mContext = context.getApplicationContext();
    }

    private static String getAdvertisementId(Context context) {
        String _myads = null;
        try {
            String id = com.google.android.gms.ads.identifier.AdvertisingIdClient.getAdvertisingIdInfo(context).getId();
            if (id != null) {
                _myads = id;
            }
        } catch (Exception e) {
            Log.e(TAG, "Could not get det ID.", e);
        }
        return _myads;
    }
}
//build.gradle
android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles 'consumer-rules.pro'
    }
...
}

dependencies {
    // default dependencies 
    // ...

    implementation 'com.google.android.gms:play-services-base:17.2.1'
    implementation 'com.google.android.gms:play-services-ads:19.0.1'
}

Проект приложения:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val device = UserDevice(this) //

        btn_show_ads.setOnClickListener {
            label_ads_id.text = device.myads
            Log.d("App", "Device Ads id is: ${device.myads}")
        }
    }
}
/// build.gradle
dependencies {
    // default dependencies 
    // ...
    compile(name: 'adslibrary', ext: 'aar')
    // compile project(path: ':adslibrary')
}

Но здесь произошло то, что он дает ошибку

2020-05-11 10:11:32.489 21925-21991/com.bhavdip.myadstest E/AndroidRuntime: FATAL EXCEPTION: Thread-2
    Process: com.bhavdip.myadstest, PID: 21925
    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/ads/identifier/AdvertisingIdClient;
        at com.bhavdip.adslibrary.CRDevice.getAdvertisementId(Unknown Source:2)
        at com.bhavdip.adslibrary.CRDevice$1.run(Unknown Source:4)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.ads.identifier.AdvertisingIdClient" on path: DexPathList[[zip file "/data/app/com.bhavdip.myadstest-fP-f0WbH8_ErVLG3QBcgkQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.bhavdip.myadstest-fP-f0WbH8_ErVLG3QBcgkQ==/lib/arm, /system/lib, /vendor/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)

Я уже добавил и использую зависимость gms:play-services-ads в библиотеке. Приложение снова просит меня принудительно добавить эти зависимости.

Если я добавлю зависимость в приложение, оно будет работать нормально, но я не хочу добавлять эту зависимость снова. Я не хочу раскрывать зависимость моей библиотеки конечному пользователю или разработчику. Добавляет приведенную ниже зависимость в my-library.

//For advertisement ID
implementation 'com.google.android.gms:play-services-ads:19.1.0'
implementation 'com.google.android.gms:play-services-base:17.2.1'

Справочные ссылки: я пробовал это и это тоже. Я также проверил все ответы в справочных ссылках.

Я пробовал multidex, transitive, а также менял implementation на api или compile. в таком проекте приложения.

// Use transitive
compile(name: 'adslibrary', ext: 'aar') {
    transitive = true
}

----- ИЗМЕНИТЬ Вопросы -----

  • Что такое transitive? Как это устроено?
  • Как multidex работает в библиотеке?

Я мог бы пропустить что-то изменить. Пожалуйста, помогите мне избавиться от этой проблемы.


person AndyBoy    schedule 30.04.2020    source источник
comment
понизить версию com.google.android.gms:play-services-ads:19.0.1   -  person IntelliJ Amiya    schedule 30.04.2020
comment
Я пытался, но не работал после понижения версии gms:play-services-ads до 19.0.1.   -  person AndyBoy    schedule 01.05.2020


Ответы (1)


Вы должны использовать api вместо реализации

api 'com.google.android.gms:play-services-ads:19.1.0'
api 'com.google.android.gms:play-services-base:17.2.1'

реализация и API

api - зависимость будет открыта для модуля, который использует эту библиотеку

implementation - зависимость будет разрешена только в этом модуле

transitive=false — пропустить api зависимости библиотечных модулей

person Vignesh Sundaramoorthy    schedule 04.05.2020
comment
@AndyBoy, кажется, этот вопрос удален, можете ли вы объяснить свою проблему, с которой вы столкнулись при использовании api в библиотечном модуле? - person Vignesh Sundaramoorthy; 06.05.2020
comment
У вас есть библиотека в качестве еще одного модуля в проекте приложения? - person Vignesh Sundaramoorthy; 06.05.2020
comment
compile project(':my-library') в приложении и в библиотеке, используя приведенную выше зависимость. Никакой другой модуль не добавил только файл aar из libs - person AndyBoy; 06.05.2020
comment
Есть два способа добавить библиотеку в качестве зависимости к вашему приложению, как указано в этом stackoverflow.com/a/49445004/5134215. Попробуйте первый способ и проверьте, правильно ли вы это сделали. - person Vignesh Sundaramoorthy; 06.05.2020
comment
Я добавил это правильно, так как он работает нормально, если я снова добавлю данную зависимость в приложение. - person AndyBoy; 06.05.2020
comment
Пожалуйста, посмотрите проблему еще раз, так как я отредактировал более подробную информацию с кодом - person AndyBoy; 07.05.2020
comment
Эй, я же говорил тебе использовать api вместо implementation в своей библиотеке build.gradle. У тебя все еще есть implementation? Пожалуйста, внимательно прочитайте мое решение и ссылку, которую я дал выше. - person Vignesh Sundaramoorthy; 07.05.2020
comment
Да, я тоже пробовал с api, но все равно вылетал при его использовании. Вы можете попробовать с данным проектом. - person AndyBoy; 08.05.2020
comment
Вы должны использовать api в библиотеке, если хотите открыть зависимость для приложения, попробуйте исправить сбой, который вы получаете, используя api, опубликуйте журнал сбоя здесь - person Vignesh Sundaramoorthy; 08.05.2020
comment
Я добавил журнал ошибок в описание проблемы. пожалуйста, загляните. - person AndyBoy; 11.05.2020
comment
Вы получаете сообщение об ошибке, почему используете api в библиотеке, верно? У вас был класс Application в вашем приложении? Попробуйте отключить мгновенный запуск и проверьте, правильно ли вы настроили мультидекс stackoverflow.com/q/43435658/5134215 stackoverflow.com/q/22399572/5134215 - person Vignesh Sundaramoorthy; 11.05.2020