En lo más profundo del sistema operativo Android, init.rc
los archivos juegan un papel vital, definiendo los servicios y comandos que se ejecutarán cuando se inicie el sistema. Pero, ¿qué sucede si desea agregar su propio init.custom.rc personalizado y luego agregar servicios o comandos personalizados al archivo personalizado? init.custom.rc
En este artículo, exploraré cómo personalizar y modificar archivos dinámicamente en Android .
Serie de artículos
El sistema Android init.rc crea una implementación de nodo de archivos y un análisis de principios cuando se inicia por primera vez. El
sistema Android init.rc ejecuta un script de shell cuando se inicia
el sistema Android. init.rc El nodo del sistema sys/class no se puede escribir en el análisis de principios y soluciones
de Android system init.rc Explicación detallada
del archivo de modificación dinámica personalizada del sistema Android init.custom.rc
1. Supuesto de requisitos
Mi objetivo es init.custom.rc
agregar un nuevo servicio en el archivo que ejecute un script una vez que se complete el inicio del sistema. Además, también quiero crear un nuevo directorio después de que los datos del sistema de archivos estén disponibles y poder modificar y agregar dinámicamente servicios y scripts sin tener que volver a compilar el código.
2. Intentos iniciales
La idea inicial era init.rc
agregar nuevos servicios y comandos directamente en el archivo. Pero este método puede hacer que el archivo principal init.rc
se vuelva confuso, especialmente cuando hay múltiples servicios y comandos personalizados. No quiero que los servicios y sistemas que agregué sean confusos, y luego será inconveniente solucionar el problema y luego intentarlo. más.
3. Trampas atravesadas
Puede ver en el contenido de los archivos y system/core/rootdir
proporcionados en el directorio que el proyecto parece utilizar dos sistemas de compilación al mismo tiempo: el antiguo y el nuevo . Para agregar ambos sistemas de compilación , siga estos pasos:Android.mk
Android.bp
Android.mk
Android.bp
custom.init.rc
Agregue Android.mk:
En Android.mk
el archivo, busque una ubicación adecuada y agregue el siguiente contenido:
include $(CLEAR_VARS)
LOCAL_MODULE := init.custom.rc
LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/init
include $(BUILD_PREBUILT)
Asegúrese de que init.custom.rc
el archivo esté en Android.mk
el mismo directorio que .
Agregue Android.bp:
- En
Android.bp
el archivo, busque una ubicación adecuada y agregue el siguiente contenido:
prebuilt_etc {
name: "init.custom.rc",
src: "init.custom.rc",
sub_dir: "init",
}
Asegúrese de que init.custom.rc
el archivo esté en Android.bp
el mismo directorio que .
Sin embargo... este cambio no sirve de nada, así que tenemos que encontrar otra manera.
init.custom.rc
Después de agregar el error, encontré un problema al intentar agregar el nuevo archivo al sistema de compilación de Android:MODULE.TARGET.ETC.custom.init.rc
se ha definido dos veces. Esto significa que estamos intentando definir el mismo archivo en dos lugares diferentes build/make/core/base_rules.mk:325: error: system/core/rootdir: MODULE.TARGET.ETC.custom.init.rc ya definido por system/ core/rootdir
(La razón del error es que lo agregué a Android.mk y Android.bp al mismo tiempo, y finalmente eliminar cualquiera de ellos no cumplió con los requisitos)
3. Solución final
Para hacer que el código sea más modular, decidí intentar importar un nuevo archivo nombrado dentro import
del archivo principal usando la declaración . De esta manera, todos los servicios y comandos personalizados se pueden colocar en este nuevo archivo en lugar de mezclarlos en el archivo principal.init.rc
init.custom.rc
.rc
Utilice la declaración en un archivo existente import
. Esto permite que .rc
el contenido de varios archivos se organice de forma más modular y init.rc
se importe en el archivo principal.
Para resolver este problema, se tomaron los siguientes pasos:
Modificar personalizar.mk :
En vendor/customize
el directorio, edite customize.mk
el archivo y agregue el siguiente contenido:
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/init.custom.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.custom.rc
Modificar init.rc :
En system/core/rootdir
el directorio, init.rc
realice las siguientes modificaciones al archivo:
@@ -8,6 +8,7 @@ import /init.environ.rc
import /system/etc/init/hw/init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
+import /vendor/etc/init/hw/init.custom.rc
Se agregó init.custom.rc :
En vendor/customize
el directorio, cree init.custom.rc
un archivo y agregue el siguiente contenido:
# Define a service to copy video
service copy_video2 /system/bin/sh /system/bin/copy_video.sh
class main
user root
group root
seclabel u:r:shell:s0
oneshot
# Start the service on boot completed
on property:sys.boot_completed=2
start copy_video2
# Create a directory after the file system data is available
on post-fs-data
mkdir /mnt/custom3 0755 root root
Aprobado PRODUCT_COPY_FILES
, init.custom.rc
se copiará en el momento de la compilación /vendor/etc/init/hw/init.custom.rc
.
Método de verificación :
Utilice ADB para obtener privilegios de root:
adb root
Vuelva a montar la partición del sistema
adb remount
Extraer init.custom.rc
archivos del dispositivo:
adb pull /vendor/etc/init/hw/init.custom.rc .
Modifique un init.custom.rc
archivo local, por /mnt/custom3
ejemplo /mnt/custom4
, cámbielo a y luego envíe el archivo nuevamente al dispositivo
adb push .\init.custom.rc /vendor/etc/init/hw/init.custom.rc
Sincronice el sistema de archivos y reinicie el dispositivo
adb shell sync
adb shell reboot
Después de reiniciar, verifique si las modificaciones han surtido efecto:
adb shell
cd /mnt
ls
Si ve custom4
el directorio, la modificación se ha realizado correctamente.
Mediante el método anterior, personalizamos con éxito el script de inicio del sistema Android y verificamos su efectividad. Esto proporciona a los desarrolladores de sistemas Android una forma flexible de personalizar y ampliar la funcionalidad del sistema.
4. Conclusión
A través de este proceso, aprendimos cómo personalizar y modificar dinámicamente init.rc
archivos en el sistema Android. Si bien esto requiere cierta familiaridad con el sistema de compilación de Android, el proceso es relativamente simple una vez que se dominan los conceptos básicos.