Entrada fija

miércoles, 9 de septiembre de 2015

Solucionar Rejects en MIUI (Failed Hunks)

¡Muy buenas a todos! Hoy estoy muy emocionado ya que he conseguido aprender y solucionar los rejects que impiden compilar MIUI usando patchrom. Me siento orgulloso de hacer un gran post explicándolo todo detalladamente, ya que por Internet no hay casi información.

Os explicaré teoría y el proceso para parchear manualmente, así aprendemos más todos ;-)
Dicho esto, empecemos:

-------------------------------------------------------------------------------------------------------

Una vez llegado el momento de usar la herramienta de parchear los framework para añadirle el código de MIUI (make firstpatch) saldrán en Terminal un montón de líneas que dirán: HUNK SUCCEEDED. 

Eso significa que se ha aplicado el parche correctamente. Sin embargo, en numerosas ocasiones veremos líneas que dirán lo siguiente:

                       



Eso significa que no se ha podido aplicar el parche, y se ha guardado el registro del error en un archivo ".smali.rej" en la carpeta patchrom/codename/temp/reject.

Decir que MIUI decompila los apk y los archivos jar del framework de nuestro dispositivo para añadirle su código. Esto lo hace usando el lenguaje "smali", que así resumido está "antes" que el formato JAVA. No hay mucha información sobre ello, aunque no es relevante para saber solucionar los rejects. Si quieres tienes más información aquí.

Pues una vez haya terminado el proceso "make firstpatch" lo primero que tendremos que hacer es dirigirnos a la carpeta "reject". Dentro de ella, encontraremos las siguientes carpetas:

  • android.policy.jar.out
  • services.jar.out  
  • framework.jar.out
  • framework2.jar.out
  • telephony-common.jar.out
Estos son los nombres de los archivos decompilados de nuestro  dispositivo (lógicamente solo es un nombre de carpeta añadiendo la terminación .out). 
Entonces abrimos por ejemplo "android.policy.jar.out" y seguimos abriendo todas las carpetas que son aparezcan hasta encontrar un archivo ".smali.rej"

Una vez encontrado, buscaremos el archivo base. Este se encontrará en la carpeta raíz de tu dispositivo. En este caso, estará en "patchrom/codename/android.policy.jar.out/smali/" y luego seguirá la misma ruta que el reject.
Es decir, si el reject está en:
patchrom/codename/temp/reject/android.policy.jar.out/smali/com/android/internal/policy/impl
Entonces el archivo a editar estará en:
patchrom/codename/android.policy.jar.out/smali/com/android/internal/policy/impl
Los dos archivos deben llamarse exactamente igual, exceptuando que el reject tendrá la extensión ".rej" añadida.

Una vez ubicado el reject y el archivo base, abriremos los dos con Gedit (o el editor de texto que prefieras).
Nos fijamos en el reject; nos encontraremos con algo así:

    


Explico la terminología:

  • *** XX,XX*** : esto indica las líneas dónde el parche esperaba que se encontraran las líneas que aparecen debajo. Es decir, que deberían haber estado entre la línea XX y la XX.
  • --- XX,XX--- : esto indica las líneas dónde quedarían las líneas una vez aplicado el parche.
Sin embargo, nos olvidamos de las líneas dónde deberían estar o no, y nos centramos en lo siguiente:
  • Lo que aparece debajo de los asteriscos es cómo aparecen antes de parchear.
  • Lo que aparece debajo de los guiones es cómo aparecerán una vez aplicado el parche.
Y claro, nosotros estamos aquí porque no se pudo aplicar el parche, por lo que debemos aplicarlo nosotros manualmente.

Para ello, hay que saber la simbología:

  • + significa que esa línea ha sido añadida por el parche.
  • - significa que esa línea ha sido eliminada por el parche.  
  • ! significa que esa línea ha sido modificada por el parche.
Sabido esto, vamos a arreglar ese reject...Voy a solucionar el reject del ejemplo, luego tú harás lo correspondiente al  tuyo. Primero de todo, nos fijamos en el source input (asteriscos):



Con esto sabemos que así es como aparecen esas líneas en el archivo base. Entonces nos dirigimos al archivo base y buscamos esas líneas. Estarán unas 200 líneas arriba o abajo de como indica el reject. En este caso, estarán cerca de la línea 400 y pico.

*Atención: las líneas pueden aparecer con algunos valores diferentes a los que dice el source input del reject, es normal. También pueden aparecer en distinto orden, etc.*

Una vez encontradas las líneas, veremos lo siguiente

          

Como veis, algunas están en otro orden y otras directamente no están. Entonces nos fijamos ahora en el "after patch" (guiones):





Entonces sabemos que:

  •  La línea ".field private  final mPowerLongPress:Ljava/lang/Runnable;" que aparece en el source input es editada. Lo sabemos porque lleva la exclamación (!) delante. Al mirar el "after patch" vemos que tendrá que verse así: ".field private mPowerLongPress:Ljava/lang/Runnable;".
  • Vemos que en el "after patch" se indica que hay que agregar la línea ".field private final mQuickBootLock:Ljava/lang/Object;" ya que tiene delante el signo más (+).
Entonces lo que haríamos sería editar una línea como indica el "after patch" y agregar otra. Las adiciones (+) se copian tal cual están en el reject.

Sin embargo hay que tener en cuenta una cosa, y es que los archivos están parcialmente parcheados. Por ello, no tendrás que hacer todo lo que el reject dice. Por ejemplo, si te fijas, la adición que el reject indica que tengo que hacer ya está aplicada en el archivo base.
Entonces debes fijarte siempre y asegurarte de que la línea ya está añadida/removida.

Entonces, para solucionar este reject solo tendré que editar una línea. Una vez hecho, la parte a editar del archivo base quedará así:

            

Y ahora solo tocará guardar los cambios, salir, y pasar al siguiente reject para seguir aplicando parches y parches.

Decir que en un reject encontrarás más de una caja de modificación. Con caja de modificación me refiero al conjunto del "source input" y el "after patch". Es decir, te podrás encontrar esto:




Entonces haríamos cada uno por separado. El primero ya lo hice yo, entonces pasaríamos al segundo:



Pero ya te tocará hacerlo a ti ;-) Hasta aquí el tutorial sobre solucionar los rejects. Suerte a todos y cualquier pregunta en comentarios.


¡Listo! Has Aprendido a Solucionar Rejects



1 comentario:

  1. Hola javier alonso de donnde eres podes explicar otro ejemplo porfavor

    ResponderEliminar