Quiero usar el Afirmar palabra clave en mis aplicaciones android para destruir mi aplicación en algunos casos en el emulador, o mi dispositivo durante la prueba. Es esto posible?

Parece que el emulador solo ignora mis afirma.

InformationsquelleAutor Janusz | 2010-03-02

9 Comentarios

  1. -4

    La API proporciona la JUnit Afirmar.

    Que usted puede hacer

    import static junit.framework.Assert.*;

    ahora usted puede utilizar todas las funciones como assertTrue, assertEquals, assertNull que se proporcionan en el framework junit.

    Tenga cuidado de no importar el Junit4 marco a través de eclipse, que sería la org.junit paquete. Usted tiene que usar el junit.marco del paquete para que funcione en un dispositivo android o el emulador.

    • Bien el OP, pidió «hacer valer la palabra clave» que — a diferencia de junit.marco.Afirmar puede ser optimizado por el compilador JIT. Y es por esta razón por la que vine aquí. La esperanza de que algunas de las otras respuestas serán más útiles.
    • No me gusta ser descortés, pero esto no debería ser aceptado responder porque no responde a la pregunta (estoy de acuerdo con @Martin ‘s comentario). Otras respuestas a explicar cómo hacer la aserción de palabras clave que funcione correctamente, por ejemplo, ejecutar «adb shell setprop de depuración.valer 1»
    • Votada abajo porque OP preguntó acerca de afirmar palabra clave. @scorpiodawg ha descrito el proceso a continuación: stackoverflow.com/a/5563637/484261
    • scorpiodawg la respuesta llegó sólo un año más tarde, así que supongo que esta respuesta fue aceptado sólo porque el OP, por alguna razón, se sintió obligado a marcar una respuesta aceptada. Esta actitud hace que un gran número de respuestas en MODO incompleto o francamente horrible.
    • votada abajo porque no responde a la pregunta
  2. 145

    Ver, integrado en el VM de Control de documentos (HTML en bruto de la el árbol de código fuente, o un con un formato agradable copia).

    Básicamente, la Dalvik VM está configurado para ignorar la afirmación de los controles por defecto, aunque el .dex código de bytes incluye el código para realizar la verificación. La comprobación de afirmaciones es activado en una de dos maneras:

    (1) mediante el establecimiento de la propiedad del sistema de depuración.afirmar» a través de:

    adb shell setprop debug.assert 1

    que he comprobado que funciona como la intención de tiempo que usted vuelva a instalar la aplicación después de hacer esto, o

    (2) enviando el argumento de línea de comandos «–enable-assert» a la dalvik VM que podría no ser algo que los desarrolladores de aplicaciones son propensos a ser capaz de hacer (que alguien me corrija si estoy equivocado).

    Básicamente, hay un indicador que se puede establecer ya sea a nivel mundial, a nivel de paquete, o en una clase de nivel que permite afirmaciones en ese nivel respectivo. La bandera está desactivada por defecto, como resultado de que la afirmación de los cheques se omiten.

    Escribí el siguiente código en mi muestra de la Actividad:

    
    public class AssertActivity extends Activity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        int x = 2 + 3;
        assert x == 4;
      }
    }

    De este código, la dalvik byte de código que se genera es (Android 2.3.3):

    
    //Static constructor for the class
    000318:                                        |[000318] com.example.asserttest.AssertActivity.:()V
    000328: 1c00 0300                              |0000: const-class v0, Lcom/example/asserttest/AssertActivity; //[email protected]
    00032c: 6e10 0c00 0000                         |0002: invoke-virtual {v0}, Ljava/lang/Class;.desiredAssertionStatus:()Z //[email protected]
    000332: 0a00                                   |0005: move-result v0
    000334: 3900 0600                              |0006: if-nez v0, 000c //+0006
    000338: 1210                                   |0008: const/4 v0, #int 1 //#1
    00033a: 6a00 0000                              |0009: sput-boolean v0, Lcom/example/asserttest/AssertActivity;.$assertionsDisabled:Z //[email protected]
    00033e: 0e00                                   |000b: return-void
    000340: 1200                                   |000c: const/4 v0, #int 0 //#0
    000342: 28fc                                   |000d: goto 0009 //-0004

    : :

    //onCreate() 00035c: |[00035c] com.example.asserttest.AssertActivity.onCreate:(Landroid/os/Bundle;)V 00036c: 6f20 0100 3200 |0000: invoke-super {v2, v3}, Landroid/app/Activity;.onCreate:(Landroid/os/Bundle;)V //[email protected] 000372: 1501 037f |0003: const/high16 v1, #int 2130903040 //#7f03 000376: 6e20 0500 1200 |0005: invoke-virtual {v2, v1}, Lcom/example/asserttest/AssertActivity;.setContentView:(I)V //[email protected] 00037c: 1250 |0008: const/4 v0, #int 5 //#5 00037e: 6301 0000 |0009: sget-boolean v1, Lcom/example/asserttest/AssertActivity;.$assertionsDisabled:Z //[email protected] 000382: 3901 0b00 |000b: if-nez v1, 0016 //+000b 000386: 1251 |000d: const/4 v1, #int 5 //#5 000388: 3210 0800 |000e: if-eq v0, v1, 0016 //+0008 00038c: 2201 0c00 |0010: new-instance v1, Ljava/lang/AssertionError; //[email protected] 000390: 7010 0b00 0100 |0012: invoke-direct {v1}, Ljava/lang/AssertionError;.:()V //[email protected] 000396: 2701 |0015: throw v1 000398: 0e00 |0016: return-void

    Observe cómo el constructor estático, se invoca el método desiredAssertionStatus en la Clase de objetos y conjuntos de la clase-ancho variable $assertionsDisabled; también note que en el onCreate(), todos del código para lanzar java.lang.AssertionError está compilado, pero su ejecución depende de que el valor de $assertionsDisabled que se establece por la Clase de objeto en el constructor estático.

    Parece que JUnit la clase Assert es lo que se utiliza predominantemente, por lo que es probable una apuesta segura para el uso que. La flexibilidad de la aserción de la palabra clave es la capacidad de convertir en aserciones en tiempo de desarrollo y desactivarlos para el envío de los bits y en lugar de error correctamente.

    Espero que esto ayude.

    • Parece que Google ha eliminado la navegación por el origen (vi referencias a esto en las respuestas a otras preguntas aquí). Su mejor apuesta es la de obtener el código fuente, o intento de ver esto en un motor de búsqueda. De la búsqueda para «dalvik/embedded-vm-control.html». Aquí hay un lugar que lo tiene: assembla.com/code/android-gb-for-sharp-is01/git/nodes/dalvik/…. Espero que esto ayude.
    • Muy útil, gracias. Estoy confundido por la distinción que se hizo en la segunda-a último párrafo, aunque. Estamos hablando de dos tipos de aserciones: el primero es El de los métodos de la JUnit Afirmar paquete como assertNotNull(), y el segundo, el lenguaje Java ‘afirmar’ palabra clave’. ¿Su respuesta se aplican a ambos? Por ejemplo, si yo import static junit.framework.Assert.* y entonces yo uso uno de sus métodos, como assertNotNull("It's null!", someObject);, es esta afirmación se apaga en el envío de los bits?
    • Hola Jeffro, yo no lo creo — junit.marco.Afirmar es simplemente una clase que lanza una excepción cuando la condición de entrada es falsa. La aserción de la palabra clave en el otro lado se construye en el lenguaje. Espero que esto ayude.
    • Es allí una manera de hacer adb shell setprop debug.assert 1 en Eclipse?
    • Afirmaciones también se puede hacer desde un terminal se ejecuta en el dispositivo si eres root. Primera su, entonces setprop debug.assert 1. Tenga en cuenta que el código que se muestran desmontado va a permanecer en una versión de lanzamiento (stackoverflow.com/a/5590378/506073). No creo que el compilador javac puede ser dicho que no emiten afirmaciones por lo que deben ser despojado de salida de alguna manera. Una solución sencilla que es envolver la palabra clave afirmar en su propia función proguard pueden tira para usted.
    • No puedo encontrar una manera de ejecutar este adb shell de comandos de Eclipse. Pero se puede ejecutar el comando después de Eclipse se ha iniciado el adb server y conectado a su teléfono.
    • ¿cómo se puede ignorar afirmar con pro-guardia de las reglas?

  3. 10

    Cuando las afirmaciones que están habilitados, el assert palabra clave simplemente lanza una AssertionError cuando la expresión booleana es false.

    Para la OMI, la mejor alternativa, esp. si eres reacio a depender de junit, es lanzar un AssertionError explícitamente como se muestra a continuación:

    assert x == 0 : "x = " + x;

    Una alternativa a la instrucción anterior es:

    Utils._assert(x == 0, "x = " + x);

    Donde el método se define como:

    public static void _assert(boolean condition, String message) {
    if (!condition) {
    throw new AssertionError(message);
    }
    }

    El Oracle java docs recomendamos lanzar un AssertionError como una alternativa aceptable.

    Supongo que se puede configurar Proguard para despojar de estas llamadas para el código de producción.

    • Pero ¿cómo se puede activar afirmaciones? En Android Studio?
  4. 8

    En «Android en la Práctica» se sugiere utilizar:

    $adb shell setprop dalvik.vm.enableassertions all

    si esta configuración no se conserva en su teléfono, entonces usted puede crear /data/local.la proposición de archivo con propiedades como:

    dalvik.vm.enableassertions=all
  5. 5

    Que estaba molestando a el infierno fuera de mí, que mis afirmaciones no funciona, hasta que he comprobado que el problema en google… me dio hasta en simples afirmaciones y va a ir con junits afirmación métodos.

    Con fines de conveniencia, estoy usando:

    de importación estática junit.marco.Assert.*;

    Debido a la estática de importación puedo más tarde escribe:

    assertTrue(…); en vez de Afirmar.assertTrue(…);

  6. 4

    Si usted está preocupado por el código de envío con el JUnit afirma en (o cualquier otra ruta de clase), puede utilizar el ProGuard opción de configuración ‘assumenosideeffects’, que se tira a cabo una ruta de clase en el supuesto de que la eliminación de ella no hace nada para el código.

    Por ejemplo.

    -assumenosideeffects junit.framework.Assert {
    *;
    }

    Tengo un común de depuración de la biblioteca que poner todos mis métodos de prueba y, a continuación, utilice esta opción para quitar desde mi liberado aplicaciones.

    Esto también elimina el difícil problema de las cadenas de manipulación que nunca se utilizan en el código de liberación. Por ejemplo, si usted escribe un registro de depuración método, y en que el método de verificación para el modo de depuración antes de que el registro de la cadena, que son todavía la construcción de la cadena, la asignación de memoria, la llamada al método, pero, a continuación, optando por no hacer nada. Despojar a la clase, a continuación, elimina las llamadas completamente, es decir, como el tiempo que su cadena se construye en el interior de la llamada al método, desaparece.

    Asegúrese de que está realmente seguro de lo tira las líneas de salida, sin embargo, ya que se realiza ninguna comprobación en ProGuard parte. La eliminación de cualquier void método de devolución va a estar bien, sin embargo, si usted está tomando cualquiera de los valores de retorno de lo que va a quitar, asegúrese de que usted no los está usando para la operativa real de la lógica.

    • Creo que la sintaxis correcta sería: -assumenosideeffects class junit.framework.Assert { *; }
    • Confuso respuesta. Comando mencionado causas proguard de error. Comando corregido por Pooks todavía no quita afirmaciones de binario dex archivo.
    • Tengo el mismo problema que @PointerNull . afirman no eliminado.
  7. 1

    Para agregar a Zulaxia la respuesta en el desmantelamiento de Junit – Proguard ya es parte de la SDK de Android /Eclipse y en la siguiente página se explica cómo habilitar.

    http://developer.android.com/guide/developing/tools/proguard.html

    También la de arriba no funciona con la última defecto proguard configuración, ya que utiliza la dontoptimize de la bandera que debe ser tomado y algunas de las optimizaciones de encendido.

  8. 1

    Puede utilizar afirmaciones, pero requiere un poco de trabajo para uso de ellos de forma fiable. El sistema de propiedad debug.assert no es confiable; ver los problemas Cien setenta y cinco mil seiscientos noventa y siete, Sesenta y cinco mil cien ochenta y tres, Treinta y seis mil setecientos ochenta y seis y Diecisiete mil trescientos veinticuatro.

    Es un método para traducir cada assert declaración a algo que cualquier tiempo de ejecución puede tratar. Hacer esto con una fuente de preprocesador en frente de el compilador de Java. Tomemos, por ejemplo, esta declaración:

    assert x == 0: "Failure message";

    Para una generación de depuración, su preprocesador iba a traducir el anterior a un if declaración:

    { if( !(x == 0) ) throw new AssertionError( "Failure message" ); }

    Para una construcción de producción, a una declaración vacía:

    ;

    Tenga en cuenta que este sería el control de aserciones en tiempo de compilación, como contraposición a tiempo de ejecución (en la práctica habitual).

    No podría encontrar un ready-made de preprocesador, así que me con guión uno. Vea la sección que trata con afirmaciones. Licencia para copiar es aquí.

  9. 0

    Uso estándar de Java afirmar palabra clave, por ejemplo:

    assert a==b;

    Para que esto funcione, usted tiene que agregar una línea a /system/build.prop y reiniciar el teléfono:

    debug.assert=1

    Que esto iba a funcionar en el teléfono rooteado. Utilizar algún gestor de archivos capaz de editar build.la proposición (por ejemplo, X-plore).

    Ventajas: la mayoría (todos?) Los teléfonos Android de la nave con afirmaciones de movilidad. Incluso si el código accidentalmente afirma en false, la aplicación no va a interrumpir o accidente.
    Sin embargo, en el desarrollo de dispositivos tendrás afirmación de excepción.

Dejar respuesta

Please enter your comment!
Please enter your name here