Внешний сервис Android из библиотеки (AAR, а не общий сервис)
Я пытаюсь создать библиотеку Android, содержащую простой сервис. Например:
public class BasicService extends Service {
public BasicService() {
Log.d("I", "work");
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
Я запускаю сервис следующим образом:
startService(new Intent(this, BasicService.class));
Служба компилируется в файл AAR, и после добавления этого в приложение я получаю исключение ClassNotFoundException.
Caused by: java.lang.ClassNotFoundException: Didn't find class "nl.company.example.library.Services.BasicService" on path: DexPathList[[zip file "/data/app/nl.example.aartest-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
Мне не нужно связывать сервис, так как приложение не должно связываться с сервисом. Мне также не нужен вспомогательный интерфейс, так как я не хочу делиться сервисом с другими приложениями. Я знаю, что мне нужно объявить службу на стороне приложения (не библиотеки), поэтому я сделал это следующим образом:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="nl.company.example.exampleApp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="19" />
<application
android:settings... >
<service
android:name="nl.company.example.library.Services.BasicService"
android:enabled="true"
android:exported="true" />
</application>
</manifest>
Это манифест моей библиотеки:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="nl.company.example.library" >
<application/>
</manifest>
Я провел некоторые исследования в Stackru/Google и не смог найти ответ на свою проблему.
Также пробовал разные способы запуска сервиса (в действии и т. Д.), Но пока ничего хорошего.
Любая помощь приветствуется и мои извинения, если я сделал злой дубликат вопрос.
1 ответ
BaseService реализовывал интерфейс из другой библиотеки, которая не была упакована с aar
файл. Это вызвало сбой приложения сразу после запуска на устройстве, поскольку оно не могло разрешить зависимость.
public class BaseService implements OtherLibraryInterface {
...
}
Вместо того, чтобы бросать ClassNotFoundException
для OtherLibraryInterface
Android будет выбрасывать именно это исключение для BaseService
, Что очень сбивает с толку и заставляет нас думать, что с Сервисом что-то не так.
Явное добавление зависимости OtherLibrary в качестве зависимости от основного приложения решило эту проблему.