"Después del juego es antes del juego"
Sepp Herberger

Mostrando entradas con la etiqueta android. Mostrar todas las entradas
Mostrando entradas con la etiqueta android. Mostrar todas las entradas

miércoles, 16 de diciembre de 2020

Enredando con una ROM Rockchip RK3326 (II): examinando las particiones de la imagen.

Ya hemos desempaquetado la ROM en Enredando con una ROM Rockchip RK3326 (I). Vamos ahora a ver la estructura. Tenemos un directorio donde se ha descomprimido la imagen:
# tree Image/
└── Image
   ├── boot.img
   ├── kernel.img
   ├── kernel.img.krnl
   ├── MiniLoaderAll.bin
   ├── misc.img
   ├── oem.img
   ├── parameter.txt
   ├── parameter.txt.parm
   ├── recovery.img
   ├── resource.img
   ├── system.img
   ├── trust.img
   ├── uboot.img
   └── vendor.img
Veamos de que tipo es cada fichero:
# file ./Image/*
boot.img:           Android bootimg, kernel (0x10008000), ramdisk (0x11000000), second stage (0x10f00000), page size: 2048, cmdline (buildvariant=user)
kernel.img:         data
kernel.img.krnl:    data
MiniLoaderAll.bin:  data
misc.img:           data
oem.img:            Android sparse image, version: 1.0, Total of 32768 4096-byte output blocks in 6 input chunks.
parameter.txt:      ASCII text, with very long lines
parameter.txt.parm: Par archive data
recovery.img:       Android bootimg, kernel (0x10008000), ramdisk (0x11000000), second stage (0x10f00000), page size: 2048, cmdline (buildvariant=user)
resource.img:       data
system.img:         Android sparse image, version: 1.0, Total of 665600 4096-byte output blocks in 20 input chunks.
trust.img:          data
uboot.img:          data
vendor.img:         Android sparse image, version: 1.0, Total of 98304 4096-byte output blocks in 8 input chunks.
Hay un poco de todo:
  • Ficheros en formato "data" (que significa "no sé que carajos hay ahí dentro")
  • Ficheros en formato "Android bootimg"
  • Ficheros en formato "Android sparse image"
Todo estos ficheros se corresponden con distintas particiones del sistema Android, que en el caso de nuestra tablet serian realmente:
Partition Info(gpt):
NO  LBA        Size       Name
01  0x00004000 0x00002000 uboot
02  0x00006000 0x00002000 trust
03  0x00008000 0x00002000 misc
04  0x0000a000 0x00008000 resource
05  0x00012000 0x00010000 kernel
06  0x00022000 0x00010000 boot
07  0x00032000 0x00020000 recovery
08  0x00052000 0x00038000 backup
09  0x0008a000 0x00002000 security
10  0x0008c000 0x000c0000 cache
11  0x0014c000 0x00514000 system
12  0x00660000 0x00008000 metadata
13  0x00668000 0x000c0000 vendor
14  0x00728000 0x00040000 oem
15  0x00768000 0x00000400 frp
16  0x00768400 0x032d5bdf userdata
Las particiones anteriores las averiguamos entrando en "adb shell" y haciendo algo de esto.

Como se ve, casi todas las particiones reales de la tablet se corresponden con un fichero .img de los extraidos de update.img. Al actualizar el firmware con update.img lo que se hace realmente es desempaquetar y escribir estos ficheros sobre cada partición, ni más ni menos.

Vamos a husmear dentro de las particiones que podamos descomprimir, a ver que encontramos. Las "data" no las tocamos porque no sabemos como abrirlas.

1. Examinando particiones Android bootimg.

Empezamos por boot.img, que está en formato "Android bootimg":
# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/android-serialport-api/android_bootimg_tools.tar.gz
# tar xfvz android_bootimg_tools.tar.gz
-rwxrwxr-x cedric/cedric 12095 2011-10-31 20:54 mkbootimg
-rwxrwxr-x cedric/cedric 11936 2011-10-31 20:54 unpackbootimg
# mkdir boot
# ./unpackbootimg -i /ruta/al/fichero/boot.img -o boot
Con esto se desempaqueta el contenido al directorio boot. Veamos que hay dentro:
# file boot/*
boot.img-base:     ASCII text
boot.img-cmdline:  ASCII text
boot.img-pagesize: ASCII text
boot.img-ramdisk:  ASCII cpio archive (SVR4 with no CRC)
boot.img-zImage:   data
En los 3 primeros ficheros son de configuración, los dos últimos son imágenes comprimidas de ramdisk e imagen boot. Vamos a descomprimir el ramdisk, que contiene dentro un sistema de ficheros:
# mkdir ramdisk
# cd ramdisk
# zcat ../boot.img-ramdisk.gz | cpio -idmv
# cd ..
# tree ramdisk
ramdisk/
├── acct
├── bugreports -> /data/user_de/0/com.android.shell/files/bugreports
├── cache -> /data/cache
├── charger -> /sbin/charger
├── config
├── d -> /sys/kernel/debug
├── data
├── default.prop -> system/etc/prop.default
├── dev
├── drmboot.ko
├── etc -> /system/etc
├── fstab.rk30board
├── init
├── init.connectivity.rc
├── init.environ.rc
├── init.optee.rc
├── init.rc
├── init.rk30board.bootmode.emmc.rc
├── init.rk30board.bootmode.nvme.rc
├── init.rk30board.bootmode.unknown.rc
├── init.rk30board.environment.rc
├── init.rk30board.rc
├── init.rk30board.usb.rc
├── init.rk3326.rc
├── init.rockchip.rc
├── init.usb.configfs.rc
├── init.usb.rc
├── init.zygote32.rc
├── init.zygote64_32.rc
├── mnt
├── oem
├── proc
├── res
│   └── images
│       └── charger
│           ├── battery_fail.png
│           ├── battery_scale.png
│           └── font.png
├── rk30xxnand_ko.ko
├── sbin
│   ├── charger
│   ├── mkdosfs
│   ├── ueventd -> ../init
│   └── watchdogd -> ../init
├── sdcard -> /storage/self/primary
├── storage
├── sys
├── system
├── ueventd.rc
├── ueventd.rk30board.rc
├── vendor
└── verity_key
Como se ve, tiene un sistema de ficheros con sus script y procesos para el arranque del tablet. Si hacemos lo mismo con recovery.img veremos que hay un minisistema Linux con muchas cositas. Recordemos que el recovery es un Linux que muestra un menú con ciertas funciones básicas de formateo y poco más.
# mkdir recovery
# ./unpackbootimg -i /ruta/al/fichero/recovery.img -o recovery
# cd ramdisk-recovery
# zcat ../recovery.img-ramdisk.gz | cpio -idmv
# cd ..
# tree ramdisk-recovery
ramdisk-recovery/
├── acct
├── bugreports -> /data/user_de/0/com.android.shell/files/bugreports
├── charger -> /sbin/charger
├── config
├── d -> /sys/kernel/debug
├── data
│   └── misc
│       └── wifi
├── default.prop -> prop.default
├── dev
├── drmboot.ko
├── etc
│   ├── bluetooth
│   ├── firmware
│   ├── mke2fs.conf
│   └── recovery.fstab
├── fstab.rk30board
├── init
├── init.rc
├── init.rk30board.usb.rc
├── init.usb.configfs.rc
├── init.usb.rc
├── lib
│   └── firmware
├── mnt
.........................
.........................
.........................
│   │       └── wifi_efuse_8723ds.map
│   ├── firmware
│   └── lib
│       └── modules
│           └── wifi
│               ├── 8188eu.ko
│               ├── 8188fu.ko
│               ├── 8189es.ko
│               ├── 8189fs.ko
│               ├── 8723bs.ko
│               ├── 8723bu.ko
│               ├── 8723cs.ko
│               ├── 8723ds.ko
│               ├── 8822be.ko
│               └── bcmdhd.ko
└── verity_key
Bueno, pues esto no tiene más. Vamos a avanzar mirando más cosas.

2. Examinando particiones Android sparse image.

Vamos a las otras particiones, las "Android sparse image": oem, vendor y system, descritas de forma general aquí. El formato "sparse image" es un tipo de imagen comprimido con menos huecos en blanco para ocupar menos tamaño. Para trabajar con su contenido hay que descomprimir el archivo antes de nada, usando la utilidad "simg2img" que está en el paquete Ubuntu "android-tools-fsutils".
# apt-get install android-tools-fsutils
# mkdir system
# cd system
# simg2img /ruta/al/fichero/system.img  system-no-sparse.img
# file system-no-sparse.img
system-no-sparse.img: Linux rev 1.0 ext4 filesystem data, UUID=bd2ccb6e-a94e-53be-9c80-3f438b342f58, volume name "system" (extents) (64bit) (large files) (huge files)
El sistema ext4 es ya un sistema manejable que podemos montar con "mount -o loop":
# mount -t auto -o loop system-no-sparse.img  mnt
# tree -d mnt/
├── app
│   ├── BasicDreams
│   │   └── oat
│   │       └── arm64
│   ├── Bluetooth
│   │   ├── lib
│   │   │   └── arm64
│   │   └── oat
│   │       └── arm64
......................
......................
│   └── YouTube
│       └── oat
│           ├── arm
│           └── arm64
├── bin
│   └── hw
├── etc
│   ├── bluetooth
│   ├── init
│   ├── permissions
│   ├── ppp
│   ├── preferred-apps
│   ├── seccomp_policy
│   ├── security
│   │   └── cacerts
│   ├── selinux
│   │   └── mapping
│   └── sysconfig
├── fake-libs
├── fake-libs64
├── fonts
├── framework
│   ├── arm
│   ├── arm64
│   └── oat
│       ├── arm
│       └── arm64
├── lib
│   ├── drm
│   ├── hw
│   ├── modules
│   └── vndk-sp
├── lib64
│   ├── drm
│   ├── hw
│   └── vndk-sp
├── lost+found
├── media
│   └── audio
│       ├── alarms
│       ├── notifications
│       ├── ringtones
│       └── ui
├── priv-app
│   ├── BackupRestoreConfirmation
│   │   └── oat
│   │       └── arm64
......................
......................
│   │       └── arm64
│   └── WallpaperCropper
│       └── oat
│           └── arm64
├── tts
│   └── lang_pico
└── usr
    ├── hyphen-data
    ├── icu
    ├── idc
    ├── keychars
    ├── keylayout
    ├── share
    │   ├── bmd
    │   └── zoneinfo
    └── srec
        └── en-US
Esta partición como vemos contiene el sistema android completo, que se monta sobre /system en el arranque, con todas las aplicaciones por defecto y todo el entorno y comandos. Si queremos retocar el firmware del tablet será esta partición la que hay que modificar.

Las otras dos particiones son oem.img y vendor.img. Oem "incorporates OEM (Original Equipment Manufacturer i.e. hardware manufacturer or Mobile Phone brand) small customization (modifications) to original Android (AOSP) during OTA updates such as customized system properties values etc.". Esta partición se monta sobre la ruta /oem cuando el tablet está en funcionamiento. La convertimos y montamos como hicimos con system:
# mkdir oem
# cd oem
# simg2img /ruta/al/fichero/oem.img  oem-no-sparse.img
# file oem-no-sparse.img
oem-no-sparse.img: Linux rev 1.0 ext4 filesystem data, UUID=bd2ccb6e-a94e-53be-9c80-3f438b342f58, volume name "oem" (extents) (64bit) (large files) (huge files)
# mkdir mnt-oem
# mount -t auto -o loop oem-no-sparse.img  mnt-ome
# tree mnt-oem/
mnt-oem/
├── etc
│   ├── fs_config_dirs
│   ├── fs_config_files
│   └── package_performance.xml
└── lost+found
Para la partición vendor "is sister partition of /system on Android devices which holds system applications and libraries that do not have source code available on AOSP but added by vendors (OEM's). It also contains SoC firmware images i.e. hardware specific libraries and binaries (OpenGL, ISP...). Proprietary blobs (HALs) usually live in /vendor as shared libraries (.so files) which are loaded by Android binders when processes call a hardware component. This partition was optional before Treble support and /vendor used to be just a symlink to /system/vendor"..
# mkdir vendor
# cd vendor
# simg2img /ruta/al/fichero/vendor.img  vendor-no-sparse.img
# mount -t auto -o loop vendor-no-sparse.img  mnt
# tree -d mnt/
├── bin
│   └── hw
├── etc
│   ├── bluetooth
│   ├── firmware
│   ├── init
│   ├── permissions
│   ├── seccomp_policy
│   ├── selinux
│   ├── usb_modeswitch.d
│   └── wifi
├── lib
│   ├── egl
│   ├── hw
│   ├── mediacas
│   ├── mediadrm
│   ├── modules
│   │   └── wifi
│   ├── optee_armtz
│   ├── soundfx
│   └── vndk-sp
├── lib64
│   ├── egl
│   ├── hw
│   ├── mediacas
│   ├── mediadrm
│   ├── soundfx
│   └── vndk-sp
├── lost+found
├── media
└── overlay
    └── SysuiDarkTheme
Y ya está. Supongo que la mayoría de las imágenes de los distintos sistemas Android se desempaquetará y manejará de una menera similar.


La sonda Chang'e-5 recogió sus 2kg de rocas lunares (ya era hora desde los años 70), despegó y está de vuelta.



Hoy 16 de diciembre caerá en algún sitio de Mongolia Interior (que buen lugar para mandar a algunos que yo me sé). Como vemos, si hace falta irán a caballo a recuperarla donde aterrice.


lunes, 14 de diciembre de 2020

Enredando con una ROM Rockchip RK3326 (I): desempaquetando la imagen.

Los tablets Techcomputer L108MR que nos enviaron tienen un chipset Rockchip rk3326 (esto lo averiguamos con un "adb shell getprop"). Como tenemos el fichero update.img con la imagen de la ROM suministrada por el distribuidor, he estado curioseando en sus entrañas, ya que no conocía mucho sobre estos chipsets del tipo Rockchip (muy usados en Android TV) y tenia interés por él. El fichero update.img viene en un formato desconocido:
# file update.img 
update.img: data
Hay varias maneras de desempaquetar este fichero para ver su contenido:

1. imgRePackerRK.

Empezamos con imgRePackerRK (RockChip's firmware images unpacker/packer). El nombre lo dice todo, lo descargamos y lo ejecutamos:
# ./imgrepackerrk update.img
	imgrepackerrk (version 1.06 linux)
	Rockchip firmware batch/update images unpacker/packer
    .....
	--- Firmware unpacking ---
	Can't open file "update.img" for reading
La primera en la frente. Dice que no puede abrir update.img. Tras mil pruebas no he sido capaz de hacer que funcione en Ubuntu: ni cambiando a otro sistema de archivos, ni cambiando permisos, ni nada. Pero probando en Windows si funciona, toma ya:
C:\Users\Administrador\Desktop\rockchip>imgrepackerrk update.img

        imgRepackerRK (version 1.06 windows)
        Rockchip firmware batch/update images unpacker/packer

        (c) RedScorpio, Moscow, 2013-2017
            RedScorpio@land.ru

        Detected OS:    Windows 7 Pro SP 1.0 [build 7601] x64
        ==========================[ START ]==========================

        --- Firmware unpacking ---

        "RKFW" image file detected

        Batch image header from "update.img" was read
        Image properties:
                Type            RockChip batch image ("RKFW")
                Version         8.1.0
                Date            2019.11.19
                Time            10:15:30
                ChipID          0x33333236
                Code(?)         0x01060000
                RKFWtype        0x00000001
                Unknown_1       0x00000000

        Unsupported ChipID
Se queja con "Unsupported ChipID". Menos mal que imgrepackerrk tiene el parámetro "/cid" para soslayar esto:
# imgrepackerrk 	Rockchip firmware batch/update images unpacker/packer

	(c) RedScorpio, Moscow, 2013-2017
	    RedScorpio@land.ru

	Usage:	./imgrepackerrk [options] 
	
		./imgrepackerrk [options] <[path/]name[.ext]>		- for unpacking
		./imgrepackerrk [options] <[path/]name[.ext]>.dump	- for packing
		./imgrepackerrk [options] <[path/]name[.ext]>.cfg	- for 2nd layer files packing
	
	Options:
		/log			- write log
		/debug			- debug mode on (works with /log option)
		/quiet			- don't output to console
		/mono			- monochrome mode on
		/md5			- ignore md5 errors (unpacking)
					- don't add md5 summ (packing)
		/rkcrc			- ignore RockChip CRC errors (unpacking)
		/rkaf			- make RKAF image (packing)
		/skip			- skip image size check (unpack option)
		/2nd			- unpack/pack 2-nd layer files
		/cid			- don't check ChipID (unpack option)
		/rmd4			- alignment of ramdisk in Android Boot image (pack option)
		/bcpath:		- base path for RKAndroidTool's cfg
		/lname:<[path]name>	- loader file name for RKAndroidTool's cfg
		/ini			- rewrite *.ini-file with new parameters
Por tanto, hacemos:
C:\Users\Administrador\Desktop\rockchip>imgrepackerrk /cid update.img

        imgRepackerRK (version 1.06 windows)
        Rockchip firmware batch/update images unpacker/packer

        (c) RedScorpio, Moscow, 2013-2017
            RedScorpio@land.ru

        Detected OS:    Windows 7 Pro SP 1.0 [build 7601] x64
        ==========================[ START ]==========================

        --- Firmware unpacking ---

        "RKFW" image file detected

        Batch image header from "update.img" was read
        Image properties:
                Type            RockChip batch image ("RKFW")
                Version         8.1.0
                Date            2019.11.19
                Time            10:15:30
                ChipID          0x33333236
                Code(?)         0x01060000
                RKFWtype        0x00000001
                Unknown_1       0x00000000

        -- boot.img processing --

        -- update.img processing --
        Update data header from "update.img" was read

        Corrected RKAF header properties
        Image properties:
                Type            RockChip update image ("RKAF")
                Id              "007"
                Model           "RK3326"
                Manufacturer    " RK3326"
                Version         8.1.0

        - Files extracting -
        Image files count = 14

        package-file (package-file)             extracted (format: unknown)
        bootloader (Image/MiniLoaderAll.bin)            extracted (format: RockChip bootloader image)
        parameter (Image/parameter.txt.parm)            extracted (format: RockChip PARM signed file)
        .....
        .....     
Y se desempaqueta todo en un directorio llamado update.img.dump con la estructura de todas las particiones contenidas en ella:
# tree update.img.dump/
update.img.dump/
├── config_16.cfg
├── config_8.cfg
├── Image
│   ├── boot.img
│   ├── kernel.img
│   ├── kernel.img.krnl
│   ├── MiniLoaderAll.bin
│   ├── misc.img
│   ├── oem.img
│   ├── parameter.txt
│   ├── parameter.txt.parm
│   ├── recovery.img
│   ├── resource.img
│   ├── system.img
│   ├── trust.img
│   ├── uboot.img
│   └── vendor.img
├── image.cfg
├── image.md5
└── package-file
El proceso inveso de generar un update.img a partir del directorio sería:
# imgrepackerrk udate.img.dump
.....
Genera un update.img que podríamos usar para actualizar completamente el dispositivo.

2. Herramientas oficiales de Rockchip para Linux.

En esta dirección de github tenemos Linux Pack Firmware, que trae scripts para empaquetado/desempaquetado de multitud de chipsets. Descargamos todo y haciendo:
# ./unpack.sh update.img
Este script (que internamente usa los ejecutables rkImageMaker y afptool) desempaqueta todo el contenido en el directorio "output".

La operación inversa se haría con el script "rk3326-mkupdate.sh":
# ls Image
boot.img  kernel.img  MiniLoaderAll.bin  misc.img  oem.img  parameter.txt  recovery.img  resource.img  system.img  trust.img  uboot.img  update.img  vendor.img
# ./rk3326-mkupdate.sh 
start to make update.img...
Android Firmware Package Tool v1.66
------ PACKAGE ------
Add file: ./package-file
Add file: ./package-file done,offset=0x800,size=0x2ac,userspace=0x1
Add file: ./Image/MiniLoaderAll.bin
Add file: ./Image/MiniLoaderAll.bin done,offset=0x1000,size=0x4714e,userspace=0x8f
Add file: ./Image/parameter.txt
Add file: ./Image/parameter.txt done,offset=0x48800,size=0x2aa,userspace=0x1
Add file: ./Image/trust.img
Add file: ./Image/trust.img done,offset=0x49000,size=0x400000,userspace=0x800
Add file: ./Image/uboot.img
Add file: ./Image/uboot.img done,offset=0x449000,size=0x400000,userspace=0x800
Add file: ./Image/misc.img
Add file: ./Image/misc.img done,offset=0x849000,size=0xc000,userspace=0x18
Add file: ./Image/resource.img
Add file: ./Image/resource.img done,offset=0x855000,size=0x119000,userspace=0x232
Add file: ./Image/kernel.img
Add file: ./Image/kernel.img done,offset=0x96e000,size=0x17c3014,userspace=0x2f87
Add file: ./Image/boot.img
Add file: ./Image/boot.img done,offset=0x2131800,size=0x1a46000,userspace=0x348c
Add file: ./Image/recovery.img
Add file: ./Image/recovery.img done,offset=0x3b77800,size=0x3c3f800,userspace=0x787f
Add file: ./Image/system.img
Add file: ./Image/system.img done,offset=0x77b7000,size=0x79491a14,userspace=0xf2924
Add file: ./Image/vendor.img
Add file: ./Image/vendor.img done,offset=0x80c49000,size=0xd08c07c,userspace=0x1a119
Add file: ./Image/oem.img
Add file: ./Image/oem.img done,offset=0x8dcd5800,size=0x3c064,userspace=0x79
Add CRC...
Make firmware OK!
------ OK ------
********RKImageMaker ver 1.66********
Generating new image, please wait...
Writing head info...
Writing boot file...
Writing firmware...
Generating MD5 data...
MD5 data generated successfully!
New image generated successfully!
Making update.img OK.
el cual, a partir del contenido del directorio Image como el mostrado en el código anterior crea un update.img nuevo.

Otra herramienta de desempaquetado de este repositorio github es Firmware Merger, pero no parece funcionar:
#  ./firmware_merger -U ./update.img update
Start to unpack firmware...
UnPacking Error:Tag of firmware is wrong, tag=0x57464b52!
Tampoco he indagado más.

3. Otras herramientas de terceros de Rockchip para Linux.

Hay muchos repositorios con proyectos personales que incluyen versiones particulares de herramientas de empaquetado/desempaquetado, como éste. Los pasos suelen ser:
# ./img_unpack update.img image.img
# mkdir img
#./afptool -unpack image.img img
....
UnPack OK!
Quedando todo desempaqetado en el directorio img.

4. Herramienta AndroidToolRelease de Windows.

Es una aplicación de Windows con interface gráfica para manejar firmwares de Rockchip. Antes de usarla hay que instalar los drivers mediante DriverAssistant. Para extraer el contenido de update.img vamos a la pestaña de Advanced Function y en Firmware seleccionamos el .img dando a "Unpack" luego. Eso desempaqueta todo.


Bueno, pues esta es la variedad de cosas que tenemos para desempaquetar update.img. En posts futuros husmearemos dentro de lo desempaquetado.


Ahí va, la Starship SN8 sube a 12.5km (las pruebas anteriores subieron 150m), apaga motores, baja en horizontal frenando con la atmósfera, se endereza... y se da el castañazo en el punto de partida. Explicado magistralmente por Daniel Marín.



La finalidad de la prueba, recopilar datos del planeo, ha sido exitosa. El aterrizaje perfecto hubiera estado bonito pero hubiera sido mucha suerte que funcionase. En fin, hemos estado 12.5km más cerca de Marte. Ahora a esperar en directo al SN9 cuando diga tito Elon.

jueves, 30 de julio de 2020

Configuración de bloqueo de aplicaciones para Tablets Android.

Necesitabamos una aplicación para bloquear el Escritorio (también conocido como Launcher) de las tablets que nos enviaron al centro, para evitar en todo lo posible las manipulaciones de alumnos avispados. La idea era limitar la entrada en Configuración y en ciertas aplicaciones seleccionadas, dentro de todo el proceso de puesta en funcionamiento para uso compartido de las tablets.

Tras probar varias, la mas adecuada que encontramos el año pasado fue Smart AppLock Libre El problema de esta aplicación es que con el tiempo ha ido creciendo y añadiendo puñetas inútiles que ocultan la finalidad inicial: que si ahorrador de batería, que si limpiador de memoria, que si optimizador de aplicaciones,... vamos, enredos. Tocaba buscar otra aplicación y encontré esta AppLock Inteligente / Lock App - Smart App Locker. Como tenía buenas críticas, es gratis y no tiene publicidad, decidí instalarla.

Al abrir la aplicación tenemos una pantalla de resumen de funcionalidades:


Damos a "Comenzar":


Nos pregunta que bloqueo de acceso a las aplicaciones vamos a usar: PIN, patrón o "error" (que sería una contraseña normal y corriente alfanumérica, no sé por qué lo han traducido así). En mi caso selecciono PIN. Como siempre nos pide el PIN dos veces:


Una vez definido el patrón, podemos seleccionar las aplicaciones a bloquear:


En mi caso bloqueo esta lista:


En la parte superior derecha podemos entrar en ajustes, que como vemos son bastante sencillos:


Volvemos a la pantalla anterior y activamos la aplicación pulsando sobre "App Locker no se está ejecutando. Toca aquí para iniciar" :


Nos lleva a Configuración->Accesibilidad->Servicios Descargados y activamos el App Locker.



Nos pedirá el PIN definido anteriormente y se activará:


Y ya está. Cada vez que intentemos entrar en las aplicaciones bloqueadas nos saltará el PIN:


App Locker se arranca al iniciar Android y bloquea sin problema. Simple y sencillo, mucho más que el Smart AppLock que usábamos hasta ahora.

lunes, 24 de febrero de 2020

Notas sobre los tablet TECHcomputer F101 y Android en general.


Tengo acumuladas varias notas sobre trabajo con Android, tanto con los tablet TECHcomputer que nos mandaron como de varias Android Box que tengo por el IES para diversas funciones multimedia. Vamos a irlos guardando en este post.

1. Conectar a los dispositivos Andoid desde nuestro PC.

Como ya hemos comentado, lo ideal para bichear es conectar con la shell del dispositivo para escribir comandos.

La primera opción es conectar mediante cable USB, habilitando la depuración USB en el tablet como ya contamos aquí. Una vez configurados e instalados los paquetes, conectamos por USB el dispositivo Android encendido y tecleamos:
# adb shell
La primera vez que lo hacemos seguramente en el dispositivo aparezca una ventana solicitando autorización para permitir la conexión. Le decimos que si y ya no aparecerá más.


Otra opción muy interesante es conectar mediante TCP/IP, sin necesidad de cable USB. Normalmente hay que activar el USB sobre TCP/IP en el dispositivo Android. Antiguamente había que hacerlo mediante comandos, pero en los últimos Android se activa en "Ajustes->Opciones de Desarrollador->Debugging->ADB over network" o similar, reiniciando después.

Una vez activado hacemos:
# adb connect x.y.z.a
# adb shell
Y conectamos al dispositivo Android remotamente, siendo x.y.z.a su dirección IP. Si no conocemos la dirección IP podemos buscarla haciendo un barrido nmap por nuestra red interna buscando abierto el puerto 5555 (que es el usado por la conexion ADB sobre TCP/IP):
# nmap -n -Pn x.y.z.0/24 -p5555 -oG - | grep '/open/' | awk '/Host:/{print $2}'

2. Mas allá del shell: escritorio remoto.

No solo por shell, tambien podemos aprovechar la conexión ADB para contolar remotamente el interface gráfico usando ratón y teclado, como una conexión VNC, el dispositivo Android desde nuestro PC con toda la comodidad del mundo.

El truco está en instalar en nuestro pc la aplicación scrcpy. Luego simplemente con ejecutar:
# adb connect x.y.z.a
# scrcpy
Si la conexión es por cable USB la parte "adb connect x.y.z.a" no es necesaria, claro está. Nos aparecerá el escritorio Android remoto en una ventana:


Cuando usas adb shell y scrcpy todo cambia: ya no quieres volver a configurar un dispositivo Android tocándolo físicamente. Es mucho mas sencillo con estas herramientas.

3. Varios comandos y configuraciones.

Desde la conexión "adb shell" podemos configurar un montón de ajustes finos de Android que no suelen estar muy documentados. Toca buscar en Internet. Voy a poner los que vaya descubriendo:

  • Verificar si está rooteado (es decir, tenemos permisos de superusuario sobre el dispositivo Android): haciendo "su" y viendo si el prompt cambia a "#" sin error.
    KI_PRO_S905D:/ $ su
    KI_PRO_S905D:/ # 
    
  • Ver configuraciones y aplicarlas con "getprop" y "setprop". Por ejemplo, para ver el DNS configurado:
    # getprop | grep dns1
    [net.dns1]: [192.168.0.100]
    
    Al poner getprop/setprop sin parámetros vemos la lista completa de opciones.
  • Impedir el apagado/suspensión del dispositivo Android (útil por ejemplo si lo usamos con un panel informativo)
    # svc power stayon true
    
    Luego podemos comprobar si está activado con:
    # settings get global stay_on_while_plugged_in
    7
    
    El valor "7" significa "activado".
    Con el comando settings se puede acceder/modificar cientos de parámetros del sistema Android, que están escasamente documentados. Aquí hay alguna pista.
    KI_PRO_S905D:/ # settings                                                      
    usage:  settings [--user  | current] get namespace key
            settings [--user  | current] put namespace key value
            settings [--user  | current] delete namespace key
            settings [--user  | current] list namespace
    
    'namespace' is one of {system, secure, global}, case-insensitive
    If '--user  | current' is not given, the operations are performed on the system user.
    
Espero seguir aumentando esta lista de comandos últiles con el tiempo y hacer crecer este apartado.

4. Reinicios hacia recovery y bootloader.

Cuando queremos entrar tanto en el recovery como en el bootloader para hacer copias de seguridad, resetear el dispositivo o cargar una actualización, el método estándar es encender el aparato pulsando una combinación de botones físicos bastante puñetera. A veces tienes que hacer varios encendidos y apagados hasta dar con la tecla, nunca mejor dicho.

Una opción mas limpia es aprovechar que tenemos "adb shell" para reiniciar desde la línea de comandos de forma sencilla. Entramos en "adb shell" por USB y hacemos:
# reboot recovery
o
# reboot bootloader
Y entramos directamente al modo deseado de un manera limpia y directa.

Una método simple para saber en que estado está el dispositivo es usar el comando lsusb (con el aparato conectado por USB, of course). Por ejemplo, para nuestros TECHcomputer F101, con chipset Rockchip RK 3326 el resultado puede ser:
2207:330d Modo download/bootloader/fastboot
2207:0006 Modo normal
2207:0001 Modo recovery
Recordemos que el modo download normalmente muestra la pantalla en negro con un mensaje de texto, esperando órdenes desde el pc.

En cambio el modo recovery suele mostrar un menú con opciones para trastear, manejado por los botones físicos de volumen y power. En nuestras tablets F101 al entrar en el recovery aparece una pantalla con un muñeco de Android y el texto “No Command”. Para llegar al menú pulsamos sin soltar el botón Power y a continuación pulsamos Bajar Volumen una sola vez brevemente y soltamos. En otras ocasiones hace falta conectar un teclado externo para manejarlo.

Out!

viernes, 15 de noviembre de 2019

Transferencia rápida de ficheros del móvil android al PC.

Vaya, vaya, que meses mas ocupados entre inicios de curso y repetición de elecciones. A ver si aprendéis a votar bien de una vez y podemos avanzar.

Vamos a contar alguna cosita. Después del verano los móviles vienen petados de fotos y vídeos y cuando toca hacer limpieza y descargar unos cientos o miles de fotos siempre me pasa lo mismo. Si pincho el móvil con el cable USB e intento copiarlas a golpe de ratón resulta que se hace a paso de, tortuga, con mucha posibilidad de que se quede parado o aborte en algún punto.

Esto antes no era así pero en algún momento alguien ha decidido que la conexión USB del móvil no se haga como si fuera un pendrive, sino que use un protocolo MTP que por su (mala) implementación penaliza enormemente la transferencia de muchos archivos. Es el problema de añadir capas a las capas, que al final cada byte recorre tantos escalones que el proceso se eterniza. Una vez vi un programa hecho por Indra que mandaba datos en formato XML mediante SOAP, el cual transforma lo que envía a formato XML. Meter un XML dentro de un XML, que buena idea.

¿Tiene esto solución? Claro, usando la línea de comandos. Para ello necesitamos:

  1. Habilitar la depuración USB en el móvil.
  2. Windows: instalar los drivers y programas para el ADB.
  3. Linux: instalar los paquetes ADB.
  4. Repasar cómo funciona la conexión ADB y sus comandos.

Una vez hecho esto, tenemos que conectar el móvil con el cable USB al PC y ejecutar:
# adb shell
para conectar a una shell dentro del móvil. Una vez allí, mediante los comandos "cd" y "ls" exploramos las diferentes carpetas para dar con la ruta donde están los ficheros multimedia que queremos transferir. Esto puede cambiar de un móvil a otro y por eso no puedo dar un path universal, en mi caso están concretamente en la ruta /storage/sdcard0/DCIM/camera.

Un vez averiguada la ruta, salimos con "exit". Ahora, para transferir los archivos:
# mkdir camera
# adb pull -a /storage/sdcard0/DCIM/camera camera
El comando "pull" de adb realizar una transferencia recursiva de ficheros desde la ruta /storage/sdcard0/DCIM/camera de la memoria del móvil a la ruta ./camera del PC. Esta transferencia de ficheros se realiza a una velocidad endiablada: la velocidad de mover bytes sin tener que hacerlos pasar por capas y protocolos farragosos. En un tiempo razonable tenemos en el PC todos los ficheros.


Ya he hablado de la sonda india Chandrayaan 2, que ha costado menos que las elecciones del 10N en nuestra patria. En su momento esas cabezas parlantes que salen por la TV haciendo con que dan información se limitaron a comentar que el aterrizador Vikram se había estrellado. En realidad se perdió el contacto con él, no se sabe que pasó.

Bueno, pues el aterrizador era una parte de la misión. El resto ha seguido adelante haciendo fotos desde el orbitador:


Esto son fotos con una resolución de 30cm por pixel de la superficie lunar, una resolución nunca vista. Lástima que su órbita no la lleve por encima del lugar de alunizaje del Apolo XI.

Insisto: 140 millones de dolares. El 10N han sido 136 millones de euros.

martes, 5 de marzo de 2019

Preparación de tablets Android para uso compartido.

Nos han llegado unos tablets para su uso con Librarium en las bibliotecas escolares. A lo largo del tiempo han ido llegando diversos modelos, siendo los últimos unos marcados como TECHcomputer-Tablet PC F101 (aunque internamente se identifican como Tablet L108MR, ya que son simplemente un remarcado de un modelo importado). Estas son sus características:

  • CPU: MTK cortex A7 1.5Ghz Quad Core.
  • Pantalla: 10.1" 1280 x 800 IPS lo que garantiza excelentes ángulos de visión.
  • Memoria de Almacenamiento: 32Gb.
  • Memoria RAM: 2Gb.
  • Cámara: Delantera: 2.0Mp, Trasera: 5.0Mp.
  • Almacenamiento: Soporta tarjeta Micro SD de hasta 32Gb.
  • Batería: 6000 mAh, 4.5 horas de duración reproduciendo vídeo.
  • Bluetooth y WIFI: 4.0, Wifi b/g/n.
  • Carcasa: Aluminio.
  • S/O: Android 8.1.
  • Puertos: 1 x Micro USB, 1 x Auricular, 1 x Micro SD.
  • Dimensiones / Peso: 24.2 x 17.2 x 0.9cm / 450gr.
  • Accesorios: Cargador micro USB.
  • Opcionales: Funda con teclado.

Antes de ponerlos a disposición de los usuarios es conveniente realizar una configuración básica común, que puede servirnos para cualquier tablet que tengamos que distribuir para su uso compartido en una comunidad. Las directrices son:

  • Instalar los programas básicos solicitados.
  • Asociar todos los tablets con una única cuenta de Gmail que permita su fácil administración. Esta puede ser una cuenta @gmail.com creada por nosotros o bien solicitar una cuenta GAFE corporativa (en nuestro caso @educarex.es).
  • Instalar un software de bloqueo que impida a los usuarios comunes la instalación/desinstalación de aplicaciones y el cambio de ajustes.

Los pasos a seguir han sido descritos por varios de mis compañeros de los IES Zurbarán e IES Javier Garcia Téllez a lo largo de las últimas semanas. Yo me he limitado a recogerlos y enumerarlos (no es una secuencia exacta, puede variar algo):

1. Configuración de las tablet.

  1. Encendemos la tablet.
  2. Cuando pida un nombre para la tablet le damos algun normalizado. Yo he usado "tab-bib-XX" siendo XX=01, 02, 03, …
  3. Cuando busque redes wifi para conectar, decimos que se salte ese paso. De momento no vamos a conectar a ninguna red ni configurar ninguna cuenta Gmail. Esto hace que el Asistente de Configuración quede "dormido" en segundo plano. No importa, más tarde acabaremos con él.
  4. Decir "SI" a las preguntas sobre Servicios Google.
  5. Si pregunta sobre creación de copia seguridad en Drive decir que "SI".
  6. No definimos patrón ni pin de bloqueo.
  7. Esperar hasta que nos salga el escritorio Android.
  8. Nombre de la tablet: si queremos cambiar el nombre de la tablet lo haremos en Ajustes -> Red e Internet -> Wi-Fi -> Preferencias de Wi-Fi -> Ajustes Avanzados -> Wi-Fi Direct -> Cambiar nombre del dispositivo.
  9. Conectamos la tablet a una red wifi. Ahora si.
  10. Entramos en Google Play, momento en el que nos pide una cuenta Gmail para el tablet. En mi caso introduzco la cuenta GAFE corporativa de @educarex.es. La otra opción es introducir una cuenta @gmail.com
  11. Ya en el Play instalamos las siguientes aplicaciones: Librarium, Microsoft Word/Excel/Powerpoint, Adobe Reader, Diccionario RAE, WordReference, Smart AppLock Libre [ver nota al final 30/07/2020], Wifi Connection Manager[ver nota al final 30/07/2020], Google Classroom y todas las que se quieran instalar en función de nuestras necesidades.
    • En el primer tablet esta instalación se hace buscando aplicaciones en Google Play una a una.
    • En las siguientes basta con entrar en Google Play a "Mis aplicaciones" -> "Mi colección" y allí estarán todas las aplicaciones listas para instalar. Esto es debido a que como compartimos cuenta gmail entre todas las tablets las aplicaciones quedan vinculadas a dicha cuenta.
  12. Dentro del Google Play, en la parte superior veremos que el Asistente de Configuración sigue pendiente de completarse. Sale porque en el inicio no definimos una wifi ni una cuenta gmail. No debemos completarlo, simplemente hay que pulsar como si quisieramos acabar la configuración, cerrarlo y decir que no queremos continuar "Nunca". Si intentamos completarlo podemos tener problemas que nos lleven a un callejón sin salida (que explicaremos luego) con la cuenta asociada a los tablets.
  13. Hora: configuramos en Ajustes como "no automática" y zona horaria Amsterdam (+1).
  14. Notificaciones correo: para evitar avisos molestos de Gmail todo el tiempo (recordemos que la cuenta es la misma para todas las tablets de nuestro centro) vamos a Configuración->Aplicaciones y Notificaciones->Notificaciones->Notificaciones de aplicaciones->Gmail->Desactivar.
  15. Configuración de bloqueo de funcionalidades con SmartAppLock [ver nota al final 30/07/2020]:
    • Menú Sistema: activamos bloqueo de instalación/desinstalación y bluetooth.
    • Menú Ajustes:
      • Habilitar bloqueo: esta opción activa el servicio SmartAppLock en el Tablet. Nos hace definir un patrón de desbloqueo y luego realizar 2 pasos para dar permisos a SmartAppLock para llevar a cabo el bloqueo del entorno Android. Una vez acabado aparece un botón “Hecho”, quedando activado.
      • Bloqueo: en mi caso activo el bloqueo por contraseña, aunque también es posible usar bloqueo por pin o por patrón.
      • Puerta secreta: OFF.
      • Bloqueo nueva aplicacion instalada: OFF. De esta manera si instalamos nuevas aplicaciones por defecto quedan como accesibles.
      • Alerta intrusion: OFF.
    • Aplicaciones a bloquear (en mi caso 9 en total): Play Store, Ajustes, Gmail, Play Peliculas, Play Musica, Contactos, Files, Drive, Archivos. De esta manera, para entrar en estas aplicaciones el usuario deberá meter la contraseña.
  16. Al bloquear la aplicación Ajustes en SmartAppLock nos encontramos con que el usuario no puede añadir/quitar/modificar conexiones wifi, lo cual es una limitación importante. La solución para ello es que use la aplicación Wifi Connection Manager [ver nota al final 30/07/2020] que instalamos anteriormente, ya que está desbloqueada y nos permite manipular libremente las conexiones wifi.
  17. Aviso importante: si vamos a desinstalar SmartAppLock hay que desactivar previamente todos los bloqueos. En caso contrario puede quedar "pillada" la tablet.

2. Reseteo de la tablet: cómo hacer un Factory Reset

En el caso de que la tablet quede bloqueada o atascada sin posibilidad de hacer que funcione normalmente lo mas conveniente es entrar en el modo Recovery y realizar un Factory Reset. Los pasos son:

  1. Partiendo del tablet apagado, pulsamos Bajar Volumen (Izq) y a la vez Power sin soltar ambas teclas.
  2. Esperamos que arranque y entre en una pantalla con un muñeco de Android y el texto “No Command”.
  3. Pulsamos sin soltar el botón Power y a continuación pulsamos Bajar Volumen una sola vez brevemente y soltamos. Entrará en menú Recovery. Soltamos el botón Power.
  4. Elegimos la opción Factory Reset y después hacemos un Reboot.
  5. La tablet arranca limpia y empieza el asistente de configuración.

3. Problemas que nos podemos encontrar.

En relación al asistente de configuración puede haber varios problemas:

  • Como todas las tablets se configuran con la misma cuenta de correo, el asistente de configuración lo detecta y asume que la cuenta de @educarex.es usada debe ser una "cuenta de administrador de G-suite", que es una cuenta especial para administración de dominios corporativos. Como nuestra cuenta no ha sido creada con esa característica, el proceso de configuración se queda atascado ahí. Ese es el motivo por el cual es crucial abortar la configuración inicial (saltando la conexión a una red wifi) y acabarla de forma manual mas tarde, eludiendo el asistente.
  • En el caso de llegar a un bloqueo de configuración debemos volver al inicio haciendo un Factory Reset.
  • Si configuramos un tablet varias veces haciendo pruebas, puede que detecte que ha sido antes asociado a una cuenta de correo e intente asociarlo otra vez, produciendo una situación de bloqueo. En ese caso se debe desasociar entrando en
    https://myaccount.google.com/device-activity con la cuenta @educarex.es con la que lo asociamos la primera vez. Una vez allí desvinculamos el tablet en cuestión de la cuenta.

En fin, con esto creo que tenemos unas directrices claras para configurar la tablet. Me huelo que cada vez serán mas necesarias conforme vayan llegando mas dispositivos de este tipo a los centros.

Nota 30/07/2010: para el curso 20/21 he hecho 2 cambios a lo dicho en este artículo:
  • SmarApp Lock Libre: durante este tiempo la aplicación se ha complicado y perdido usabilidad. La sustituyo por otra mucho más ligera y prometedora: Lock App - Smart App Locker.
  • Wifi Connection Manager: a partir del verano de 2020 no lo usamos ya que preconfiguramos para conectar de forma automática a la red wifi de Escuelas Conectadas.


Hace un par de días la Dragon 2 se ha acoplado a la ISS con éxito.


Aunque las Soyuz son un ejemplo de máquina perfecta, está muy bien que les haya salido competencia y que ahora haya más sistemas capaces de subir personas (incluidos terraplanistas) al cielo. Un tanto más para Space-X y su apuesta por convertir el viaje al espacio en una industria superando su etapa de artesanía.

Lo mejor de todo es su pasajero, Ripley:


No entiendo como los cosmonautas de la ISS han abierto la escotilla tras el acoplamiento. ¿Quién en su sano juicio abre una cápsula con un único pasajero llamado Ripley? Lo siguiente tras eso es tener un xenomorfo en la nave y ya la tendremos liada.

domingo, 14 de enero de 2018

Como meter un recovery en Android desde linea de comandos.


Un dispositivo android tiene varios modos de arranque, desde un modo "mayormente muerto" (como el Pirata Roberts de La princesa prometida) hasta el modo completamente funcional.


Un modo muy usado si queremos trastear con el móvil es el "modo recovery", pero para sacarle toda su potencialidad normalmente nos vemos obligados a sustituir el recovery que trae por defecto el terminal por otro con más opciones. Aquí describiremos como meter un recovery nuevo mas potente a un dispositivo android.

Antes de entrar en faena y a modo de repaso para que no se me olvide, voy a enumerar los modos de los cuales tenemos noticia:

1. Modo normal/system.

Es el modo usual, con el dispositivo arrancado y funcional. Podemos interactuar con el mediante la pantalla táctil o mediante adb, conectándolo a un PC con el cable USB y enviando comandos hacia él.

El adb es además la vía mas sencilla y universal para reiniciar el móvil en los otros modos.

2. Modo recovery.:

En este modo el dispositivo arranca en un entorno restringido, que permite hacer varias tareas de mantenimiento que nos facilitan enredar con el dispositivo. Aquí el móvil se maneja con la pantalla táctil y/o los botones laterales y no es funcional en el sentido usual, ya que no se llega a cargar el sistema android.

Muchos móviles traen un stock recovery por defecto muy limitado, pero afortunadamente la comunidad ha creado recoverys sustitutos bastante avanzados, como CWM o TWRP.

Stock recovery, como vemos bastante insulso:


Recovery CWM, aquí hay mas opciones:


Recovery TWRP, con un GUI bonito y encima táctil:


Algunas de las funcionalidades que traen estos recoverys vitaminados son:

  • Cargar nuevas ROMs.
  • Hacer un reset de las distintas particiones y datos.
  • Instalar aplicaciones especiales, tipo SuperSU (para rootear) o Xposed (para añadir funcionalidades variadas).
  • Formateo, borrado, creación y montaje de particiones de la memoria SD interna del móvil.

Aquí y acá viene mejor explicado.

Para arrancar el móvil en recoverý suele haber una combinación especial de teclas de encendido o bien usando adb, como podemos ver aquí.

3. Modo fastboot/bootloader.

En este modo el móvil no puede ser manejado por su pantalla o botones, pero si podemos interactuar con él usando un cable USB y la utilidad fastboot.

Muchas veces tenemos un móvil brickeado (se queda congelando arrancando) o en bootloop (reinicia continuamente sin cargar el sistema). En estos casos si conseguimos ponerlo en modo fastboot tendremos una vía para restaurar o arreglar el sistema.

Normalmente se entra desde adb con el comando "adb reboot bootloader", aunque algunos dispositivos tienen combinaciones de teclas para arrancar en este modo. Es algo que tendremos que investigar en cada caso concreto.

Desde este modo se puede desbloquear el bootloader (en algunos móviles viene bloqueado para impedir instalar otras ROMs o recoverys) y trabajar con las particiones: borrar, formatear, sobreescribir imágenes nuevas. Es el modo que vamos a usar para meter un recovery más adelante.

4. Más abajo: modos cercanos al Amenti.

Aquí llegamos a terreno envuelto en brumas. Cada fabricante puede tener modos más profundos para arrancar el móvil, según estas normas básicas:
  • La nomenclatura depende del fabricante: download mode (aunque en algunos fabricantes es equivalente al fastboot), emergency mode, QDL mode, y seguro que hay muchos más.
  • En cada caso se usa herramientas especializadas, como Odin, SPFlashTool, MTKDroidTools, KDZ Firmware Update, MiFlash,...
  • Desde estos modos normalmente sólo se consigue flashear el móvil cargando una Stock ROM (ROM Oficial)
Cuando uno llega aquí es que tiene el móvil tan brickeado que no podemos conectar con él mediante fastboot y ya estamos en modo pánico. Mis tribulaciones con los malditos Xiami Redmi 1S son una prueba de ello.


Vamos al lío.

Yo he venido aquí a hablar de mi recovery, así que vamos a ello. Mi problema es que cada vez que tengo que meter un recovery me lanzo una y otra vez por el camino mas pedregoso: bajarme los drivers USB el teléfono, instalar una utilidad de flasheo, conseguir el fichero con el recovery para mi modelo de móvil (no vale cualquiera, hay que buscar el correcto en htcmania/xda-developers o generarlo nosotros) y realizar el flasheo de la partición que lo aloja.

Esa es la teoría. En la práctica, como la mayoría de estas utilidades solo funcionan bien en Windows no queda otra que arrancar dicho sistema, sortear los problemas con los drivers no firmados (la mayoría de los drivers de móviles están sin firmar), ver si detecta o no el dispositivo USB, ver si hay comunicación estable... y un sinfín de contratiempos más. Después de un par de horas infructuosas recuerdo que hay un método mucho más sencillo usando la línea de comandos de linux:

  1. Localizar y descargar el recovery. Suele ser un fichero .img que contiene dentro imagen de una partición con un mini-sistema Linux
  2. Conectar por adb y arrancar en modo fastboot.
  3. Desbloquear el bootloader, cargar el recovery y reiniciar.

Veamos la secuencia de comandos. Antes de nada debemos instalar las android-tools-adb y android-tools-fastboot en nuestro Linux, a veces vienen por separado o a veces en un único paquete android-tools. No hace falta ningún driver. También hay que habilitar el modo depuración USB en el menú de desarrollo del móvil.

Conectamos el móvil al PC por usb y tecleamos:
# adb devices
Si todo va bien saldrán numeritos y el nombre del teléfono. Ojo: quizá el móvil nos pregunte ahora o más adelante en su pantalla si damos permisos para aceptar la conexión desde el PC.

Reiniciamos el móvil en modo fastboot:
# adb reboot bootloader
En ese modo la pantalla no muestra nada interesante, la única manera de interactuar es a través del comando fastboot en el PC. Vemos si hay comunicación con dicho modo desde el ordenador tecleando:
# fastboot devices
Antes de nada, puede que el terminal tenga el bootloader bloqueado. Eso quiere decir que viene de fábrica configurado para impedir cambiar el recovery y/u otras partes del sistema. En ese caso lo que haremos será desloquearlo con uno de estos 2 comandos:
# fastboot oem unlock
o
# fastboot oem unlock-go
Podemos ver el estado del bootloader con:
# fastboot oem device-info
y/o
# fastboot getvar all
Debe aparecer algo así como: "Device Unlocked: true".

Una vez confirmamos que el móvil está desbloqueado, procedemos a sustituir el revovery por uno nuevo descargado de Internet (recordemos: el recovery debe ser compatible con nuestro terminal, no se pueden hacer mezclas a riesgo de brickear el movil).
# fastboot flash recovery twrp.img
También es posible hacer una prueba del recovery en dique seco, sin reescribir el original. Así confirmamos su buen funcionamiento/compatibilidad o bien lo ejecutamos para algo puntual sin sustituir el recovery que hay instalado:
# fastboot boot twrp.img
Una vez sobreescrito el nuevo recovery, reiniciamos:
# fastboot reboot
El móvil debe reiniciar bien y una vez arrancado, desde el adb podemos reiniciar en el recovery para operar con él:
# adb devices
# adb reboot recovery
Y ya está, espero que la próxima vez no tenga que perder el tiempo con Windows cuando quiera hacer esto.