Android 의 시스템 속성 (SystemProperties) 분석

분석 은 안 드 로 이 드 4.03 을 바탕 으로 한다.
머리말
안 드 로 이 드 의 시스템 속성 은 windows 의 레 지 스 트 에 해당 하 며, key 와 value 로 구성 되 어 있 으 며, 모두 핵심 시스템 의 기본 메커니즘 이다.windows 레 지 스 트 에 비해 안 드 로 이 드 의 시스템 속성 은 간단 하 다. windows 레 지 스 트 리 의 트 리 구조 가 아니 라 목록 일 뿐이다. 즉, 부자 관계 가 없다 는 것 이다.value 는 string, int, long, boolean 이 있 지만 설정 은 문자열 로 만 가능 합 니 다.
Android 의 시스템 속성 은 두 부분 을 포함 합 니 다. 파일 에 저 장 된 지속 적 인 속성 과 켜 질 때마다 가 져 오 는 cache 속성 입 니 다.전 자 는 주로 아래 몇 개의 파일 에 저 장 됩 니 다 (디 렉 터 리 아래).
  • /default.prop
  • /system/build.prop
  • /system/default.prop
  • /data/local.prop
  • /data/property 디 렉 터 리 에 있 는 모든 presist 속성 (presist. 로 시작)
  • 후 자 는 API 방식 으로 사용한다.
    인터페이스
    1. JAVA 계층 인터페이스:
    가방 이름: android. os
    클래스 이름: System Properties, 숨겨 진 클래스
    인터페이스:
  • public static String get(String key, String def)
  • public static int getInt(String key, int def)
  • public static long getLong(String key, long def)
  • public static boolean getBoolean(String key, boolean def)
  • public static void set(String key, String val) 

  • 키 길 이 는 31 자 를 초과 할 수 없습니다. val 은 91 자 파일 을 초과 하지 않 습 니 다.
  • frameworks/base/core/java/android/os/SystemProperties.java

  • 2. JNI 인터페이스
    androidos_SystemProperties. cpp 정의, frameworks/base/core/jni/android Runtime. cpp 에 JNI 등록
    3. 로 컬 인터페이스
    인터페이스:
  • int property_get(const char *key, char *value, const char *default_value)
  • /* property_set: returns 0 on success, < 0 on failure */int property_set(const char *key, const char *value)
  • int property_list(void (*propfn)(const char *key, const char *value, void *cookie), void *cookie)

  • 파일:
  • system/core/include/cutils/properties.h
  • system/core/libcutils/properties.c

  • 4. 하부 bionic 내부 인터페이스
    시스템 속성 메커니즘 을 수정 하고 싶 지 않 으 면 분석 해 볼 수 있다
  • int __system_property_get(const char *name, char *value);
  • int __system_property_set(const char *key, const char *value);
  • const prop_info *__system_property_find(const char *name);
  • int __system_property_read(const prop_info *pi, char *name, char *value);
  • const prop_info *__system_property_find_nth(unsigned n);

  • 파일:
  • bionic/libc/include/sys/system_properties.h
  • bionic/libc/include/sys/_system_properties.h
  • bionic/libc/bionic/system_properties.c

  • 5. init. rc 인터페이스
    원본 rc 파일
  • system/core/rootdir/init.rc
  • device/vendor/platformname/init.devicename.rc

  • 컴 파일 후 out/target/product/platformname/root/아래로 이동 합 니 다.
    image 를 만 든 후 out/target/product/platformname/ramdisk. img 에서 플랫폼 이 다 르 기 때문에 파일 이름 이 다 를 수 있 습 니 다.
    장치 가 실 행 된 후 루트 디 렉 터 리 에 있 는 init *. rc 파일 입 니 다.
    init. rc 에서 속성, 감청 속성 변 화 를 설정 할 수 있 습 니 다.
    setprop key value
    on property:key=value
       do_your_work

    실현:
    init 프로 세 스에 서 property 의 처리, 관련 파일
  • system/core/init/property_service.c
  • system/core/init/property_service.h

  • 입구 함수 startproperty_서비스 및 propertyinit、load_persist_props
    1. 통신 메커니즘:
    property_set 는 두 세트 로 이 루어 집 니 다. 한 세트 인터페이스 3: 로 컬 인터페이스의 실현 은 인터페이스 4: 중 을 호출 합 니 다. __system_property_set,__system_property_set 는 로 컬 SOCKET: "/dev/socket/property service"를 통 해 init 프로 세 스 의 properties 서비스 와 통신 합 니 다.
    init 프로 세 스 의 system/core/init/property서비스. c (h) 코드 중 다른 propertyset 구현, init 프로 세 스에 만 사 용 됩 니 다.
    2. 안전 실현:
    key 의 value 를 설정 할 때 인증 권 이 필요 합 니 다. 설정 프로그램 이 있 는 프로 세 스 의 fd 에 따라 uid 값 을 알 수 있 습 니 다. 예 를 들 어 system server 프로 세 스 는 net 에서 시작 하 는 key 를 설정 할 수 있 고 gs m 에서 시작 하 는 key 를 설정 할 수 없습니다. 관련 정 의 는 다음 과 같 습 니 다.
    권한 정의 system/core/include/private/androidfilesystem_config.h
    #define AID_ROOT             0  /* traditional unix root user */
    #define AID_SYSTEM        1000  /* system server */
    #define AID_RADIO         1001  /* telephony subsystem, RIL */
    #define AID_DHCP          1014  /* dhcp client */
    #define AID_SHELL         2000  /* adb and debug shell user */
    #define AID_CACHE         2001  /* cache access */
    #define AID_APP          10000 /* first app user */

    속성 권한 표 는 system/core/init/propertyservice. c 정의, 화이트 리스트 방식 사용
    struct {
        const char *prefix;
        unsigned int uid;
        unsigned int gid;
    } property_perms[] = {
        { "net.rmnet0.",      AID_RADIO,    0 },
        { "net.gprs.",        AID_RADIO,    0 },
        { "net.ppp",          AID_RADIO,    0 },
        { "net.qmi",          AID_RADIO,    0 },
        { "net.lte",          AID_RADIO,    0 },
        { "net.cdma",         AID_RADIO,    0 },
        { "ril.",             AID_RADIO,    0 },
        { "gsm.",             AID_RADIO,    0 },
        { "persist.radio",    AID_RADIO,    0 },
        { "net.dns",          AID_RADIO,    0 },
        { "sys.usb.config",   AID_RADIO,    0 },
        { "net.",             AID_SYSTEM,   0 },
        { "dev.",             AID_SYSTEM,   0 },
        { "runtime.",         AID_SYSTEM,   0 },
        { "hw.",              AID_SYSTEM,   0 },
        { "sys.",             AID_SYSTEM,   0 },
        { "service.",         AID_SYSTEM,   0 },
        { "wlan.",            AID_SYSTEM,   0 },
        { "dhcp.",            AID_SYSTEM,   0 },
        { "dhcp.",            AID_DHCP,     0 },
        { "debug.",           AID_SHELL,    0 },
        { "log.",             AID_SHELL,    0 },
        { "service.adb.root", AID_SHELL,    0 },
        { "service.adb.tcp.port", AID_SHELL,    0 },
        { "persist.sys.",     AID_SYSTEM,   0 },
        { "persist.service.", AID_SYSTEM,   0 },
        { "persist.security.", AID_SYSTEM,   0 },
        { NULL, 0, 0 }
    };

    check 통과 하기perms 함수 로 권한 검사
    다음은 서비스 제어 권한 입 니 다.
    struct {
        const char *service;
        unsigned int uid;
        unsigned int gid;
    } control_perms[] = {
        { "dumpstate",AID_SHELL, AID_LOG },
        { "ril-daemon",AID_RADIO, AID_RADIO },
         {NULL, 0, 0 }
    };

    check 통과 하기control_perms 함수 로 권한 검사
    3. 감청 변화
    속성 을 수정 할 때 함수 property 를 통 해changed 알림 init 가 init. rc 의 trigger 를 촉발 합 니 다.
    4. 속성 특수 처리:
    1. ctl. 시작 하 는 속성 은 제어 속성 으로 시스템 의 로 컬 서 비 스 를 제어 하 는 데 사 용 됩 니 다.
  • ctl.start
  • ctl.stop
  • ctl.restart

  • 사용 문법
    ctl.xxx   servicename[:args]

    2. ro. 시작 속성 은 수정 할 수 없습니다.
    3. net. 시 작 된 속성 (net. change 제외) 설정 은 net. change = key 의 속성 설정 을 유발 합 니 다. bionic/libc/netbsd/resolv/resstate. c 의 코드 처리 ( system property find 함 수 를 통 해);
    4. persist. 시 작 된 속성 입 니 다. init. rc 와 코드 에 설정 하면/data/property 디 렉 터 리 에 기 록 됩 니 다.
     
    From : http://www.bobbog.com/archives/709

    좋은 웹페이지 즐겨찾기