1 votos

¿El Zygote Primario (64 bits) solo inicia los Servicios del Sistema? ¿Y todas las aplicaciones de Android son de 32 bits?

Hasta donde sé, Zygote es iniciado por app_process64 y app_process32 donde 64 es para el zygote primario que inicia los servicios del sistema debido a la bandera start-system-server.

Como podemos ver a continuación en el método static void main de frameworks/base/core/java/com/android/internal/os/ZygoteInit.java, verifica la bandera start-system-server, ejecuta el servidor de sistema bifurcado y sale debido a la declaración return; debajo de él, y nunca ejecuta el runSelectLoop que en realidad entra en un bucle infinito escuchando conexiones que solicitan iniciar nuevas aplicaciones. Solo app_process32 sin la bandera start-system-server no entrará en la sentencia de control para ejecutar el servidor de sistema bifurcado, y en su lugar, ejecutará el runSelectLoop. ¿Significa esto que todos los servicios del sistema son inherentemente de 64 bits mientras que todas las aplicaciones de Android son inherentemente de 32 bits?

Este código es de la rama AOSP: Android-14.0.0_r21:

// código redactado anteriormente

zygoteServer = new ZygoteServer(isPrimaryZygote);

if (startSystemServer) {
    Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);

    // {@code r == null} en el proceso padre (zygote), y {@code r != null} en el
    // proceso hijo (system_server).
    if (r != null) {
        r.run();
        return;
    }
}

Log.i(TAG, "Aceptando conexiones de sockets de comando");

// El bucle select devuelve temprano en el proceso hijo después de una bifurcación y 
// se queda en un bucle para siempre en el zygote.
caller = zygoteServer.runSelectLoop(abiList);

// código redactado abajo

1voto

Tim Bodeit Puntos 101

El runSelectLoop en realidad será ejecutado por app_process64 y no simplemente terminará.

Echemos un vistazo a este extracto del método forkSystemServer, llamado en tu fragmento de código cuando startSystemServer es verdadero, para entender por qué:

private static Runnable forkSystemServer(String abiList, String socketName,
        ZygoteServer zygoteServer) {
    // ...

    int pid;

    try {
        // ...

        pid = Zygote.forkSystemServer(
                parsedArgs.mUid, parsedArgs.mGid,
                parsedArgs.mGids,
                parsedArgs.mRuntimeFlags,
                null,
                parsedArgs.mPermittedCapabilities,
                parsedArgs.mEffectiveCapabilities);
    } catch (IllegalArgumentException ex) {
        throw new RuntimeException(ex);
    }

    /* Para el proceso hijo */
    if (pid == 0) {
        // ...

        return handleSystemServerProcess(parsedArgs);
    }

    /* Para el proceso padre */
    return null;
}

Eliminé la mayor parte del código y mantuve solo la parte relevante para mayor claridad. Como puedes ver, el método bifurcará el proceso actual y devolverá algunos datos en el proceso hijo, mientras que devolverá null en el proceso padre.

Esto significa que tanto el proceso hijo (system_server) como el proceso principal (zygote64) continuarán la ejecución en el fragmento de código que incluiste en la pregunta:

Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);

// {@code r == null} en el proceso padre (zygote), y {@code r != null} en el
// proceso hijo (system_server).
if (r != null) {
    r.run();
    return;
}

Ahora, en el proceso bifurcado de system_server, la llamada a forkSystemServer devolvió algún objeto. Por lo tanto, el proceso entrará en el if y ejecutará r.run() antes de retornar. Por lo tanto, zygoteServer.runSelectLoop(abiList) no será ejecutado en el proceso hijo (system_server).

Sin embargo, en el proceso padre, la llamada a forkSystemServer devolvió null. Por lo tanto, el proceso no entrará en el if y continuará ejecutando zygoteServer.runSelectLoop(abiList).

Esto es también lo que se menciona en el comentario de tu fragmento de código.

En caso de que aún no estés convencido, listar los procesos en ejecución en tu dispositivo te mostrará claramente que tanto zygote64 como system_server están en funcionamiento junto con la versión de 32 bits de zygote:

# ps -e | grep -E "zygote|system_server"
root           979     1 6102692  65188 do_sys_poll         0 S zygote64
root           980     1 1754948  18020 do_sys_poll         0 S zygote
system        2164   979 14310660 308548 do_epoll_wait      0 S system_server

Entonces, para responder finalmente a la pregunta: No, las aplicaciones de Android no son inherentemente de 32 bits. zygote64 se utilizará para ejecutar aplicaciones de 64 bits.

0voto

xiaokaoy Puntos 106

Estás en lo correcto. En versiones modernas de Android, a partir de Android 8.0 (Oreo), el proceso system_server es iniciado por el proceso zygote64. Este cambio fue introducido para soportar arquitecturas de 64 bits manteniendo la compatibilidad con arquitecturas de 32 bits.

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