Ошибка "Не удается найти собственную библиотеку" в приложении "Нативная активность"

У меня есть некоторые проблемы с моей программой Native Activity. Он работает нормально на 99% устройств. Но иногда пользователи получают следующую ошибку:

java.lang.RuntimeException: Unable to start activity ComponentInfo{nightradio.sunvox/nightradio.sunvox.MyNativeActivity}: 
java.lang.IllegalArgumentException: Unable to find native library: sundog
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2070)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095)
at android.app.ActivityThread.access$600(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4830)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
...

Я не понимаю, почему. Приложение имеет все необходимые библиотеки в папках armeabi, armeabi-v7a и x86. И он был протестирован на многих устройствах с различными архитектурами.

android: hasCode = "true" .

Также я заметил, что большинство этих проблемных устройств имеет процессор Rockchip (RK3066, RK2928, RK2926). Но не все. У последнего есть процессор Huawei K3V2 и много свободной памяти. Другие приложения Native Activity (не мои) также не работают на последнем устройстве.

Ответ 1

Вам нужно будет прочитать вывод logcat, чтобы узнать, что произошло до сбоя, что помешало загрузке собственной библиотеки. Я использую Acra для своих приложений (генерирует отчеты о сбоях, содержащие вывод logcat), но как быстрое решение для получения вывода logcat без реализации целого система отчетов о сбоях, вы можете использовать что-то подобное в тестовой сборке и запустить ее пользователем:

try
{
    Process process = Runtime.getRuntime().exec( "logcat -d" );
    BufferedReader bufferedReader = new BufferedReader(
        new InputStreamReader( process.getInputStream() ) );
    StringBuilder log = new StringBuilder();
    String line = "";
    while( ( line = bufferedReader.readLine() ) != null ) {
        log.append( line );
    }
    // Output available via log.toString().. do whatever with it
} 
catch( IOException e ) {}

Если вы посмотрите исходный код для NativeActivty, это исключение, которое вы видите, бросается в метод onCreate() (см. строку 171), поэтому, если вы переопределите этот метод в производном классе NativeActivity, вы можете поймать его и извлечь из него вывод logcat. Затем вы можете сохранить журнал в файл и попросить пользователя с соответствующим устройством запустить тест и отправить вам файл электронной почты, например.

Еще одна хорошая вещь об переопределении onCreate() - это также позволит вам воспроизвести некоторые из того, что происходит за кулисами, с большим количеством протоколов отладки, которые помогут вам выявить проблему.