todas sigue servicios responde porque play ninguna las google funcionar funciona fallando detienen continua celular aplicaciones aplicacion abre android android-ndk

sigue - Aplicación de Android se bloquea de repente mientras se ejecuta?



servicios de google play sigue sin funcionar (5)

¿Qué hace mi aplicación? La aplicación que estoy desarrollando es una aplicación de servidor cliente típica que se comunica con un servidor de Windows mediante Wifi. La aplicación tiene múltiples actividades y realmente tiene una gran cantidad de memoria y requisitos de CPU, es decir, llamadas nativas para la codificación / decodificación de speex.

¿Cuál es mi problema? El problema es que la aplicación se reinicia repentinamente mientras funciona absolutamente bien. A veces, mientras trabajo normalmente, veo repentinamente (en logcat) que se llama a la clase Constructor de aplicación (clase que extiende la clase de aplicación de API). Eso bloquea mi aplicación ya que todos los datos globales se almacenan con la clase de la aplicación en sí.

Que he hecho ? Lo primero que me llamó la atención fue que Android puede sentir que tiene poca memoria, por lo que finaliza mi aplicación y luego la reinicia automáticamente. Así que implementé onLowMemory() de la clase Application. Pero para mi sorpresa nunca se llama ..

¿Cuál es el principal problema? El principal problema es que Nothing is printed on LogCat . Parece que incluso el propio Android no tiene ni idea de por qué reinició mi aplicación que ya está en ejecución.

¿Cuál podría ser la posible razón de este reinicio repentino? ¿Cómo puedo evitar eso?

Estoy trabajando en Galaxy Y, y la versión API es 2.3.6. Mi AndroidManifiest.xml parece

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.argusoft.roobrooAndroid" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:maxSdkVersion="15" android:minSdkVersion="10" android:targetSdkVersion="10" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_VIDEO" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <application android:name="some.package.MyApp" android:icon="@drawable/display_image" android:label="@string/app_name" > <activity android:name="some.package.LoginActivity" android:configChanges="keyboardHidden|orientation" android:label="@string/app_name" android:screenOrientation="user" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="some.package.BuddyListActivity" android:configChanges="keyboardHidden|orientation" android:label="@string/app_name" android:screenOrientation="user" android:theme="@android:style/Theme.Black.NoTitleBar" > <!-- <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> --> </activity> <activity android:name="some.package.SessionWindowActivity" android:configChanges="keyboardHidden|orientation" android:label="@string/app_name" android:screenOrientation="user" android:theme="@android:style/Theme.Black.NoTitleBar" > <!-- <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> --> </activity> </application> </manifest>

EDITAR Acabo de ver la siguiente salida en LogCat después de usar CheckJNI,

06-26 17:27:30.023: I/remove(24544): Sending Signal : 13 **//App Working fine here** 06-26 17:27:32.148: D/dalvikvm(24544): GC_CONCURRENT freed 446K, 49% free 3384K/6599K, external 1057K/1076K, paused 3ms+4ms 06-26 17:27:39.531: W/dalvikvm(24544): **HeapWorker may be wedged: 7374ms spent** inside LsomePackageName/modules/AudioPlayer;.finalize()V 06-26 17:27:40.023: I/remove(24544): Sending Signal : 13 06-26 17:27:40.218: D/dalvikvm(24544): GC_CONCURRENT freed 479K, 49% free 3383K/6599K, external 1057K/1076K, paused 9ms+5ms 06-26 17:27:42.343: E/RoobrooApp(24670): Application Instance created **//Restarted** 06-26 17:27:42.351: I/ApplicationPackageManager(24670): cscCountry is not German : INS

ACTUALIZACIÓN Mientras experimentaba más en un paso, intencionalmente asigné una memoria muy grande para una doble matriz. Pero para mi sorpresa, ni onLowMemory () llamó ni la aplicación se reinició, sino que obtuve la excepción OutMemoryException. Si nunca se llama onLowMemory (), ¿por qué está ahí?

Un problema más es que después de reiniciar, el sistema operativo ya inicia BuddyListActivity en lugar de LoginActivity ... La ayuda realmente se necesita ...

ACTUALIZACIÓN 2 Acabo de ver el siguiente registro de errores, realmente no sé lo que eso significa ...

06-29 12:07:28.398: W/dalvikvm(19308): ReferenceTable overflow (max=1024) 06-29 12:07:28.398: W/dalvikvm(19308): Last 10 entries in JNI pinned array reference table: 06-29 12:07:28.398: W/dalvikvm(19308): 1014: 0x405b0280 cls=[B (340 bytes) 06-29 12:07:28.398: W/dalvikvm(19308): 1015: 0x405b03d8 cls=[S (660 bytes) 06-29 12:07:28.398: W/dalvikvm(19308): 1016: 0x405d8208 cls=[B (340 bytes) 06-29 12:07:28.398: W/dalvikvm(19308): 1017: 0x405d8360 cls=[S (660 bytes) 06-29 12:07:28.398: W/dalvikvm(19308): 1018: 0x405f8b08 cls=[B (340 bytes) 06-29 12:07:28.398: W/dalvikvm(19308): 1019: 0x405f8c60 cls=[S (660 bytes) 06-29 12:07:28.398: W/dalvikvm(19308): 1020: 0x405f8ef8 cls=[B (340 bytes) 06-29 12:07:28.398: W/dalvikvm(19308): 1021: 0x405ff698 cls=[S (660 bytes) 06-29 12:07:28.398: W/dalvikvm(19308): 1022: 0x405f9050 cls=[B (340 bytes) 06-29 12:07:28.398: W/dalvikvm(19308): 1023: 0x405ff930 cls=[S (660 bytes) 06-29 12:07:28.398: W/dalvikvm(19308): JNI pinned array reference table summary (1024 entries): 06-29 12:07:28.398: W/dalvikvm(19308): 1 of [B 20B 06-29 12:07:28.398: W/dalvikvm(19308): 508 of [B 340B (508 unique) 06-29 12:07:28.398: W/dalvikvm(19308): 3 of [B 348B (3 unique) 06-29 12:07:28.406: W/dalvikvm(19308): 511 of [S 660B (511 unique) 06-29 12:07:28.406: W/dalvikvm(19308): 1 of [S 668B 06-29 12:07:28.406: W/dalvikvm(19308): Memory held directly by tracked refs is 511712 bytes 06-29 12:07:28.406: E/dalvikvm(19308): Failed adding to JNI pinned array ref table (1024 entries) 06-29 12:07:28.406: I/dalvikvm(19308): "Thread-14" prio=5 tid=12 RUNNABLE 06-29 12:07:28.406: I/dalvikvm(19308): | group="main" sCount=0 dsCount=0 obj=0x4050e548 self=0x2240b8 06-29 12:07:28.406: I/dalvikvm(19308): | sysTid=19953 nice=-19 sched=0/0 cgrp=[fopen-error:2] handle=1905240 06-29 12:07:28.406: I/dalvikvm(19308): | schedstat=( 207153329 82244881 1015 ) 06-29 12:07:28.406: I/dalvikvm(19308): at com.argusoft.roobrooAndroid.speex.SpeexEncoder.encode(Native Method) 06-29 12:07:28.406: I/dalvikvm(19308): at com.argusoft.roobrooAndroid.speex.SpeexEncoder.encodeFrame(SpeexEncoder.java:51) 06-29 12:07:28.406: I/dalvikvm(19308): at com.argusoft.roobrooAndroid.models.Session.capturedAudioReceived(Session.java:656) 06-29 12:07:28.406: I/dalvikvm(19308): at com.argusoft.roobrooAndroid.modules.AudioCapturer.run(AudioCapturer.java:118) 06-29 12:07:28.406: I/dalvikvm(19308): at java.lang.Thread.run(Thread.java:1019) 06-29 12:07:28.406: E/dalvikvm(19308): VM aborting 06-29 12:07:29.726: W/AudioTrack(19308): obtainBuffer() track 0x1d3520 disabled, restarting 06-29 12:07:30.351: W/dalvikvm(19308): threadid=4: spin on suspend #1 threadid=1 (pcf=0) 06-29 12:07:30.898: W/AudioTrack(19308): obtainBuffer() track 0x1d3520 disabled, restarting 06-29 12:07:31.101: W/dalvikvm(19308): threadid=4: spin on suspend #2 threadid=1 (pcf=0) 06-29 12:07:31.101: I/dalvikvm(19308): "Signal Catcher" daemon prio=5 tid=4 RUNNABLE 06-29 12:07:31.101: I/dalvikvm(19308): | group="system" sCount=0 dsCount=0 obj=0x40510490 self=0x159898 06-29 12:07:31.101: I/dalvikvm(19308): | sysTid=19312 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1575600 06-29 12:07:31.101: I/dalvikvm(19308): | schedstat=( 1556395 4913328 26 ) 06-29 12:07:31.101: I/dalvikvm(19308): at dalvik.system.NativeStart.run(Native Method) 06-29 12:07:31.101: I/dalvikvm(19308): "main" prio=5 tid=1 RUNNABLE 06-29 12:07:31.101: I/dalvikvm(19308): | group="main" sCount=1 dsCount=0 obj=0x40022198 self=0xcec8 06-29 12:07:31.101: I/dalvikvm(19308): | sysTid=19308 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1345006496 06-29 12:07:31.101: I/dalvikvm(19308): | schedstat=( 5364166234 3306213349 13647 ) 06-29 12:07:31.101: I/dalvikvm(19308): at android.media.AudioTrack.native_write_short(Native Method) 06-29 12:07:31.101: I/dalvikvm(19308): at android.media.AudioTrack.write(AudioTrack.java:943) 06-29 12:07:31.101: I/dalvikvm(19308): at com.argusoft.roobrooAndroid.modules.AudioPlayer.onPeriodicNotification(AudioPlayer.java:163) 06-29 12:07:31.101: I/dalvikvm(19308): at android.media.AudioTrack$NativeEventHandlerDelegate$1.handleMessage(AudioTrack.java:1084) 06-29 12:07:31.101: I/dalvikvm(19308): at android.os.Handler.dispatchMessage(Handler.java:99) 06-29 12:07:31.101: I/dalvikvm(19308): at android.os.Looper.loop(Looper.java:130) 06-29 12:07:31.101: I/dalvikvm(19308): at android.app.ActivityThread.main(ActivityThread.java:3687) 06-29 12:07:31.101: I/dalvikvm(19308): at java.lang.reflect.Method.invokeNative(Native Method) 06-29 12:07:31.101: I/dalvikvm(19308): at java.lang.reflect.Method.invoke(Method.java:507) 06-29 12:07:31.101: I/dalvikvm(19308): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 06-29 12:07:31.101: I/dalvikvm(19308): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 06-29 12:07:31.101: I/dalvikvm(19308): at dalvik.system.NativeStart.main(Native Method) 06-29 12:07:31.851: W/dalvikvm(19308): threadid=4: spin on suspend #3 threadid=1 (pcf=0) 06-29 12:07:31.851: I/dalvikvm(19308): "Signal Catcher" daemon prio=5 tid=4 RUNNABLE 06-29 12:07:31.851: I/dalvikvm(19308): | group="system" sCount=0 dsCount=0 obj=0x40510490 self=0x159898 06-29 12:07:31.851: I/dalvikvm(19308): | sysTid=19312 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1575600 06-29 12:07:31.851: I/dalvikvm(19308): | schedstat=( 2868652 6927485 37 ) 06-29 12:07:31.851: I/dalvikvm(19308): at dalvik.system.NativeStart.run(Native Method) 06-29 12:07:31.851: I/dalvikvm(19308): "main" prio=5 tid=1 RUNNABLE 06-29 12:07:31.851: I/dalvikvm(19308): | group="main" sCount=1 dsCount=0 obj=0x40022198 self=0xcec8 06-29 12:07:31.851: I/dalvikvm(19308): | sysTid=19308 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1345006496 06-29 12:07:31.851: I/dalvikvm(19308): | schedstat=( 5364166234 3306213349 13647 ) 06-29 12:07:32.000: I/dalvikvm(19308): at android.media.AudioTrack.native_write_short(Native Method) 06-29 12:07:32.015: I/dalvikvm(19308): at android.media.AudioTrack.write(AudioTrack.java:943) 06-29 12:07:32.031: I/dalvikvm(19308): at com.argusoft.roobrooAndroid.modules.AudioPlayer.onPeriodicNotification(AudioPlayer.java:163) 06-29 12:07:32.039: I/dalvikvm(19308): at android.media.AudioTrack$NativeEventHandlerDelegate$1.handleMessage(AudioTrack.java:1084) 06-29 12:07:32.054: I/dalvikvm(19308): at android.os.Handler.dispatchMessage(Handler.java:99) 06-29 12:07:32.054: I/dalvikvm(19308): at android.os.Looper.loop(Looper.java:130) 06-29 12:07:32.062: W/AudioTrack(19308): obtainBuffer() track 0x1d3520 disabled, restarting 06-29 12:07:32.070: I/dalvikvm(19308): at android.app.ActivityThread.main(ActivityThread.java:3687) 06-29 12:07:32.093: I/dalvikvm(19308): at java.lang.reflect.Method.invokeNative(Native Method) 06-29 12:07:32.101: I/dalvikvm(19308): at java.lang.reflect.Method.invoke(Method.java:507) 06-29 12:07:32.109: I/dalvikvm(19308): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 06-29 12:07:32.125: I/dalvikvm(19308): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 06-29 12:07:32.132: I/dalvikvm(19308): at dalvik.system.NativeStart.main(Native Method) 06-29 12:07:32.890: W/dalvikvm(19308): threadid=4: spin on suspend #4 threadid=1 (pcf=0) 06-29 12:07:32.890: I/dalvikvm(19308): "Signal Catcher" daemon prio=5 tid=4 RUNNABLE 06-29 12:07:32.890: I/dalvikvm(19308): | group="system" sCount=0 dsCount=0 obj=0x40510490 self=0x159898 06-29 12:07:32.890: I/dalvikvm(19308): | sysTid=19312 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1575600 06-29 12:07:32.890: I/dalvikvm(19308): | schedstat=( 5340582 316192616 59 ) 06-29 12:07:32.898: I/dalvikvm(19308): at dalvik.system.NativeStart.run(Native Method) 06-29 12:07:32.898: I/dalvikvm(19308): "main" prio=5 tid=1 RUNNABLE 06-29 12:07:32.898: I/dalvikvm(19308): | group="main" sCount=1 dsCount=0 obj=0x40022198 self=0xcec8 06-29 12:07:32.898: I/dalvikvm(19308): | sysTid=19308 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1345006496 06-29 12:07:32.898: I/dalvikvm(19308): | schedstat=( 5364166234 3306213349 13647 ) 06-29 12:07:32.929: I/dalvikvm(19308): at android.media.AudioTrack.native_write_short(Native Method) 06-29 12:07:32.945: I/dalvikvm(19308): at android.media.AudioTrack.write(AudioTrack.java:943) 06-29 12:07:32.953: I/dalvikvm(19308): at com.argusoft.roobrooAndroid.modules.AudioPlayer.onPeriodicNotification(AudioPlayer.java:163)

Solución Bueno, las pruebas aún están activas para el código modificado y todo parece positivo hasta ahora. El problema estaba dentro de JNI (supongo). @ n.Declaración de Collins "El hecho de que la JVM no informa de ningún error también indica que fue causado por su código nativo". Fue uno de los punteros más correctos hacia la solución. Realmente agradezco a todas las personas que respondieron que realmente me ayudaron de una manera u otra. De hecho, eliminé un conjunto de otros errores al intentar resolver este problema gracias a la comunidad.


Basado en la Actualización # 2, es bastante claro que no ha podido desatascar una matriz en su JNI. Esto significa que está utilizando Get<Type>ArrayElements y no ha podido hacer coincidir una o más de estas llamadas con la Release<Type>ArrayElements .

Como resultado, la tabla de referencia se está desbordando. Busque los lugares donde está llamando a Obtener y no a Liberar. Por ejemplo, podría estar llamando a GetIntArrayElements pero no llamar a ReleaseIntArrayElements cuando haya terminado.


Es difícil decir sin el código fuente completo exactamente lo que está sucediendo, pero quizás la respuesta de Romain Guy here en los Grupos de Google ayude.

onLowMemory() cuando todo el sistema se está quedando sin memoria, no cuando el proceso se está quedando sin memoria. Cada aplicación está limitada a una cantidad fija de RAM (24 MB en un Nexus One, por ejemplo). Si usa estos 24 MB, pero el sistema aún tiene más memoria RAM disponible, obtendrá un OutOfMemoryError pero no onLowMemory() .

El límite de 24 mb está prácticamente fijado en piedra para las aplicaciones en <Honeycomb. Si apunta a la API 11 o superior, puede solicitar más memoria declarando que se asignará un montón grande para su aplicación. No se menciona en la documentación, pero la adición de android:largeHeap="true" a su etiqueta de application en su Manifest.xml lo hará (aunque no está garantizado).

Nota: en el firmware modificado (ROM personalizadas) es posible que ese valor sea más bajo o más alto. Creo que en el Samsung Galaxy Nexus es de 48 MB por defecto, pero como regla general, permanecer dentro de 24 MB es una suposición segura. También hay un gran post en el Sony Ericsson que explica las diferencias técnicas entre Gingerbread y Ice Cream Sandwich (RAM es un tema que se trata en profundidad).

Buena suerte, espero que al menos esto te ayude a encontrar el problema.


Los otros carteles han cubierto los problemas de falta de memoria. Solo agregaré eso para depurar su código nativo, una forma rápida y sucia es agregar mensajes de registro en varios puntos de control. Aquí hay un ejemplo de uno de mis archivos cpp nativos:

#include <android/log.h> ... // Set to 1 to enable debug log traces... #define DEBUG 0 #define LOG_TAG "yourNativeCodeLogTag" #if DEBUG #define LOG_ERROR(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) #define LOG_WARN(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__) #define LOG_INFO(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOG_DEBUG(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) #else // if !DEBUG #define LOG_ERROR(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) #define LOG_WARN(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__) #define LOG_INFO(...) #define LOG_DEBUG(...) #endif // DEBUG ... extern "C" JNIEXPORT void JNICALL Java_com_whatever_package_YourClassName_jniInitializeLibrary(JNIEnv * env, jobject thiz, /* other irrelevant stuff here */) { LOG_DEBUG("Initializing native library./n"); .... }

Finalmente, también deberá agregar -llog a su variable LOCAL_LDLIBS en el archivo *.mk relevante. Luego, puede obtener mensajes de registro de su biblioteca nativa en logcat.

ACTUALIZACIÓN: Después de ver sus actualizaciones, creo que debería usar la técnica anterior para agregar mensajes de registro a su método encode() nativo para ver exactamente dónde se bloquea.


No tengo suficiente representante para comentar las respuestas de otras personas, pero creo que la respuesta del Error 454 es bastante cercana.

Tuve un problema similar con mi propia aplicación con el reinicio de la aplicación sin mensaje. Mi problema se debió a un desbordamiento de matriz en el que intentaba acceder al índice n+1 en una matriz de n objetos en mi código nativo. El hecho de que la JVM no informa de ningún error también indica que fue causado por su código nativo.

Esta pregunta: el desbordamiento de la tabla de referencia de C ++ Jni tiene un registro de errores muy similar a su actualización 2, lo que indica además que su error reside en no haber coincidido con sus llamadas de obtención y liberación.

Si no entiende qué es la JNI pinned reference table , me gustaría dirigir su atención a las secciones de Especificación de JNI tituladas "Acceso a objetos de Java" y a la siguiente sección "Acceso a matrices primitivas" .

Finalmente, algunos fragmentos de su código nativo en los que accede a matrices de datos primitivas serían útiles para ayudar a resolver su problema, pero mientras tanto me gustaría llamar su atención sobre el comentario final sobre la respuesta al desbordamiento de la tabla de referencia (max = 512). JNI que lee:

GetObjectArrayElement devuelve el objeto con una referencia local, por lo que debe eliminar la referencia local. Pero debes hacerlo solo cuando hayas terminado con los elementos de la matriz. Por lo tanto, debe colocar DeleteLocalRef(oneDim) después de releaseIntArrayElements(oneDim) .

Así que, por favor, verifique que haya coincidido con las llamadas de Obtener / Liberar cuando acceda a los elementos de su matriz y, cuando ya no necesite acceder a ella, elimine la referencia local . Es posible que esté llegando al final de la tabla de referencia anclada de JNI porque no está eliminando objetos antiguos. Recuerde, JNI es solo una interfaz de CA para Java, por lo que tiene que ayudar a la recolección de basura para su código nativo.


Una cosa que puede ser el problema, es que tal vez su aplicación falla en algún lugar dentro del native code y esto detendrá su aplicación sin ningún mensaje, y no se imprimirá nada en el Logcat .

Tuve el mismo problema, al intentar decodificar algunos bitmaps , Android se estrelló en algún lugar dentro del native code y la aplicación se detiene, sin mostrar ningún mensaje.

Respecto a onLowMemory() @Tom responde que lo cubre.