Asegure el código de Android de alta calidad con herramientas de análisis estático

En el tutorial de hoy, aprenderemos cómo garantizar el código de Android de alta calidad en nuestros proyectos utilizando algunas herramientas de análisis de código estático para Java. Veremos Checkstyle, FindBugs, PMD y Android Studio Lint, todos ellos gratuitos y de código abierto.!

¿Qué son las herramientas de análisis de código estático??

Estas son herramientas que analizan y analizan su código fuente sin ejecutarlo realmente. El objetivo es encontrar vulnerabilidades potenciales, como errores y fallas de seguridad. Un popular analizador de código estático gratuito, como FindBugs, compara su código con un conjunto de reglas a las que debería adherirse: si el código no sigue estas reglas, es una señal de que algo puede estar mal. Piense en las herramientas de análisis de código estático como un compilador adicional que se ejecuta antes de la compilación final en el idioma del sistema.  

Muchas compañías de software requieren que los proyectos pasen las pruebas de análisis de código estático, además de hacer revisiones de código y pruebas unitarias en el proceso de construcción. Incluso los mantenedores de proyectos de código abierto a menudo incluyen uno o más pasos de análisis de código estático en el proceso de compilación. Por lo tanto, aprender sobre el análisis estático es un paso importante para escribir código de calidad. Tenga en cuenta que el análisis de código estático, también conocido como prueba de "caja blanca", no debe considerarse un reemplazo para la prueba unitaria de su código fuente.

En este tutorial, vamos a aprender acerca de algunas herramientas populares de análisis estático que están disponibles para Android y Java. Pero primero, veamos algunos de los beneficios de usar el análisis estático..

Beneficios

  • Ayuda a detectar posibles errores que incluso las pruebas unitarias o manuales podrían haber pasado por alto.
  • Define reglas específicas del proyecto. Por ejemplo, el análisis estático como parte de la cadena de construcción ayuda a los recién llegados a ponerse al día con los estándares de código de su nuevo equipo.
  • Te ayuda a mejorar tu conocimiento de un nuevo idioma..
  • Escanea todo tu proyecto, incluidos los archivos que quizás nunca hayas leído.

Preparar

Todas las herramientas de análisis de código que aprenderemos en este tutorial están disponibles como complementos de Gradle, por lo que podemos crear tareas individuales de Gradle para cada una de ellas. Vamos a usar un solo archivo de Gradle que los incluirá a todos. Pero antes de eso, vamos a crear una carpeta que contendrá todos nuestros archivos para el análisis de código estático. 

Abre Android Studio y dentro del módulo de la aplicación (en Proyecto ver), crea una nueva carpeta y nómbrela code_quality_tools. Esta carpeta contendrá los archivos XML para las herramientas de análisis de código, y también tendrá un archivo Gradle, calidad.gradle, que ejecutará nuestras tareas de análisis estático. 

Finalmente, visite su construir.gradle en la carpeta del módulo de la aplicación e incluya esta línea al final del archivo:

aplicar desde: '/code_quality_tools/quality.gradle'

Aquí, nuestra calidad.gradle El script de Gradle se está aplicando con una referencia a su ubicación de archivo local. 

Cheque de estilo

Dadas las reglas que especifica en un archivo XML para imponer un estándar de codificación para su proyecto, Checkstyle aplica esas reglas al analizar su código fuente y las compara con los estándares o convenciones de codificación conocidos.. 

Checkstyle es una herramienta de código abierto que la comunidad mantiene activamente. Esto significa que puede crear sus propios cheques personalizados o modificar los existentes para satisfacer sus necesidades. Por ejemplo, Checkstyle puede ejecutar una comprobación de los nombres constantes (final, estático o ambos) en sus clases. Si sus nombres constantes no se adhieren a una regla de estar en mayúsculas con palabras separadas por un guión bajo, el problema se marcará en el informe final. 

// Cadena estática final privada incorrecta myConstant = "myConstant"; // corregir la cadena estática final privada MY_CONSTANT = "myConstant";

Integrar Checkstyle

Le mostraré cómo integrar Checkstyle en nuestro proyecto de Android Studio y demostraré un ejemplo práctico..

Primero, necesitamos crear nuestras reglas de codificación. Dentro estilo de control.xml, creamos algunas reglas de configuración de Checkstyle que se ejecutarán en nuestro código.

                  

En el código anterior, incluimos las reglas o los controles que queremos que Checkstyle valide en nuestro código fuente. Una regla es AvoidStarImport que, como su nombre indica, comprueba si su código fuente incluye una declaración de importación como java.util. *. (En su lugar, debe especificar explícitamente el paquete a importar, por ejemplo,. java.util.Observable.) 

Algunas reglas tienen propiedades, que podemos establecer como lo hicimos para ParameterNumber; esto limita el número de parámetros de un método o constructor. Por defecto, la propiedad. max es 7, pero lo cambiamos a 6 en su lugar. Eche un vistazo a algunos de los otros controles en el sitio web de Checkstyle.

Para ejecutar esta comprobación, necesitamos crear una tarea de Gradle. Así que visita el calidad.gradle Archivo y crear una tarea llamada cheque de estilo:

apply plugin: 'checkstyle' tarea checkstyle (tipo: Checkstyle) descripción 'Comprobar código estándar' grupo 'verificación' configFile archivo ('./ code_quality_tools / checkstyle.xml') fuente 'src' include '** / *. java' excluir '** / gen / **' classpath = files () ignoreFailures = false

Tenga en cuenta que en el código anterior, primero aplicamos el complemento Checkstyle Gradle. Le dimos una descripción y la agregamos a un grupo de Gradle ya predefinido llamado verificación. 

Las propiedades clave de la tarea Checkstyle Gradle que nos interesan son: 

  • archivo de configuración: el archivo de configuración de Checkstyle para usar.
  • IgnorarFallas: si se permite o no que la compilación continúe si hay advertencias.
  • incluir: el conjunto de incluir patrones.
  • excluir: el conjunto de patrones de exclusión. En este caso, no escaneamos las clases generadas.. 

Finalmente, puede ejecutar el script de Gradle visitando la ventana de la herramienta Gradle en Android Studio, abriendo la verificación grupo, y luego haciendo clic en estilo de control para ejecutar la tarea. 

Otra forma es usar la línea de comando: 

gradle checkstyle

Una vez que la tarea haya terminado de ejecutarse, se generará un informe, que está disponible en módulo de aplicación> compilación> informes> estilo de verificación. Tu puedes abrir checkstyle.html para ver el informe. 

Un complemento Checkstyle está disponible gratuitamente para Android Studio o IntelliJ IDEA. Ofrece escaneo en tiempo real de tus archivos Java. 

PMD

PMD es otra herramienta de análisis de código de fuente abierta que analiza su código fuente. Encuentra fallas comunes como variables no utilizadas, bloques de captura vacíos, creación innecesaria de objetos, etc. PMD tiene muchos conjuntos de reglas que puedes elegir. Un ejemplo de una regla que forma parte del conjunto de reglas de diseño es:

  • Simplificar las expresiones booleanas: evitar comparaciones innecesarias en expresiones booleanas que complican el código simple. Un ejemplo: 
public class Bar // se puede simplificar a // bar = isFoo (); barra booleana privada = (isFoo () == true); public isFoo () return false;

PMD está configurado con el pmd.xml expediente. Dentro de él, incluiremos algunas reglas de configuración como las de Android, nomenclatura y diseño.. 

  Reglas personalizadas para la aplicación de Android .* / R.java .* / gen /.*                 

Como hicimos con Checkstyle, también necesitamos crear una tarea PMD Gradle para que la verificación se ejecute dentro de calidad.gradle expediente. 

apply plugin: 'pmd' task pmd (tipo: Pmd) descripción 'Ejecutar PMD' grupo 'verificación' ruleSetFiles = archivos ("./ code_quality_tools / pmd.xml") fuente 'src' include '** / *. java' excluya los informes '** / gen / **' xml.enabled = false html.enabled = true ignoreFailures = false

PMD también está disponible como un complemento de Gradle. 

Las propiedades clave de la tarea que hemos creado son: 

  • ruleSetFiles: Los archivos de conjuntos de reglas personalizados que se utilizarán.
  • fuente: La fuente de esta tarea..
  • informes: Los informes a generar por esta tarea..

Finalmente, puede ejecutar el script de Gradle visitando la ventana de la herramienta Gradle, abriendo la carpeta del grupo de verificación y luego haciendo clic en pmd para ejecutar la tarea. O puede ejecutarlo a través de la línea de comando:

gradle pmd

También se generará un informe después de la ejecución de la tarea que está disponible en módulo de aplicación> compilar> informes> pmd. También hay un complemento de PMD disponible para IntelliJ o Android Studio para que lo descargue e integre si lo desea.. 

Encontrar errores

FindBugs es otra herramienta de análisis estático gratuita que analiza a su clase en busca de posibles problemas al verificar sus códigos de byte con una lista conocida de patrones de error. Algunos de ellos son:

  • La clase define hashCode () pero no es igual a (): Una clase implementa el método hashCode () pero no es igual a (), por lo tanto, dos instancias podrían ser iguales pero no tener los mismos códigos hash. Esto cae bajo la categoría de mala práctica.. 
  • Mala comparación de valor int con constante larga: El código está comparando un valor int con una constante larga que está fuera del rango de valores que se pueden representar como un valor int. Esta comparación es vacua y posiblemente dará un resultado inesperado. Esto cae bajo la categoría de corrección. 
  • TestCase no tiene pruebas: clase es un JUnit Caso de prueba pero no ha implementado ningún método de prueba. Este patrón también está bajo la categoría de corrección. 

FindBugs es un proyecto de código abierto, por lo que puede ver, contribuir o monitorear el progreso del código fuente en GitHub. 

En el findbugs-exclude.xml archivo, queremos evitar que FindBugs escanee algunas clases (usando expresiones regulares) en nuestros proyectos, como clases de recursos generadas automáticamente y clases de manifiesto generadas automáticamente. Además, si usa Dagger, queremos que FindBugs no verifique las clases de Dagger generadas. También podemos decirle a FindBugs que ignore algunas reglas si queremos. 

                 

Y finalmente, incluiremos el bichos tarea en calidad.gradle:

aplique el complemento: 'findbugs' tarea findbugs (escriba: FindBugs) descripción 'Ejecutar findbugs' grupo 'verificación' classes = archivos ("$ project.buildDir / intermedios / classes") fuente 'src' classpath = files () esfuerzo 'max 'reportLevel = "alto" excludeFilter file (' ./ code_quality_tools / findbugs-exclude.xml ') informa xml.enabled = false html.enabled = true ignoreFailures = false

En la primera línea anterior, aplicamos FindBugs como un complemento de Gradle y luego creamos una tarea llamada bichos. Las propiedades clave de la bichos tarea que realmente nos preocupa son: 

  • clases: las clases a analizar.
  • esfuerzo: el nivel de esfuerzo de análisis. El valor especificado debe ser uno de mindefecto, o max.  Tenga en cuenta que los niveles más altos aumentan la precisión y encuentran más errores a costa del tiempo de ejecución y el consumo de memoria.
  • informeNivel: el umbral de prioridad para reportar errores. Si se establece en bajo, se informan todos los errores. Si se establece en medio (el valor predeterminado), se informan los errores de prioridad media y alta. Si se establece en alto, solo se informan errores de alta prioridad.
  • excluirFiltro: el nombre de archivo de un filtro que especifica errores para excluir de ser reportados, que ya hemos creado. 

Luego puede ejecutar el script de Gradle visitando la ventana de la herramienta Gradle, abriendo la carpeta del grupo de verificación y luego haciendo clic en bichos para ejecutar la tarea. O lanzarlo desde la línea de comandos:

bichos de gradle

También se generará un informe cuando la tarea haya terminado de ejecutarse. Esto estará disponible en módulo de la aplicación> compilación> informes> findbugs. El complemento FindBugs es otro complemento disponible de forma gratuita para descargar e integrarse con IntelliJ IDEA o Android Studio..

Pelusa de Android

Lint es otra herramienta de análisis de código, pero esta viene con Android Studio por defecto. Comprueba los archivos fuente de su proyecto de Android para detectar posibles errores y optimizaciones para la corrección, seguridad, rendimiento, facilidad de uso, accesibilidad e internacionalización. 

Para configurar Lint, debes incluir el lintOptions bloque en tu nivel de módulo construir.gradle expediente:

lintOptions abortOnError false quiet verdadero lintConfig file ('./ code_quality_tools / lint.xml')

Las opciones clave de Lint que nos preocupan son: 

  • abortOnError: si la pelusa debe establecer el código de salida del proceso si se encuentran errores.
  • tranquilo: si desactivar el análisis de progreso de informes.
  • lintConfig: el archivo de configuración por defecto a usar.

Tu lint.xml el archivo puede incluir problemas que Lint ignore o modifique, como el ejemplo a continuación:

      

Puede ejecutar Lint manualmente desde Android Studio haciendo clic en el Analizar menú, eligiendo Inspeccionar el código ...  (el alcance de la inspección es todo el proyecto), y luego haciendo clic en el DE ACUERDO botón para proceder.

También puede ejecutar Lint visitando la ventana de la herramienta Gradle, abriendo la verificación grupo, y luego haciendo clic en hilas. Finalmente, puedes ejecutarlo a través de la línea de comando..

En Windows:

pelusa de gradlew

En Linux o Mac:

./ gradlew pelusa

También se generará un informe cuando la tarea haya terminado de ejecutarse, que está disponible en módulo de la aplicación> compilación> salidas> lint-results.html.

Bono: modo estricto

StrictMode es una herramienta de desarrollo que ayuda a evitar que los desarrolladores de su proyecto realicen cualquier E / S flash o I / O flash en el hilo principal, ya que esto puede hacer que la aplicación sea lenta o no responda. También ayuda a prevenir que aparezcan los cuadros de diálogo de ANR (aplicación que no responde). Con los problemas de StrictMode corregidos, su aplicación será más receptiva y el usuario disfrutará de una experiencia más suave. StrictMode utiliza dos conjuntos de políticas para hacer cumplir sus reglas:

  • Políticas de VM: protege contra las malas prácticas de codificación, como no cerrarse SQLiteCursor objetos o cualquier Cerrable objeto que fue creado. 
  • Políticas de subprocesos: busca operaciones como E / S flash y E / S de red que se realizan en el subproceso principal de la aplicación en lugar de en un subproceso en segundo plano. 
if (BuildConfig.DEBUG) StrictMode.setThreadPolicy (new StrictMode.ThreadPolicy.Builder () .detectDiskReads () .detectDiskWrites () .detectNetwork () // or .detectAll () para todos los problemas detectables .penaltyLog ()) violaciones al registro del sistema ... build ()); StrictMode.setVmPolicy (new StrictMode.VmPolicy.Builder () .detectLeakedSqlLiteObjects () .detectLeakedClosableObjects () .penaltyLog () .penaltyDeath () // Crashes todo el proceso en la violación ... build (); 

El código anterior puede estar en su Aplicación, Actividad u otros componentes de la aplicación onCreate () método. 

Puedes aprender más sobre Modo estricto aquí en Envato Tuts+. 

En el repositorio de GitHub de esta publicación, se puede encontrar un proyecto de Android de ejemplo que implementa todo lo anterior, incluidos los conjuntos de reglas de las herramientas para un proyecto típico de Android..

Conclusión

En este tutorial, aprendió cómo garantizar un código de Android de alta calidad mediante el uso de herramientas de análisis de código estático: qué son, los beneficios de usarlos y cómo usar Checkstyle, FindBugs, Lint, PMD y StrictMode en su aplicación. Continúe y pruebe estas herramientas; puede descubrir algunos problemas en su código que nunca esperó.

Mientras tanto, echa un vistazo a algunos de nuestros otros cursos y tutoriales sobre el desarrollo de aplicaciones para Android!