2013-12-14 20 views
10

Ho alcuni problemi con l'applicazione Attività nativa. Funziona benissimo sul 99% dei dispositivi. Ma a volte gli utenti ottengono il seguente errore:Errore "Impossibile trovare la libreria nativa" nell'app Attività nativa

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

Non riesco a capire perché. L'app ha tutte le librerie necessarie nelle cartelle armeabi, armeabi-v7a e x86. Ed è stato testato su molti dispositivi con diverse architetture.

android: hasCode = "true" L'opzione esiste.

Inoltre ho notato che la maggior parte di questi dispositivi problematici ha una CPU Rockchip (RK3066, RK2928, RK2926). Ma non tutto. L'ultimo ha una CPU Huawei K3V2 e molta memoria libera. Un'altra app di attività native (non mia) non funziona anche sul dispositivo più recente.

+0

Qualche possibilità di ottenere i messaggi di registro subito prima dell'eccezione? Probabilmente c'è un messaggio di errore da 'dlopen()'. – fadden

+0

Ci proverò. Ma quale è il modo migliore per farlo? Ho sempre usato Log Collector con Android 2.3. Ma con le ultime versioni di Android il registro è molto breve per qualche motivo. Sembra che ci sia un limite di sistema per la dimensione del registro o così. – NightRadio

+0

Se un dispositivo non riesce a caricare la libreria, è riproducibile al 100%? –

risposta

4

Sarà necessario leggere l'output del logcat per vedere cosa è successo prima del crash, che ha impedito il caricamento della libreria nativa. Io uso Acra per le mie app (genera rapporti sugli arresti anomali contenenti l'output logcat), ma come soluzione rapida per ottenere l'output del logcat senza implementare un intero sistema di segnalazione degli arresti anomali, è possibile utilizzare qualcosa di simile in una build di test e farlo eseguire dall'utente :

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) {} 

Se si guarda alla source code for NativeActivty, questa eccezione che state vedendo si butta nel metodo onCreate() (vedi linea 171), quindi se si ignora che il metodo in una classe derivata di NativeActivity, si può prendere e prendi l'output logcat da lì. Quindi è possibile salvare il registro in un file e chiedere a un utente con un dispositivo interessato di eseguire il test e inviarlo via email, ad esempio.

Un'altra cosa buona dell'override di onCreate(), è anche la possibilità di riprodurre parte di ciò che accade dietro le quinte, con più registrazioni di debug per aiutarti a rintracciare il problema.

+2

Puoi anche trovare questo piccolo trucco utile, quando esegui il debug dei metodi sovrascritti di NativeActivity: http: // StackOverflow.it/a/8261608/1002212 – paulscode

+2

grazie! Finalmente funziona ora! Ma non riesco a capire perché :) Ho solo aggiunto questo codice alla classe principale (basata su NativeActivity): '@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); } ' – NightRadio