Modificar los archivos de clase en AAR y Jar

hola, 2021

prefacio

Recientemente, ayudé a un colega a resolver un problema difícil y el proceso de excavación fue bastante interesante. Documéntalo aquí. (PD: la razón principal es que el proyecto es relativamente grande y solo tenemos Androidla autoridad de desarrollo para una parte del código comercial de todo el proyecto. Por lo tanto, no se pueden usar algunos medios convencionales para resolver problemas).

pregunta

Requisitos: Webpágina H5e nativeinteracción, guardar base64图片.

Problema: Usando el Hybridprotocolo encapsulado existente, se encontró en la prueba de integración final que algunos teléfonos móviles no se pudieron guardar con éxito.

  • Durante la depuración, se descubrió H5que el formato del protocolo original se usaba para llamar al nuevo protocolo y que nativelos registros y los puntos de interrupción del nuevo protocolo registrado en el lado comercial no se podían activar.
  1. Sospecha del problema del formato del protocolo original, cuando H5 usa el formato del protocolo original para llamar al nuevo protocolo que ya existe en la línea, se encuentra que la nativellamada puede ser exitosa y este problema se descarta;
  2. Al sospechar el problema del parámetro en el nuevo protocolo, H5 elimina el parámetro en el nuevo protocolo y descubre que se puede llamar a la nativeimplementación del nuevo protocolo. Se supone que el problema puede deberse a los parámetros del protocolo;
    1. Encuentre el lugar donde se dispara la llamada de protocolo a través del punto de interrupción, es decir, H5el nativelugar donde se comunican los datos. Se encuentra que el Hybridprotocolo actual utiliza el método nativede replicación de extremo a extremo onJsPrompty el JavaScriptmétodo de interceptación prompt().
    2. Vuelva a cambiar los parámetros del nuevo protocolo y vuelva a llamar. El punto de interrupción encontró que los datos transmitidos se truncaron en el método nativede replicación de un extremo a otro , y el análisis de datos falló y no se pudo reenviar a la siguiente prueba de servicio.onJsPrompt

Problemas

El puente de comunicación original Hybrid协议utilizado en el proyecto ahora enfrenta **una gran inundación (datos más grandes)** y hay un problema de obstáculos.复写prompt方法

selección de solución

  1. Cambie la imagen en el formato a H5la imagen en el formato;base64http

    La imagen está H5dibujada originalmente y la experiencia interactiva de la descarga del cliente después de la carga es demasiado pobre;

  2. Nuestro lado comercial implementa nuestro propio conjunto de Hybridprotocolos;

  3. Que el departamento de infraestructura del proyecto modifique el Hybridacuerdo existente;

    El error descubierto por la noche requerirá pruebas cerradas mañana. Es difícil completar el cambio de infraestructura interdepartamental en 24 horas.

Al final, elegimos la segunda opción, implementando Hybridnosotros mismos un conjunto de protocolos.

realización de la solución

  1. Get WebViewllama addJavascriptInterfaceal método para H5agregar JSobjetos al entorno.
  2. La JSherramienta de desarrollo le permite llamar al nuevo JSmétodo de comunicación de acuerdo con el formato del protocolo anterior.
  3. Analice los datos obtenidos y tírelos al onJsPromptobjeto de la clase contenedora que originalmente procesó los datos en el método.

Si podemos cambiar todo el código del proyecto, entonces no hay dificultad en esta solución. La dificultad es que solo tenemos H5el caparazón más externo de esta página Activity, y la encapsulación WebViewno expone el método que queremos al mundo exterior. Entonces, la implementación del tercer paso del programa tiene problemas.

Tenemos dos soluciones a este problema:

proyecto-base64-híbrido.jpg

  1. Esta vez, se hacen dos juegos de lógica inyectando el protocolo de comunicación JSdel objeto Hybridy el Hybridprotocolo original del proyecto;
  2. Métodos de llamada hooken otras clases originales a través de tecnología negra múltiple ;dispatch

Si ese fuera el caso, no habría artículo para este artículo.

Bueno, después de tanto divagar, finalmente comencé a llegar al punto. No sé cuántos estudiantes planean seguir leyendo.

Podemos tomar todos AARlos archivos del proyecto, pensar si podemos modificar el código fuente para proporcionar lo que queremos APIy luego resolver el problema actualizando AARla versión . Bueno, el enfoque de este artículo ha salido a modificar el archivo de clase en AAR .

Modificar el archivo de clase en AAR

opcion uno

Primero elimine AARlos que desea modificar classy vuelva a empaquetarlos como nuevos AAR. El proyecto depende de la nueva versión AARy luego crea una clase idéntica en el paquete correspondiente del proyecto.

  1. Descompile el contenido del archivo original classy cópielo en la clase recién creada y ejecútelo directamente.
  2. Descompile el contenido del archivo original classy cópielo en la clase recién creada. Finalmente, vuelva a compilar el generado classy agréguelo AARa repackage para generar uno nuevo AAR.

Si la clase está ofuscada, entonces esta solución básicamente se elimina. Debido a que hay una gran cantidad de paquetes con el mismo nombre de clase en el classcontenido descompilado, es imposible confirmar que la clase utilizada en esta llamada siga siendo un paquete durante esta recompilación.

Como ejemplo, la siguiente estructura se ve a menudo después de la ofuscación.

com.xx.a
com.xx.a.a

Al escribir el siguiente código, le indicará que ano hay ninguna clase debajo de la clase a, en lugar de abuscar la clase debajo del paquete a.

a ma = new com.xx.a.a();

Opción II

aop-asm.JPEG

De acuerdo con la figura anterior, se puede ver que este esquema es para la programación de aspectos. Solo necesitamos agregar uno o dos métodos a una clase para resolver el problema del acceso limitado. Teniendo en cuenta la dificultad del problema actual que elegimos Javassist. Debido a que la manipulación del código de bytes real en Javassistel nivel del código fuente APIes más fácil de usar, se puede usar sin un conocimiento profundo de la especificación.ASMJVM

Javassist documento oficial

jarDirección de descarga del paquete Github:javassist

//需要添加的方法
//public void executeJSCmd(String var1) {
    
    
//    if (this.mActionDispatcher != null) {
    
    
//        Message var2 = this.mActionHandler.obtainMessage(0);
//        var2.obj = var1;
//        this.mActionHandler.sendMessage(var2);
//    }
//}
//需要操作的class的类名:com.xxx.android.web.webview.BaseWebChromeClient
public class Test {
    
    
    public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException {
    
    
        ClassPool classPool = ClassPool.getDefault();
        // 必须将class文件放在这个工程编译后的class文件中,路径也对应起来
        CtClass ctClass = classPool.get("com.xxx.android.web.webview.BaseWebChromeClient");
        CtMethod newmethod = CtNewMethod.make("public void executeJSCmd(String message) { if (this.mActionDispatcher != null) { android.os.Message msg = this.mActionHandler.obtainMessage(0); msg.obj = message; this.mActionHandler.sendMessage(msg); } }",ctClass);
        ctClass.addMethod(newmethod);
        ctClass.writeFile();
    }
}

Cabe señalar que, por ejemplo, el método que agregamos involucra otras clases que necesitan escribir la ruta completa android.os.Message, y el paquete relacionado con esta clase jartambién debe agregarse al entorno en ejecución (también puede colocar el archivo de clase de esta clase en el directorio de archivos de clases del proyecto compilado); de lo contrario, se informará un error durante la ejecución.

Exception in thread "main" javassist.CannotCompileException: [source error] no such class: android.os.Message
	at javassist.CtNewMethod.make(CtNewMethod.java:78)
	at javassist.CtNewMethod.make(CtNewMethod.java:44)
	at com.test.pattern.Test.main(Test.java:13)

punto importante

Al reemplazar o eliminar, jares classmejor no descomprimir y luego usar el paquete nombrado.Cuando use el Maxcomando jarpara empaquetar habrá un .DS_Storearchivo. BetterZipLa herramienta de compresión y descompresión que uso es muy conveniente para agregar y eliminar en jarel paquete sin descomprimir .class

El artículo está completo aquí, si tiene otras necesidades para comunicarse, ¡puede dejar un mensaje ! !

Si quieres leer más artículos del autor, puedes consultar mi blog personal y cuenta pública:
Revitalizar la Ciudad del Libro

Supongo que te gusta

Origin blog.csdn.net/stven_king/article/details/113188698
Recomendado
Clasificación