conocimiento Android 40 - SetProp persisten propiedad.

Pregunta: valores de las propiedades encontradas en el próximo reinicio adb sehll SetProp establecido después de Claro

adb shell setprop testing.mediascanner.skiplist /storage/sdcard1/test

Conclusión: debe persistir en el principio del nombre de la propiedad a su conservación permanente.

On system initialization, Android will allocates a block of shared memory for storing the properties. This is done in “init” daemon whose sourcecode is at: device/system/init. The “init” daemon will start a PropertyService.
The Property Service is running in the process of “init”daemon. Every client that wants to SET property needs to connect to theProperty Service and send message to Property Service. Property Servicewill update/create the property in shared memory. Any client that wants to GET property can read the property from the shared memory directly.This promotes the read performance.
Java API:
import android.os.SystemProperties;
[javascript] view plaincopyprint?
public static String get(String key, String def) {} 
public static void set(String key, String val) {} 
The Native API:
[cpp] 
int property_get(const char *key, char *value, const char *default_value); 
 
int property_set(const char *key, const char *value); 

Ruta del archivo: biónica / libc / include / sys / system_properties.h  

#define PROP_NAME_MAX   32 
#define PROP_VALUE_MAX  92 

Propiedades definidos anteriormente se pueden ver hasta 32, la longitud máxima de 92 bytes del valor del atributo.

Ruta del archivo: biónica / libc / include / sys / _system_properties.h

#define PROP_PATH_RAMDISK_DEFAULT  "/default.prop" 
#define PROP_PATH_SYSTEM_BUILD     "/system/build.prop" 
#define PROP_PATH_SYSTEM_DEFAULT   "/system/default.prop" 
#define PROP_PATH_LOCAL_OVERRIDE   "/data/local.prop" 

Después del servicio atributo de inicio desde el sistema lee el archivo de atributos por defecto, y escribe en la memoria compartida, para leer los siguientes cuatro archivos de forma secuencial:
 /default.prop
 /system/build.prop
 /system/default.prop
 / Datos /local.prop

Después de las modificaciones de propiedades de lectura, la misma propiedad se ha leído.

Ruta del archivo: Sistema / core / init / property_service.c

void start_property_service(void) 
{ 
    int fd; 
 
    load_properties_from_file(PROP_PATH_SYSTEM_BUILD); 
    load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT); 
#ifdef ALLOW_LOCAL_PROP_OVERRIDE 
    load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE); 
#endif /* ALLOW_LOCAL_PROP_OVERRIDE */ 
    /* Read persistent properties after all default values have been loaded. */ 
    load_persistent_properties(); 
 
    update_legacy_atvc_properties(); 

设置属性,ro.开头的属性将不能被更改属性值,persist.开头的属性会被永久纪录,其他属性值在重新开机后均将被丢弃:
int property_set(const char *name, const char *value) 
{ 
    if(namelen < 1) return -1; 
 
    pi = (prop_info*) __system_property_find(name); 
 
    if(pi != 0) { 
        /* ro.* properties may NEVER be modified once set */ 
        if(!strncmp(name, "ro.", 3)) return -1; 
 
        pa = __system_property_area__; 
        update_prop_info(pi, value, valuelen); 
        pa->serial++; 
        __futex_wake(&pa->serial, INT32_MAX); 
    } else { 
        pa = __system_property_area__; 
        if(pa->count == PA_COUNT_MAX) return -1; 
 
        pi = pa_info_array + pa->count; 
        pi->serial = (valuelen << 24); 
        memcpy(pi->name, name, namelen + 1); 
        memcpy(pi->value, value, valuelen + 1); 
 
        pa->toc[pa->count] = 
            (namelen << 24) | (((unsigned) pi) - ((unsigned) pa)); 
 
        pa->count++; 
        pa->serial++; 
        __futex_wake(&pa->serial, INT32_MAX); 
    } 
    /* If name starts with "net." treat as a DNS property. */ 
    if (strncmp("net.", name, strlen("net.")) == 0)  { 
        if (strcmp("net.change", name) == 0) { 
            return 0; 
        } 
       /*
        * The 'net.change' property is a special property used track when any
        * 'net.*' property name is updated. It is _ONLY_ updated here. Its value
        * contains the last updated 'net.*' property.
        */ 
        property_set("net.change", name); 
    } else if (persistent_properties_loaded && 
            strncmp("persist.", name, strlen("persist.")) == 0) { 
        /*
         * Don't write properties to disk until after we have read all default properties
         * to prevent them from being overwritten by default values.
         */ 
        write_persistent_property(name, value); 
    } 
    property_changed(name, value); 
    return 0; 
}  

Cuando se establece la propiedad, si el comienzo persisten., Se creará de forma simultánea con los archivos con el nombre de propiedad en los datos / / propiedad del nombre de atributo de directorio, y escribir el valor de la propiedad.

Esto no es un poco viejo ah, veo yo es generar un archivo de datos / / propiedad / persistent_properties, que persisten las tiendas de propiedad.

#define PERSISTENT_PROPERTY_DIR  "/data/property" 
static void write_persistent_property(const char *name, const char *value) 
{ 
    const char *tempPath = PERSISTENT_PROPERTY_DIR "/.temp"; 
    char path[PATH_MAX]; 
    int fd, length; 
 
    snprintf(path, sizeof(path), "%s/%s", PERSISTENT_PROPERTY_DIR, name); 
 
    fd = open(tempPath, O_WRONLY|O_CREAT|O_TRUNC, 0600); 
    if (fd < 0) { 
        ERROR("Unable to write persistent property to temp file %s errno: %d\n", tempPath, errno); 
        return; 
    } 
    write(fd, value, strlen(value)); 
    close(fd); 
 
    if (rename(tempPath, path)) { 
        unlink(tempPath); 
        ERROR("Unable to rename persistent property file %s to %s\n", tempPath, path); 
    } 
} 

Cargando una propiedad permanente, se lee en el directorio / data / nombres de propiedad a toda la persisten. El comienzo del archivo de contenido como el nombre del valor del atributo correspondiente.

static void load_persistent_properties() 
{ 
    DIR* dir = opendir(PERSISTENT_PROPERTY_DIR); 
... 
    if (dir) { www.2cto.com
        while ((entry = readdir(dir)) != NULL) { 
            if (strncmp("persist.", entry->d_name, strlen("persist."))) 
                continue; 

 

Publicados 112 artículos originales · ganado elogios 3 · Vistas 9697

Supongo que te gusta

Origin blog.csdn.net/yush34/article/details/105275120
Recomendado
Clasificación