안드로이드의 프로퍼티

안드로이드의 단말에서 참조할 수 있는 프로퍼티는 크게 두 종류다. 하나는 (java.lang.)System로 얻을 수 있는 자바의 프로퍼티와 android.os.SystemProperties 다.

그 중에 System은 공개되어 있으며 getProperties()를 통해 일반 어플리케이션 아래와 같이 자바에 관련된 정보를 가져올 수 있다.

java.vm.specification.vendor=The Android Project
java.vm.name=Dalvik
java.vm.specification.version=0.9
java.vendor.url=http://www.android.com/
user.home=/
java.ext.dirs=
java.specification.name=Dalvik Core Library
line.separator=
file.encoding=UTF-8
java.runtime.version=0.9
user.name=root
file.separator=/
java.library.path=/vendor/lib:/system/lib
java.compiler=
os.version=3.10.28-4787989
android.icu.unicode.version=6.2
java.boot.class.path=/system/framework/core.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/framework2.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar:/system/framework/webviewchromium.jar:/system/framework/sec_edm.jar:/system/framework/timakeystore.jar:/system/framework/twframework.jar:/system/framework/commonimsinterface.jar:/system/framework/imsmanager.jar:/system/framework/com.broadcom.bt.jar:/system/framework/seccamera.jar:/system/framework/scrollpause.jar:/system/framework/stayrotation.jar:/system/framework/smartfaceservice.jar:/system/framework/secmediarecorder.jar:/system/framework/secocsp.jar:/system/framework/qcmediaplayer.jar:/system/framework/oem-services.jar:/system/framework/org.codeaurora.Performance.jar
java.vm.specification.name=Dalvik Virtual Machine Specification
java.version=0
android.icu.library.version=51.1.0.1
os.name=Linux
user.region=KR
os.arch=armv7l
java.class.path=.
java.io.tmpdir=/data/data/me.sunphiz.android.myapplication/cache
android.zlib.version=1.2.8.f-linuxfoundation-mods-v1
user.language=ko
java.vm.version=1.6.0
java.specification.vendor=The Android Project
java.vm.vendor=The Android Project
java.vendor=The Android Project
http.agent=Dalvik/1.6.0 (Linux; U; Android 4.4.4; SM-A500K Build/KTU84P)
android.icu.cldr.version=23.0
android.openssl.version=OpenSSL 1.0.1e 11 Feb 2013
path.separator=:
java.runtime.name=Android Runtime
java.specification.version=0.9
user.dir=/
java.vm.vendor.url=http://www.android.com/
java.home=/system
java.class.version=50.0}

이에 비해 android.os.SystemProperties 클래스는 히든 클래스로 일반 어플리케이션에서는 참조할 수 없다.  일반적으로 단말에 직접적인 정보를 가지고 있는데, adb 명령어를 통해 명령창에서 확인할 수 있다.

>adb shell getprop
[ro.secure]: [1]
[ro.allow.mock.location]: [0]
[ro.debuggable]: [0]
[persist.service.adb.enable]: [1]
[ro.factorytest]: [0]
[ro.serialno]: [c08908109c642be]
[ro.bootmode]: [unknown]
[ro.baseband]: [unknown]
[ro.carrier]: [unknown]
[ro.bootloader]: [unknown]
[ro.hardware]: [smdkc110]
[ro.revision]: [0]
[audioflinger.bootsnd]: [0]
[ro.build.id]: [GINGERBREAD]
[ro.build.display.id]: [GINGERBREAD.UEKI8]
[ro.build.version.incremental]: [UEKI8]
[ro.build.version.sdk]: [10]
[ro.build.version.codename]: [REL]
[ro.build.version.release]: [2.3.5]
[ro.build.date]: [Fri Sep 16 21:22:25 KST 2011]
[ro.build.date.utc]: [1316175745]
[ro.build.type]: [user]
[ro.build.user]: [se.infra]
[ro.build.host]: [SEP-49]
[ro.build.tags]: [release-keys]
[ro.product.model]: [YP-G70]
[ro.product.brand]: [samsung]
[ro.product.name]: [YP-G70]
[ro.product.device]: [YP-G70]
[ro.product.board]: [YP-G70]
[ro.product.cpu.abi]: [armeabi-v7a]
[ro.product.cpu.abi2]: [armeabi]
[ro.product.manufacturer]: [samsung]
[ro.product.locale.language]: [en]
[ro.product.locale.region]: [US]
[ro.wifi.channels]: []
[ro.board.platform]: [s5pc110]
[ro.build.product]: [YP-G70]
[ro.build.description]: [YP-G70-user 2.3.5 GINGERBREAD UEKI8 release-keys]
[ro.build.fingerprint]: [samsung/YP-G70/YP-G70:2.3.5/GINGERBREAD/UEKI8:user/release-keys]
[ro.build.PDA]: [G70UEKI8]
[ro.build.hidden_ver]: [G70UEKI8]
[ro.build.changelist]: [566269]
[ro.csc.sales_code]: [XAA]
[ro.flash.resolution]: [720]
[rild.libpath]: [/system/lib/libsec-ril-apalone.so]
[rild.libargs]: [-d /dev/ttyS0]
[ro.sf.lcd_density]: [240]
[dalvik.vm.heapsize]: [72m]
[ro.opengles.version]: [131072]
[persist.service.usb.setting]: [2]
[ro.config.ringtone]: [01_Minimal_tone.ogg]
[ro.config.notification_sound]: [01_Sherbet.ogg]
[ro.config.alarm_alert]: [Good_Morning.ogg]
[ro.url.legal]: [http://www.google.com/intl/%s/mobile/android/basic/phone-legal.html]
[ro.url.legal.android_privacy]: [http://www.google.com/intl/%s/mobile/android/basic/privacy.html]
[ro.com.google.locationfeatures]: [1]
[ro.setupwizard.mode]: [DISABLED]
[ro.com.google.gmsversion]: [2.3_r6]
[wifi.interface]: [eth0]
[wifi.supplicant_scan_interval]: [15]
[ro.secdevenc]: [true]
[keyguard.no_require_sim]: [true]
[ro.com.android.dateformat]: [MM-dd-yyyy]
[ro.com.android.dataroaming]: [false]
[ro.ril.hsxpa]: [1]
[ro.ril.gprsclass]: [10]
[media.stagefright.enable-player]: [false]
[media.stagefright.enable-meta]: [false]
[media.stagefright.enable-scan]: [false]
[media.stagefright.enable-http]: [true]
[media.stagefright.enable-rtsp]: [false]
[dalvik.vm.dexopt-flags]: [m=y]
[net.bt.name]: [Android]
[net.change]: [net.dnschange]
[dalvik.vm.stack-trace-file]: [/data/anr/traces.txt]
[ro.com.google.clientidbase]: [android-samsung]
[persist.sys.language]: [en]
[persist.sys.country]: [US]
[persist.sys.localevar]: []
[persist.sys.timezone]: [America/New_York]
[ro.FOREGROUND_APP_ADJ]: [0]
[ro.VISIBLE_APP_ADJ]: [1]
[ro.PERCEPTIBLE_APP_ADJ]: [1]
[ro.HEAVY_WEIGHT_APP_ADJ]: [2]
[ro.SECONDARY_SERVER_ADJ]: [2]
[ro.BACKUP_APP_ADJ]: [2]
[ro.HOME_APP_ADJ]: [4]
[ro.HIDDEN_APP_MIN_ADJ]: [7]
[ro.CONTENT_PROVIDER_MEM]: [14]
[ro.EMPTY_APP_ADJ]: [15]
[ro.FOREGROUND_APP_MEM]: [2560]
[ro.VISIBLE_APP_MEM]: [4096]
[ro.PERCEPTIBLE_APP_MEM]: [4096]
[ro.HEAVY_WEIGHT_APP_MEM]: [4096]
[ro.SECONDARY_SERVER_MEM]: [6144]
[ro.BACKUP_APP_MEM]: [6144]
[ro.HOME_APP_MEM]: [6144]
[ro.HIDDEN_APP_MEM]: [10240]
[ro.EMPTY_APP_MEM]: [12288]
[net.tcp.buffersize.default]: [4096,87380,196608,4096,16384,110208]
[net.tcp.buffersize.wifi]: [4095,87380,393216,4096,16384,110208]
[net.tcp.buffersize.umts]: [4094,87380,196608,4096,16384,110208]
[net.tcp.buffersize.edge]: [4093,26280,35040,4096,16384,35040]
[net.tcp.buffersize.gprs]: [4092,8760,11680,4096,8760,11680]
[init.svc.console]: [running]
[init.svc.pvrsrvinit]: [stopped]
[init.svc.macloader]: [stopped]
[init.svc.servicemanager]: [running]
[init.svc.vold]: [running]
[init.svc.notified_event]: [running]
[init.svc.memsicd]: [stopped]
[init.svc.netd]: [running]
[init.svc.debuggerd]: [running]
[init.svc.ril-daemon]: [running]
[init.svc.mobex-daemon]: [running]
[init.svc.DR-deamon]: [running]
[init.svc.zygote]: [running]
[init.svc.media]: [running]
[init.svc.dbus]: [running]
[init.svc.installd]: [running]
[init.svc.keystore]: [running]
[init.svc.immvibed]: [stopped]
[init.svc.orientationd]: [restarting]
[init.svc.geomagneticd]: [restarting]
[init.svc.gpsd]: [running]
[init.svc.setup_fs]: [stopped]
[init.svc.tvout]: [running]
[ro.radio.noril]: [yes]
[ro.bt.bdaddr_path]: [/efs/bluetooth/bt_addr]
[status.battery.state]: [Slow]
[status.battery.level]: [5]
[status.battery.level_raw]: [50]
[status.battery.level_scale]: [9]
[ro.telephony.call_ring.multiple]: [0]
[ro.nfc.port]: [I2C]
[init.svc.adbd]: [running]
[ril.bt_macaddr]: [F8D0BD70AFCD]
[ril.wifi_macaddr]: [F8:D0:BD:70:AF:CE]
[ril.serialnumber]: [120C203JZ8 ]
[ril.RildInit]: [1]
[init.svc.samsungani]: [stopped]
[init.svc.playsound]: [stopped]
[service.brcm.bt.is_sta]: [1]
[hw.keyboards.65536.devname]: [cytma340_input]
[hw.keyboards.0.devname]: [s3c-keypad]
[hw.keyboards.65537.devname]: [s3c-keypad]
[hw.keyboards.131074.devname]: [sec_jack]
[net.hostname]: [android_ed826d2090918108]
[EXTERNAL_STORAGE_STATE]: [mounted]
[EXTERNAL_STORAGE_STATE_SD]: [mounted]
[wlan.driver.status]: [ok]
[wlan.firmware.name]: [bcm4329_sta.bin]
[init.svc.wpa_supplicant]: [running]
[wlan.supplicant.statu]: [connected]
[dev.bootcomplete]: [1]
[dhcp.eth0.result]: [ok]
[init.svc.dhcpcd]: [running]
[dhcp.eth0.pid]: [5223]
[gsm.version.ril-impl]: [Samsung RIL(IPC) v2.0]
[dhcp.eth0.reason]: [BOUND]
[dhcp.eth0.dns1]: [10.4.0.1]
[dhcp.eth0.dns2]: [8.8.8.8]
[dhcp.eth0.dns3]: [4.2.2.2]
[dhcp.eth0.dns4]: []
[dhcp.eth0.ipaddress]: [10.4.0.139]
[dhcp.eth0.gateway]: [10.4.0.1]
[dhcp.eth0.mask]: [255.255.255.0]
[dhcp.eth0.leasetime]: [648000]
[dhcp.eth0.server]: [10.4.0.1]
[net.dns1]: [10.4.0.1]
[net.dns2]: [8.8.8.8]
[net.dnschange]: [3]
[gsm.sim.operator.numeric]: []
[gsm.sim.operator.alpha]: []
[gsm.sim.operator.iso-country]: []
[gsm.sim.state]: [UNKNOWN]
[gsm.current.phone-type]: [0]
[gsm.operator.alpha]: []
[gsm.operator.numeric]: []
[gsm.operator.iso-country]: []
[gsm.operator.isroaming]: [false]
[ril.ecclist0]: [112,911,999,000,08,110,118,119]
[sys.boot_completed]: [1]
[ro.runtime.firstboot]: [1335534496120]
[sys.settings_secure_version]: [8]
[gsm.defaultpdpcontext.active]: [false]
[sys.settings_system_version]: [5]

꼭 SystemProperties를 어플리케이션에서 사용하고 싶다면, 위 정보를 가져오는 방법은 보통 두가지다.

  • 리플렉션(reflection) (일반적으로 사용)
  • android.os.SystemProperties의 {@hide} 선언을 지운 후, 어플리케이션 내에 소스를 직접 넣고 빌드하기

하지만, 보통의 어플리케이션은 위 정보의 대부분에 직접 접근할 필요가 없으며, 일부 어플리케이션에서 참조할만한 정보는 android.os.Build 클래스나 android.content.res.Configuration 클래스를 통해 제공하고 있다.

Build 클래스를 통해서는 다음과 같은 정보 등을 얻을 수 있다.

  • manufacturer
  • model
  • serial

Configuration 클래스를 통해서는 다음과 같은 정보 등을 얻을 수 있다.

  • locale
  • mcc
  • mnc
  • orientation
  • densityDpi
  • fontScale

그 밖에

중국이나 일본에 유통되는 단말 중에는 USIM이 2개 들어가는 모델도 있다. 이런 단말의 프로퍼티 정보를 확인하면 다음처럼 정보가 2개씩 들어있다.

[gsm.operator.alpha]: [China Telecom,CHINA MOBILE]
[gsm.operator.idpstring]: [00]
[gsm.operator.iso-country]: [cn,cn]
[gsm.operator.ispsroaming]: [false,false]
[gsm.operator.isroaming]: [false,false]
[gsm.operator.numeric]: [46003,46000]
[gsm.sim.active]: [0,0]
[gsm.sim.activity.dual]: [false]
[gsm.sim.activity]: [false,false]
[gsm.sim.adn1]: [false]
[gsm.sim.availability]: [true,true]
[gsm.sim.cardname.dual]: [Slot 1]
[gsm.sim.cardname]: [中国电信,中国移动]
[gsm.sim.cardnoti]: [2,2]
[gsm.sim.cdmaoperator.numeric]: [46003]
[gsm.sim.currentcardstatus]: [3,3]
[gsm.sim.fdn_support]: [0]
[gsm.sim.gsmoperator.numeric]: [46011]
[gsm.sim.icon.dual]: [0]
[gsm.sim.icon]: [0,1]
[gsm.sim.newCheck]: [false,false]
[gsm.sim.operator.alpha]: [中国电信,CMCC]
[gsm.sim.operator.iso-country]: [cn,cn]
[gsm.sim.operator.numeric]: [46003,46000]
[gsm.sim.pplock]: [unlock,unlock]
[gsm.sim.selectnetwork]: [CDMA]
[gsm.sim.slotswitching]: [0]
[gsm.sim.state]: [READY,READY]

USIM이 2개 들어있더라도 한 순간에 동작하는 심은 1개 뿐이다. 그 심을 어떻게 확인할 수 있을까? 이런 판단을 개발자가 할 필요가 없다.  Configuration을 통해 얻은 mcc, mnc를 가지고 판단하면 되기 때문이다.

추가적으로, 5.1 부터는 공식적으로 dual sim에 대한 API가 생겼다.

참조

“안드로이드의 프로퍼티”에 대한 4개의 생각

  1. 핑백: Dog발자

    1. 듀얼심에 대한 내용은 저도 거의 못찾겠더라구요. 그래서 본 김에 정리해둔건데 도움이 되셨다니 기쁩니다 😉

  2. 핑백: 안드로이드 dumpstate 분석 | Dog발자

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.