15 votos

¿Cómo desempaquetar / volver a empaquetar system.img de una ROM de Android?

Tengo un dispositivo OnePlus 6T que tiene un sistema de partición A/B y tiene una ROM de tipo usuario es decir [ro.build.type]: [user]. Este dispositivo está rooteado con Magisk. Tengo un requisito (Quiero colocar un archivo sepolicy personalizado en el directorio system_root) para modificar system.img.

He probado diferentes herramientas como:

  1. simg2img:

    OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea/img-tools$ ./simg2img system.img sys.raw Formato de archivo disperso no válido en la cabecera mágica Error al leer el archivo disperso OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea/img-tools$

  2. imgtools

    OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea/imgtool$ sudo ./imgtool system.img extract [sudo] contraseña para OMEN: system.img no es una imagen reconocida. Lo siento OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea/imgtool$

  3. y más herramientas incluso en Windows..

pero ninguna de ellas es capaz de analizar mi system.img.

He copiado system.img directamente de la configuración de la ROM de OnePlus6T que instala Android 9 en este dispositivo sin ningún problema.

¿Alguna ayuda sobre:

  1. ¿Cómo arreglar el system.img para que se extraiga y repaque correctamente?
  2. ¿Algún comando que pueda desempaquetar/reempacar system.img?
  3. ¿Alguna herramienta funcional para lograr esta tarea?

Actualización 1: He ejecutado file system.img y he descubierto que es una imagen ext2 y las herramientas soportan ext4.

system.img: Sistema de archivos ext2 de Linux rev 1.0, UUID=d09c08e9-628d-590e-a610-3a14de2a8db0 (extensiones) (archivos grandes) (archivos enormes)

Actualización 2: Intenté encontrar el número mágico y obtuve el siguiente resultado:

OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea/imgtool$ xxd system.img | head
00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea/imgtool$ 

Actualización 3: Encontré que la imagen ya está desempaquetada. Así que para agregar el archivo requerido, he montado la imagen como sudo mount -o loop system.img system_mount y luego intentado copiar los contenidos a otra carpeta con cp system_mount/* system/ para poder agregar el archivo necesario y hacer una nueva imagen de ella, pero obtuve los siguientes errores:

root@OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea# mkdir system && cp system_mount/* system/
cp: se omite el directorio 'system_mount/acct'
cp: no se puede acceder a 'system_mount/bin': No existe el archivo o directorio
cp: no se puede acceder a 'system_mount/bt_firmware': No existe el archivo o directorio
cp: no se puede acceder a 'system_mount/bugreports': No existe el archivo o directorio
cp: no se puede acceder a 'system_mount/cache': No existe el archivo o directorio
cp: no se puede acceder a 'system_mount/charger': No existe el archivo o directorio
cp: no se puede acceder a 'system_mount/charger_log': No existe el archivo o directorio
cp: se omite el directorio 'system_mount/config'
cp: se omite el directorio 'system_mount/d'
cp: se omite el directorio 'system_mount/data'
cp: se omite el directorio 'system_mount/dev'
cp: no se puede acceder a 'system_mount/dsp': No existe el archivo o directorio
cp: no se puede acceder a 'system_mount/etc': No existe el archivo o directorio
cp: no se puede acceder a 'system_mount/firmware': No existe el archivo o directorio
cp: se omite el directorio 'system_mount/lost+found'
cp: se omite el directorio 'system_mount/mnt'
cp: se omite el directorio 'system_mount/odm'
cp: se omite el directorio 'system_mount/oem'
cp: se omite el directorio 'system_mount/op1'
cp: se omite el directorio 'system_mount/op2'
cp: no se puede acceder a 'system_mount/persist': No existe el archivo o directorio
cp: se omite el directorio 'system_mount/postinstall'
cp: se omite el directorio 'system_mount/proc'
cp: no se puede acceder a 'system_mount/product': No existe el archivo o directorio
cp: se omite el directorio 'system_mount/res'
cp: se omite el directorio 'system_mount/sbin'
cp: no se puede acceder a 'system_mount/sdcard': No existe el archivo o directorio
cp: se omite el directorio 'system_mount/storage'
cp: se omite el directorio 'system_mount/sys'
cp: se omite el directorio 'system_mount/system'
cp: se omite el directorio 'system_mount/vendor'
root@OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea#

1 votos

¿El system.img que tienes comienza con el hexadecimal 3AFF 26ED? Si no es así, verifica si los bytes mágicos del encabezado del archivo son algo conocido.

0 votos

Está mostrando como 00 00 00 00.. Por favor verifica la Actualización 2.

1 votos

Parece que la imagen ya está desempaquetada.

7voto

Giacomo Puntos 56

Estos comandos no siempre funcionan: a veces el tamaño de system_new.img se vuelve mayor que system.img.ext4 y por lo tanto no se flashea en el dispositivo. Según mi conocimiento, el nuevo tamaño de la imagen debería ser igual o menor que el tamaño de la imagen original del sistema. ---- Si alguien puede determinar los nuevos comandos, por favor compártalos.

Para Desempacar-Modificar-Parchear el system.img, he seguido el siguiente procedimiento:

a) Desempacar

  • Ejecuta file system.img y asegúrate de que system.img es una Imagen Android Esparsa.
  • Renombra system.img a system.img.ext4. // No es necesario si vas a usar otro nombre para la imagen raw en los siguientes pasos.
  • Con simg2img system.img.ext4 system.img, obtendrás un archivo de imagen raw llamado system.img
  • Con mkdir system, crea un directorio para montar system.img
  • Con sudo mount -t ext4 -o loop system.img system/ obtendrás todos los archivos de system.img en la carpeta system

b) Modificando

  • Con ls -l system/init.rc nota los permisos: 750
  • Con sudo chmod 777 system/init.rc da permisos de escritura
  • Con sudo echo "#MODIFICACIÓN " >> system/init.rc realiza alguna modificación en init.rc
  • Con sudo chmod 750 init.rc restablece init.rc a los permisos notados

c) Calcular el tamaño del sector del sistema

  • Con tune2fs -l system.img | grep "Block size\|Block count" obtendrás el tamaño del bloque y el conteo
  • Con echo $((1553064 * 4096)) multiplica ambos resultados. Yo obtuve 6361350144

d) Empaquetar

  • Con sudo make_ext4fs -s -l 6361350144 -a system system_new.img system/ obtendrás system_new.img "Imagen Android Esparsa" que tiene todos los cambios

0 votos

Recibiendo el error 'no se pueden establecer los permisos de Android - se ha construido sin el soporte de Android' al ejecutar el comando de empaquetado. ¿Alguna idea?

0 votos

Nunca obtenga este error. Probablemente usando otra (o una versión anterior) de la herramienta make_ext4fs puede resolver su problema.

1 votos

Gracias por tu respuesta, ¿Podrías decirme qué significa 'sys/' mencionado al final del comando de empaquetado?

1voto

becomputer06 Puntos 5806

Fácil y funciona:

truncate --size=3000M system.img
mke2fs -t ext4 -L system_rw system_rw.img
sudo mount system_rw.img
sudo cp -R --preserve=all /path_to_the_ronly_system.img_mountpoint/. /system_rw_mountpoint

Ejemplo para cp: sudo cp -R --preserve=all /media/user/_/. /media/user/system_rw/

Eso es todo amigos.

0voto

Dominik Puntos 31

Usé esta herramienta en Linux, pude extraer la imagen de mi emulador usando ext4 en una máquina virtual con Ubuntu.

https://github.com/qmfrederik/extfstools

Todavía estoy tratando de encontrar una manera de empaquetarlo nuevamente. Actualizaré aquí una vez que lo logre.

0 votos

¿Por qué no simplemente montar? Volver a empaquetar es simple. Crea un archivo disperso con truncate. Haz mkfs.ext4 y monta. Agrega archivos y desmonta. No se necesitan herramientas especiales. ¿Pero cómo preservarías los permisos, la propiedad, las marcas de tiempo, los atributos extendidos de los archivos de esta manera?

0 votos

@IrfanLatif No sé cómo montar en una VM. y b) Soy un novato en ubuntu. Instalé vm anoche. c) Hasta anoche los permisos, etc. eran desconocidos para mí. Solo necesito ejecutar una pequeña aplicación automáticamente en un servidor en un emulador, así que no creo que necesite preocuparme por los permisos, pero sí quiero proporcionar acceso de root a algunas aplicaciones. ¿Te importaría tener una charla al respecto y ayudarme?

0 votos

Chatea sobre qué? Haz una pregunta especifica si no ha sido respondida ya. Para temas básicos de Linux/Android, realiza una investigación y estudia. Estoy disponible para ayudar si no estoy ocupado.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X