每個(gè)Android應(yīng)用都是獨(dú)立的校赤,并且運(yùn)行在自己的受限的安全的環(huán)境下吆玖,在計(jì)算機(jī)安全領(lǐng)域,我們稱之為沙盒马篮,如果應(yīng)用想要訪問沙盒之外的東西沾乘,它必須申請相應(yīng)的權(quán)限。
根據(jù)權(quán)限的級(jí)別浑测,系統(tǒng)會(huì)直接授予應(yīng)用一些級(jí)別較低的權(quán)限,比如開啟閃光燈迁央,但是如果應(yīng)用想要讀取用戶的聯(lián)系人,那系統(tǒng)就會(huì)彈出提示岖圈,讓用戶來做決定是否給應(yīng)用這個(gè)權(quán)限讹语。
Android權(quán)限分成兩種,第一種是普通權(quán)限(Normal permissions)幅狮,比如設(shè)置時(shí)區(qū)需要的就只是一個(gè)普通權(quán)限募强。普通權(quán)限基本上不會(huì)涉及到隱私和安全問題。應(yīng)用在安裝的時(shí)候崇摄,系統(tǒng)就會(huì)直接授予應(yīng)用這些普通權(quán)限擎值,我們也無法在安裝好了應(yīng)用之后在系統(tǒng)設(shè)置里面取消對(duì)這些權(quán)限的授權(quán)。
從API Level 23——也就是Android 6.0——開始逐抑,這些權(quán)限被歸類為PROTECTION_NORMAL鸠儿。PROTECTION_NORMAL是android.content.pm.PermissionInfo類的一個(gè)字段,我們這里暫且不提厕氨。
普通權(quán)限包括:
ACCESS_LOCATION_EXTRA_COMMANDS进每,ACCESS_NETWORK_STATE,ACCESS_NOTIFICATION_POLICY命斧,ACCESS_WIFI_STATE田晚,BLUETOOTH,BLUETOOTH_ADMIN国葬,BROADCAST_STICKY贤徒,CHANGE_NETWORK_STATE,CHANGE_WIFI_MULTICAST_STATE汇四,CHANGE_WIFI_STATE接奈,DISABLE_KEYGUARD,EXPAND_STATUS_BAR通孽,GET_PACKAGE_SIZE序宦,INSTALL_SHORTCUT,INTERNET背苦,KILL_BACKGROUND_PROCESSES互捌,MODIFY_AUDIO_SETTINGS,NFC行剂,READ_SYNC_SETTINGS疫剃,READ_SYNC_STATS,RECEIVE_BOOT_COMPLETED硼讽,REORDER_TASKS巢价,REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,REQUEST_INSTALL_PACKAGES固阁,SET_ALARM壤躲,SET_TIME_ZONE,SET_WALLPAPER碉克,SET_WALLPAPER_HINTS漏麦,TRANSMIT_IR,UNINSTALL_SHORTCUT更耻,USE_FINGERPRINT捏膨,VIBRATE,WAKE_LOCK号涯,WRITE_SYNC_SETTINGS
還有一類權(quán)限被稱為高危權(quán)限。高危權(quán)限指的是涉及到用戶隱私的權(quán)限誉己。如果應(yīng)用需要使用用戶的個(gè)人隱私巫延,那么就得先向用戶申請授予自己高危權(quán)限地消,這種情況下系統(tǒng)會(huì)彈出提示,讓用戶自己來決定是否將相應(yīng)的權(quán)限授予這款應(yīng)用疼阔。
所有的高危權(quán)限都被分了組婆廊,這個(gè)組被稱為權(quán)限組巫橄,每個(gè)權(quán)限組里面都包含若干高危權(quán)限湘换。從Android 6.0開始彩倚,如果應(yīng)用要使用高危權(quán)限,必須遵循如下步驟:
如果一個(gè)高危權(quán)限只是在應(yīng)用的清單文件里面聲明蔬蕊,那么應(yīng)用暫時(shí)還沒有獲取到這個(gè)權(quán)限岸夯。系統(tǒng)會(huì)彈出一個(gè)對(duì)話框,告訴用戶應(yīng)用需要請求某個(gè)權(quán)限組中的權(quán)限勉吻。這個(gè)對(duì)話框上面不會(huì)描述這個(gè)權(quán)限組里面某一個(gè)特定的權(quán)限破镰。例如鲜漩,如果一個(gè)程序請求READ_CONTACTS權(quán)限孕似,系統(tǒng)對(duì)話框只會(huì)說應(yīng)用需要聯(lián)系人的權(quán)限刮刑。如果用戶同意了,那么系統(tǒng)才會(huì)給應(yīng)用它所申請的權(quán)限泛烙。
如果一個(gè)應(yīng)用在清單文件里面聲明了一個(gè)高危權(quán)限蔽氨,并且這個(gè)應(yīng)用已經(jīng)獲得了同一個(gè)權(quán)限組內(nèi)的另一個(gè)高危權(quán)限的授權(quán)帆疟,那么當(dāng)應(yīng)用需要這個(gè)高危權(quán)限的時(shí)候踪宠,系統(tǒng)就不會(huì)再彈出對(duì)話框請求用戶裁決是否給應(yīng)用這個(gè)權(quán)限了柳琢。比如如果剛才用戶已經(jīng)授權(quán)給應(yīng)用READ_CONTACTS的權(quán)限了湘捎,如果應(yīng)用再去請求WRITE_CONTACTS權(quán)限潮太,系統(tǒng)就會(huì)自動(dòng)把這項(xiàng)權(quán)限授權(quán)給應(yīng)用奕纫。
任何權(quán)限都可以屬于某個(gè)權(quán)限組行施,包括普通權(quán)限和用戶自定義權(quán)限蛾号。但是,只有高危權(quán)限的權(quán)限組才有用展运。所以您可以不用理會(huì)普通權(quán)限的權(quán)限組問題精刷。
如果設(shè)備運(yùn)行在低于Android 6.0的版本上怒允,那么系統(tǒng)會(huì)在安裝的時(shí)候授予應(yīng)用它所需要的權(quán)限纫事。
再次重申丽惶,系統(tǒng)只會(huì)請求用戶授權(quán)某個(gè)權(quán)限組钾唬,而不會(huì)只讓用戶就單個(gè)權(quán)限向用戶發(fā)起授權(quán)請求