안드로이드의 단말에서 참조할 수 있는 프로퍼티는 크게 두 종류다. 하나는 (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가 생겼다.
참조
- http://luhamizz.tistory.com/m/post/40
- http://stackoverflow.com/questions/2641111/where-is-android-os-systemproperties
- http://stackoverflow.com/questions/21099301/android-adb-commands-to-get-the-device-properties
- https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/SystemProperties.java
- https://developer.android.com/about/versions/android-5.1.html#multisim
핑백: Dog발자
듀얼심 관련되서 찾다가 좋은 힌트 얻어갑니다 감사합니다
듀얼심에 대한 내용은 저도 거의 못찾겠더라구요. 그래서 본 김에 정리해둔건데 도움이 되셨다니 기쁩니다 😉
핑백: 안드로이드 dumpstate 분석 | Dog발자