java.lang.UnsatisfiedLinkError после обновления до Android 5.0

Я разрабатываю приложение для Android, в котором используется собственная библиотека liballjoyn_java.so (доступна здесь в Android Core SDK). Я использую Android Studio в качестве IDE и Maven в качестве системы сборки/зависимости (не Gradle). С Android KitKat все работало как часы, и вот как я добавил библиотеку в свой проект:

1) Добавил библиотеку в мой локальный репозиторий Maven.

mvn install:install-file -Dfile=./alljoyn/liballjoyn_java.so -DgroupId=org.alljoyn -DartifactId=liballjoyn_java -Dversion=14.06.00 -Dscope=runtime -Dpackaging=so

2) Определил зависимость в файле POM:

        <dependency>
            <groupId>org.alljoyn</groupId>
            <artifactId>liballjoyn_java</artifactId>
            <scope>runtime</scope>
            <type>so</type>
            <version>14.06.00</version>
        </dependency>

3) Вызывается статически из моего кода:

static {
    try {
        System.loadLibrary("alljoyn_java");
        Log.d("AllJoynManager", "static - Loaded AllJoyn native library");
    } catch (Exception exception) {
        Log.d("AllJoynManager", "static - Error loading AllJoyn native library");
        exception.printStackTrace();
    }
}

Это отлично работало под KitKat на моем телефоне Nexus 4, но теперь я установил официальное обновление Android 5.0 OTA и получил следующую ошибку во время выполнения:

11-28 17:57:39.988  30068-30068/com.avispalabs.kiihome E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.avispalabs.kiihome, PID: 30068
    java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.avispalabs.kiihome-2/base.apk"],nativeLibraryDirectories=[/data/app/com.avispalabs.kiihome-2/lib/arm, /vendor/lib, /system/lib]]] couldn't find "liballjoyn_java.so"
            at java.lang.Runtime.loadLibrary(Runtime.java:366)
            at java.lang.System.loadLibrary(System.java:989)
            at com.avispalabs.kiihome.helpers.network.alljoyn.AlljoynManager.<clinit>(AlljoynManager.java:38)
            at com.avispalabs.kiihome.ui.activities.MainActivity.<init>(MainActivity.java:38)
            at java.lang.reflect.Constructor.newInstance(Native Method)
            at java.lang.Class.newInstance(Class.java:1572)
            at android.app.Instrumentation.newActivity(Instrumentation.java:1065)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
11-28 17:57:55.432  30068-30068/com.avispalabs.kiihome I/Process﹕ Sending signal. PID: 30068 SIG: 9

Я подозреваю, что библиотека .so могла быть скомпилирована каким-то образом, несовместимым с новым ART Android 5.0 (?). Сообщение о том, что не удается найти библиотеку, вероятно, вводит в заблуждение (исключение также наблюдается, когда библиотека не загружается), но я не уверен (другая возможность заключается в том, что .so неправильно извлечен или размещен).

Библиотека поставляется предварительно скомпилированной и рекламируется как совместимая с JellyBean. Я думал, что предыдущие динамические библиотеки будут совместимы с новыми версиями Android, иначе многие приложения будут ломаться. Если я устанавливаю тот же APK в Nexus 4 с KitKat, он просто работает.

Любой совет высоко ценится.

ОБНОВЛЕНИЕ: я протестировал свой проект на устройстве на базе KitKat и переключил среду выполнения на ART, а не на Dalvik, и проект работает нормально. Эта проблема, похоже, связана с Android 5, а не с самим ART.


person German    schedule 28.11.2014    source источник
comment
Если я установлю тот же APK на Nexus 4 с помощью KitKat, он просто заработает — вы включили ART в параметрах разработчика на Nexus 4? Если нет, попробуйте это. ART — наиболее вероятный виновник, и вам потребуется обновленная библиотека: developer.android.com/guide/practices/verifying-apps-art.html   -  person CommonsWare    schedule 28.11.2014
comment
Вы имеете в виду, что включение ART на Nexus 4 с KitKat должно вызвать эту проблему, если виновником является ART? Я мог бы проверить это и посмотреть, что произойдет...   -  person German    schedule 28.11.2014
comment
Вы имеете в виду, что включение ART на Nexus 4 с KitKat должно вызвать эту проблему, если виновником является ART? -- да. Теперь сам ART, вероятно, изменился между версиями 4.4 и 5.0, так что вполне возможно, что проблема связана именно с ART 5.0. Но если ваше приложение работает на 4.4 с Dalvik и не работает на 4.4 с ART, это довольно положительный признак того, что проблема связана с ART.   -  person CommonsWare    schedule 28.11.2014
comment
Привет @CommonsWare. Я попробовал ваше предложение, и при переключении устройства KitKat на использование ART из настроек разработчика библиотека все еще работает. Таким образом, похоже, что виноват не ART, а скорее Android 5.0. Поскольку библиотека работает под ART, это может быть связано с расположением библиотеки. Любое дополнительное предложение?   -  person German    schedule 30.11.2014
comment
Любое дополнительное предложение? -- думаю, поговори с ребятами из AllJoyn. Здесь, на SO, есть только 44 вопроса с тегом alljoyn, поэтому, надеюсь, есть какая-то другая доска поддержки AllJoyn, которая может быть более полезной.   -  person CommonsWare    schedule 30.11.2014
comment
Да, сделано! Спасибо ask.allseenalliance.org/question/ 1619/   -  person German    schedule 30.11.2014


Ответы (1)


Отвечая на мой собственный вопрос здесь. Вы можете решить эту проблему, скомпилировав liballjoyn_java как PIE, как описано здесь:

https://jira.allseenalliance.org/browse/ASACORE-1208

Это обходной путь, пока ребята из AllJoyn не опубликуют новую сборку Android. Следите за обновлениями здесь:

https://build.allseenalliance.org/ci/view/Core%20RB14.12%20SDK/job/branch-android-sdk/

person German    schedule 03.12.2014