Red de conocimiento informático - Material del sitio web - Cómo detectar fugas en el cursor de AndroidAlgunas vulnerabilidades son difíciles de encontrar en el código, pero inevitablemente se producirán anomalías después de que el programa se ejecute durante mucho tiempo. Al mismo tiempo, este método también es aplicable a otras situaciones en las que es necesario detectar fugas de recursos. Recientemente, se descubrió que cierto programa vegetal de conexión de teléfonos móviles tenía una fuga grave del cursor al consultar la base de datos de MediaProvider. Después de ejecutarse durante un período de tiempo, todos los programas del sistema que utilizan la base de datos dejarán de estar disponibles. Además, es frecuente encontrar que algunas aplicaciones tienen fugas en el cursor. Debido a que el tiempo de ejecución es relativamente largo, algunos de estos errores no se han descubierto durante mucho tiempo. Sin embargo, una vez que las fugas del cursor se acumulan hasta un cierto número (generalmente varios cientos), inevitablemente no se podrá consultar la base de datos y solo podrá volver a la normalidad cuando el proceso donde se encuentra el servicio de la base de datos muera y se reinicie. El mensaje de error habitual es el siguiente, que indica que cierto programa pid abrió el cursor 866 pero no lo cerró, lo que resultó en una excepción: 3634 3644 e Carpeta Java: * * * * ¡Excepción remota de UnAugust! (Aún no se admiten excepciones entre procesos). 3634 3644 E Carpeta Java: base de datos de Android cursorwindowwalllocationException: la asignación de la ventana del cursor falló por 2048 kb. #Número de cursores abiertos = 866 (#Número de cursores abiertos por pid 1565 = 866) 3634 3644 E Carpeta de Java: en la base de datos de Android. (Ventana del cursor. Java: 104) 3634 3644 E Carpeta de Java: en Android. base de datos abstractwindowedcursor. clearorcreatewindow (abstractwindowedcursor. Java: 198) 3634 3644 E Carpeta de Java: el principio de detección del cursor es detectar si se ha llamado al método close() cuando la JVM recicla el objeto del cursor al método finalize(). . Este enfoque también se utiliza en ContentResolver. El código de muestra simplificado es el siguiente: 1 importandroid.

Cómo detectar fugas en el cursor de AndroidAlgunas vulnerabilidades son difíciles de encontrar en el código, pero inevitablemente se producirán anomalías después de que el programa se ejecute durante mucho tiempo. Al mismo tiempo, este método también es aplicable a otras situaciones en las que es necesario detectar fugas de recursos. Recientemente, se descubrió que cierto programa vegetal de conexión de teléfonos móviles tenía una fuga grave del cursor al consultar la base de datos de MediaProvider. Después de ejecutarse durante un período de tiempo, todos los programas del sistema que utilizan la base de datos dejarán de estar disponibles. Además, es frecuente encontrar que algunas aplicaciones tienen fugas en el cursor. Debido a que el tiempo de ejecución es relativamente largo, algunos de estos errores no se han descubierto durante mucho tiempo. Sin embargo, una vez que las fugas del cursor se acumulan hasta un cierto número (generalmente varios cientos), inevitablemente no se podrá consultar la base de datos y solo podrá volver a la normalidad cuando el proceso donde se encuentra el servicio de la base de datos muera y se reinicie. El mensaje de error habitual es el siguiente, que indica que cierto programa pid abrió el cursor 866 pero no lo cerró, lo que resultó en una excepción: 3634 3644 e Carpeta Java: * * * * ¡Excepción remota de UnAugust! (Aún no se admiten excepciones entre procesos). 3634 3644 E Carpeta Java: base de datos de Android cursorwindowwalllocationException: la asignación de la ventana del cursor falló por 2048 kb. #Número de cursores abiertos = 866 (#Número de cursores abiertos por pid 1565 = 866) 3634 3644 E Carpeta de Java: en la base de datos de Android. (Ventana del cursor. Java: 104) 3634 3644 E Carpeta de Java: en Android. base de datos abstractwindowedcursor. clearorcreatewindow (abstractwindowedcursor. Java: 198) 3634 3644 E Carpeta de Java: el principio de detección del cursor es detectar si se ha llamado al método close() cuando la JVM recicla el objeto del cursor al método finalize(). . Este enfoque también se utiliza en ContentResolver. El código de muestra simplificado es el siguiente: 1 importandroid.

base de datos.cursor; 2 importar el contenedor Android.database.cursor; 3 importar Android.util.log; 4 5 publicclass TestCursor extiende el contenedor del cursor { 6 privatestaticcomplete String TAG = "cursor de prueba"; race; 910 public test Cursor(Cursor c){ 11 super(c); 12 mTrace = new Throwable("No se llamó al método de terminación explícita 'close()'); 13 } 1415 @ Anular 16 public void close(){ 17 mIsClosed = true; 18 } 1920 @ Anular 21 public void finalize() throws Throwable { 22try { 23if (mIsClosed!= true) { 24 Log.e(label, "Cursor filtrado", mTrace 25 } 26 } finalmente { 27); super . finalize(); 28} 29} 30} Luego, TestCursor se devuelve a la aplicación como resultado de la consulta: 1 devuelve un nuevo cursor de prueba (cursor // el cursor es el resultado de una consulta común), como A partir de ContentProvider.query (), este método también es adecuado para todas las situaciones en las que no se llama al método que libera explícitamente el recurso, y es un método general. Pero en el método finalize(), debemos prestar atención a las ventajas. : precisión. Al reciclarse, el recurso no se ha liberado, por lo que debe haber una fuga de recursos: depende del método finalize () y de la estrategia de recolección de basura de la JVM. Por ejemplo, si una aplicación tiene actualmente 10 objetos de cursor. filtrado, estos 10 objetos se han filtrado. No está en un estado reciclable, pero es posible que la JVM no lo recicle inmediatamente (el tiempo es impredecible). En algunos casos, finalize() puede no ejecutarse incluso si el objeto se recicla. No hay garantía de que se detecten todos los problemas. Para obtener más información sobre finalize(), consulte el Punto 7: Cómo evitar finalizadores en la segunda edición de Effective Java. Para los desarrolladores de aplicaciones, comience con GINGERBREAD. Android proporciona una herramienta StrictMode para ayudar a los desarrolladores a verificar si accidentalmente hicieron algo que no deberían haber hecho. El método de uso es configurar StrictMode en Actividad. El siguiente ejemplo activa la función de verificar objetos SQLite filtrados y objetos que se pueden cerrar (Cursor/FileInputStream de uso común, etc.). ). Si se encuentra alguna infracción, se registrarán los registros y se forzará la salida del programa. 1 importar sistema operativo Android. Modo estricto; 2 3 publicclass TestActivity extiende Actividad { 4 privatestaticfinalbool DEVELOPER _ MODE = true; 5 publicvoid onCreate(){ 6if(DEVELOPER _ MODE){ 7 estricto MODE. ( ) 8. detectarLeakedSqlLiteObjects() 9.