2. La creación de componentes funciona con el marco ARouter

1. ¿Qué es la segmentación por componentes y por qué es necesaria la segmentación por componentes?

1.1 Escenarios aplicables

Para proyectos a gran escala y desarrollo colaborativo de varias personas, la creación de componentes se puede utilizar en este momento para reducir el tiempo de compilación y reducir los conflictos causados ​​por el envío de código colaborativo de varias personas
. utilizar la creación de componentes para el diseño excesivo.

1.2 Todos los códigos están en el directorio de la aplicación y cada módulo se administra a través del nombre del paquete. ¿Cuáles son las desventajas?

Problema de baja cohesión, alto acoplamiento, no reutilización, confusión jerárquica

  • 低内聚问题:El grado de agregación y asociación entre internos, entonces baja cohesión significa que el grado de agregación y asociación entre internos es muy bajo.
  • 高耦合:Es una medida del grado de asociación entre módulos. La fuerza del acoplamiento depende de la complejidad de la interfaz con los módulos, la forma de llamar a los módulos y la cantidad de datos transmitidos a través de la interfaz. Alto acoplamiento significa que existe una estrecha relación entre los módulos.
  • 无重用:Dado que los componentes o la biblioteca base pública no se empaquetan por separado en un paquete independiente, otros proyectos no pueden reutilizar estos componentes y el código debe copiarse para volver a usarse.
  • 层次混乱:Por ejemplo, en los primeros proyectos, todo el código estaba bajo el módulo de la aplicación y el nombre del paquete se usaba para la gestión del módulo. Demasiadas iteraciones o códigos irregulares darían lugar a una confusión jerárquica.

1.3 Importancia de la componentización

Sin interdependencia, interacción mutua, combinación arbitraria, alto grado de desacoplamiento, desmontaje libre, ensamblaje libre, reutilización, independencia en capas

explicar:

  • 不相互依赖:Los componentes empresariales pueden ser independientes entre sí; las bibliotecas de componentes públicos pueden ser independientes entre sí
  • 可以相互交互:La aplicación, los componentes comerciales y los componentes pueden cooperar ARouterpara realizar saltos de página.
  • 任意组合:El proyecto de la aplicación puede agregar y eliminar cualquier componente comercial que dependa de él, de modo que pueda agregar y eliminar rápidamente un módulo comercial.
  • 高度解耦:Los componentes comerciales son independientes entre sí y no dependen entre sí; las bibliotecas de componentes públicos son independientes entre sí y no dependen entre sí
  • 自由拆卸:Un solo componente se puede empaquetar en una aplicación y el módulo se puede probar por separado ( gradle编码控制)
  • 自由组装:Los componentes se pueden integrar en el proyecto de la aplicación y se puede empaquetar el apk del entorno oficial ( gradle编码控制)
  • 重复利用:La librería base pública puede ser reutilizada en varios componentes, pudiendo incluso ser utilizada en otros proyectos desarrollados por la empresa, no existe una relación directa entre componentes y componentes, pudiendo ser utilizada por separado en otros proyectos.
  • 分层独立化:Clara división del trabajo entre la ingeniería de aplicaciones, los componentes comerciales y la biblioteca de base pública

Jerarquía por componentes:

  • ingeniería de aplicaciones
  • Componentización de negocios
    • Ejemplos de WeChat: WeChat, libreta de direcciones, descubrimiento, yo...
      También puede usar una determinada función/elemento como componente, como: Qzone en QQ, Tmall Supermarket en Taobao.
  • biblioteca de base pública
    • Base, Utils, Http, ARouter, etc.

2. Servicio de implementación automática de entorno integrado/entorno de componente

2.1 Controlar la implementación del entorno formal y el entorno de prueba a través de Gradle

Secuencia de acceso al archivo Gradle:

  1. configuración.gradle
  2. proyecto的build.gradle
    • globalPodemos crear un archivo .gradle( ) en el directorio del proyecto 标记的名字可以随便取. Este archivo extrae algunas bibliotecas dependientes del proyecto y los módulos de shell de la aplicación para lograr el propósito del control de versión unificado.
      Luego haga referencia a este global en el proyecto de la aplicación y las variables de los módulos definidas en el archivo .gradle.
  3. build.gradle del proyecto de aplicación
  4. module的build.gradle

2.2 Uso de gradle global personalizado

Aquí tomamos el archivo global.gradle creado anteriormente como ejemplo.

  1. Cree un archivo global.gradle para el control global en el directorio del proyecto. global.gradleEl código del archivo es el siguiente:

    ext {
          
          
        isApplication = false //false:作为module(不能单独运行),true:作为application(可以作为app单独运行)
    
        //对app工程及所有组件版本号进行统一管理
        version = [
                compileSdkVersion: 30,
                minSdkVersion    : 19,
                targetSdkVersion : 30,
                buildToolVersion : '28.0.3',
                versionCode      : 100,
                versionName      : "1.0.0",
        ]
    
        //依赖库版本号管理
        libsVersion = [
                gson = "2.8.5",
                glide = "4.6.1",
                rxlifecycle = "2.2.2",
        ]
        //依赖库管理
        libsDependency = [
                gson                         : "com.google.code.gson:gson:$rootProject.gson",
                glide                        : "com.github.bumptech.glide:glide:$rootProject.glide",
                rxlifecycle                  : "com.trello.rxlifecycle2:rxlifecycle:$rootProject.rxlifecycle",
        ]
    }
    
  2. Utilizado en el archivo build.gradle de los proyectos y componentes de la aplicación, tome el código del archivo 组件en el directorio build.gradlecomo ejemplo:

    apply plugin: 'com.android.library'
    //配置版本号
    android {
          
          
      compileSdkVersion rootProject.ext.version.compileSdkVersion
    
      defaultConfig {
          
          
          minSdkVersion rootProject.ext.version.minSdkVersion
          targetSdkVersion rootProject.ext.version.targetSdkVersion
          buildToolsVersion rootProject.ext.version.buildToolVersion
          versionCode rootProject.ext.version.versionCode
          versionName rootProject.ext.version.versionName
      }
    }
    
    //依赖的包
    dependencies {
          
          
        implementation(rootProject.ext.libsDependency.gson)
        implementation(rootProject.ext.libsDependency.glide)
        implementation(rootProject.ext.libsDependency.rxlifecycle)
    }
    

3. Modo de interacción del módulo de neutrones en componentes

3.1 Si no se usa ARouter, ¿qué esquemas se pueden usar para realizar la comunicación entre los submódulos en la creación de componentes?

  • EventBus
    • Desventajas: el costo de mantenimiento del objeto EventBean es demasiado alto, no es fácil de administrar
  • Transmisión
    • Desventajas: No es fácil de manejar, y todos se envían de manera uniforme
  • intención implícita
    • Desventajas: Configurado en AndroidManifest.xml, cada página que necesita saltar entre módulos necesita configurar los atributos de acción y categoría del filtro de intenciones.
    • El código de uso es el siguiente:
      <!--清单文件中需要添加intent-filter过滤器,然后设置action和category-->
      <activity android:name="com.tangkun.action.ActionImplActivity">
          <intent-filter>
              <action android:name="com.tangkun.myaction1" />
              <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>
      </activity>
      
      //在Activity中通过Intent传入Action名称来实现页面跳转
      Intent intent = new Intent();
      //设置的action名称需要和清单文件中通过action配置名称相同;还需要指定category,否则会报错
      intent.setAction("com.tangkun.myaction1");
      startActivity(intent);
      
  • método de carga de clases
    • Desventajas: es fácil escribir un nombre de paquete o nombre de clase incorrecto.可以尝试通过这种方式
    • El código de uso es el siguiente:
      Class classLoad = Class.forName("com.tangkun.action.ActionImplActivity");
      Intent intent = new Intent(this, classLoad);
      startActivity(intent);
      
  • La forma de usar el Mapa global
    • Desventaja: Para registrar una gran cantidad de objetos.可以尝试通过这种方式
    • Pasos:
    1. En la aplicación personalizada en el proyecto de la aplicación, registre todas las actividades en una colección en la biblioteca base, por nombre (p. ej.: MyInfoActivity) y Activity.class (p. ej.: MyInfoActivity.class)
    2. En el objeto de colección en la biblioteca base de la que depende el componente, elimine su objeto Class por nombre y luego inicie esta página a través de Intent.Pregunta
      : si desea eliminar un componente, ¿no tiene que agregar todos los componentes? en este componente Vaya a la Actividad de la colección y elimínela de la Aplicación personalizada.

3.2 ¿Cuál es la diferencia entre componentes, plug-in y modularización?

  • 组件化: Los componentes se pueden montar, desmontar y reutilizar libremente porque no existe una relación directa entre los componentes.
  • 插件化: La aplicación actual carga el archivo apk descargado del servidor y luego lo analiza para usarlo en la aplicación actual.
    • Por ejemplo: la aplicación Alipay contiene muchos complementos (Ele.me, Cainiao y Hello pertenecen al apk del complemento descargado)
    • Problemas existentes: compatibilidad de versiones, necesidad de adaptarse a los problemas de compatibilidad existentes en las versiones actuales del sistema, y ​​también preocuparse por los problemas de compatibilidad causados ​​por las actualizaciones del sistema Android. Debido a que es necesario
      iniciar actividades no registradas, se utilizará la tecnología Hook. En AMS Al detectar la página de inicio, reemplace la página de inicio con un ProxyActivity de proxy registrado y reemplácela con una página de inicio no registrada después de que AMS la detecte antes de ejecutar el ciclo de vida.
      为了规避插件化带来的兼容性问题,这些app都替换成加载网页的形式,来实现展示别的app功能.
  • 模块化: La creación de componentes consiste en dividir módulos para su reutilización, mientras que la modularización consiste en dividir módulos para la separación comercial.

4. Tecnología APT

procesador de anotaciones ( Annotation Processing Tool)

Concepto:
Es una herramienta para el procesamiento de anotaciones. Detecta los archivos de código fuente para averiguar la Anotación, y automáticamente genera código de acuerdo a las anotaciones. Si desea que se ejecute el procesador de anotaciones, debe pasar la herramienta APT (heredando su reescritura). AbstractProcessormétodo process(), Luego procéselo en este método) para procesar.
También se puede entender que solo después de declarar la herramienta APT, el programa puede ejecutar el procesador de anotaciones personalizado durante la compilación. En términos
generales: de acuerdo con las reglas, ayúdenos a generar código y generar documento de clases.

Ejemplos y comparaciones de algunos marcos que han adoptado la tecnología APT durante el tiempo de ejecución y la compilación:

  • Un ejemplo de un marco que utiliza la tecnología APT durante el tiempo de ejecución: Características
    de XUtils
    : debe analizarse cuando el usuario lo está utilizando, lo que genera una carga de rendimiento para el usuario, por lo que se eliminó.

  • Ejemplos de marcos que usan tecnología similar a APT durante la compilación:
    Butterknife, Dagger2, Room, DataBinding, ARouter
    Características: cuando los desarrolladores compilan código a través de herramientas de desarrollo, generarán el código correspondiente, por lo tanto, no afectará la experiencia del usuario.

5. JavaPoet de uso avanzado

Poeta / poʊət / poeta

  • EventBus genera código línea por línea de la forma tradicional.
    • 我的理解:读取.java/.kt文件中的每一行代码进行解析,看是否使用到了EventBus的注解相关代码,然后再去解析注解内容,进行处理;应该就是观察者设计模式,被观察者发送消息然后观察者去处理消息
  • ButterKnife y ARouter usan JavePoet para generar código.

¿Qué es JavaPoet?
JavaPoet es un marco de generación de código Java de código abierto lanzado por Square, que proporciona Java Api para generar archivos fuente .java.La función de este marco es muy práctica, y también es la sintaxis de OOP orientada a objetos de Java que estamos utilizado para código correspondiente.

(EventBus es práctico) ¿Cuál es la diferencia entre el método tradicional y JavaPoet?
El método tradicional: primero introduce el paquete, luego escribe la clase y finalmente escribe el método, que 总之就是把我们的java文件中的代码一行一行的通过BufferWriter写进去está más en línea con la lógica de uso normal; 可读性强
JavaPoet primero escribe el método, luego escribe la clase y finalmente guía el paquete, que es pensamiento orientado a objetos OOP, el rendimiento no es tan bueno como la forma tradicional en escenarios complejos.看起来费劲

Cómo usar JavaPoet:

  1. Heredar de AbstractProcessor a través de un procesador de anotaciones personalizado, y luego reescribir el método process () Cuando compilamos, se llamará a este método y la clase que se ha utilizado (por ejemplo: filtrado) se analizará en este método 注解;Arouter.class
  2. Durante el proceso de análisis, JavaPoet generará los correspondientes según el orden de los métodos, clases, paquetes y archivos .class文件. El directorio de los archivos generados es:
    build/generated/sources/...

6. Despliegue de proyectos de componentes, principio ARouter

Clasificado jerárquicamente:

  • proyecto de shell de la aplicación
  • componente comercial
    • Agregue anotaciones a clases en componentes comerciales, por ejemplo: agregue anotaciones de ARouter a Actividad
    • Al compilar, la información de esta clase quedará registrada en la tabla de enrutamiento de ARouter
    • De esta forma, un componente que no está directamente relacionado con el componente actual puede realizar saltos de página entre componentes a través de la información de clase registrada en la tabla de enrutamiento.
  • biblioteca de base pública
  • enrutador
    • La biblioteca donde se encuentra la clase de anotación ARouter-annotatation
    • ARouter-complier utiliza el servicio automático y luego hereda de AbstractProcessor para reescribir el método process () Cuando compilamos, el archivo .class correspondiente se generará de acuerdo con la anotación

7. Relación de mapeo entre ruta y grupo

Use la forma de agrupación para administrar Groupbajo este grupo . Por ejemplo: al usar ARouter para nuestros componentes comerciales, al anotar Actividad/Fragmento, debe usar la forma de nombre de módulo + nombre de clase. Por ejemplo: cuando quiera Al saltar a una página a través de la ruta ARouter, el nombre del grupo se analizará de acuerdo con la ruta, y la ruta de la página del grupo se recorrerá para encontrar la página a la que se saltará. La ventaja de agrupar es que no hay necesidad de recorrer todas las clases correspondientes a la ruta en el grupo, solo necesita recorrer la lista de rutas en el grupo actual para mejorar la eficiencia de la consulta.Path
/user/PersonDetailActivity

8.Gestión de generación de rutas y gestión de generación de grupos

Pasos de generación de rutas y grupos:

  1. Defina el almacén de ruta y el almacén de grupo para prepararse para el almacenamiento posterior
  2. Trabajo preparatorio: encapsulación de objetos de enrutamiento, el alcance de verificación es Actividad, etc.
  3. Validar objeto de ruta
  4. El primer gran paso: Camino
  5. El segundo gran paso: Grupo

Resumen: en el método reescrito por la clase
personalizada , al filtrar las anotaciones o y luego generar archivos para ellos , ( ) cuando compilamos, los archivos se generarán y almacenarán en el siguiente directorio: Dado que el marco depende de, por lo tanto, confiamos en los componentes de la biblioteca de componentes básicos para encontrar la clase que inicia la página a través del nombre del grupo ( ) y el nombre de la ruta ( ) , y luego podemos saltar a través de las páginas de componentes iniciando esta clase.AbstractProcessorprocess@ARouterActivityFragmentJavaPoet.java
JavaPoet采用OOP思想生成Java代码并存放在文件里,生成规则是按这个顺序:方法、类、包、文件
.class
build/generated/sources/...
ARouter公共基础库GroupPathClassIntentClass

9. Continuará: Navegación, comunicación y transmisión de ARouter con carga diferida entre componentes

Supongo que te gusta

Origin blog.csdn.net/tangkunTKTK/article/details/130834184
Recomendado
Clasificación