2015-08-10 1 views
7

Я пытаюсь создать библиотеку Android, содержащую простой сервис. Например:Внешняя служба Android из библиотеки (AAR, а не общая служба)

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]] 

Мне не нужно связывать службу, так как приложение не должно связываться со службой. Мне также не нужен интерфейс helpl, так как я не хочу делиться сервисом с другими приложениями. Я знаю, что нужно объявить службу на стороне приложения (не библиотека), так что я сделал это следующим образом:

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

Я сделал некоторые исследования в Stackoverflow/Google, и я не смог найти ответ на свою проблему.

Android service in library

пытались также различные способы запуска службы (на действия и т.д.), но не хорошо до сих пор.

Вся помощь приветствуется, и мои извинения, если я сделал неправильный двойной вопрос.

+1

Существует несоответствие между вашим классом 'BasicService' и сервисом, который вы фактически запускаете' SimpleService'. Может, проблема? Просто попробовал это в тестовом репо и, кажется, работает нормально. Я не объявляю службу в манифесте моей библиотеки, но я объявляю ее в манифесте моего приложения. Я запускаю службу точно так же, как и вы, и включаю библиотеку через локальный аран. –

+0

Здравствуйте, jmols, извините, что это была ошибка, сделав анонимную проблему. Также добавлен манифест библиотек. Надеюсь, вы в состоянии помочь :) – jobbert

+0

Ваш код мне кажется правильным. Автозаполнение работает правильно? (Таким образом, мы уверены, что зависимость включена правильно.) Какую версию плагина Gradle вы используете? Я использую 'com.android.tools.build: gradle: 1.3.0'. –

ответ

5

В BaseService реализован интерфейс из другой библиотеки, которая не была упакована в файл aar. Это вызвало сбой приложения сразу после запуска на устройстве, поскольку оно не могло решить проблему зависимости.

public class BaseService implements OtherLibraryInterface { 
    ... 
} 

Вместо того, чтобы бросать ClassNotFoundException для OtherLibraryInterface, Android бы бросить именно это исключение для BaseService. Это очень смущает и заставляет нас думать, что с Сервисом что-то не так.

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

+1

Сохраненный мой день. Благодаря! – tarkeshwar

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