最近了解到Google 在Android12上新增了權限指示器,可以在信號欄的右側顯示當前訪問錄音機和Camera的應用,點擊后可以跳轉到相應應用的權限界面,消費者可以控制權限的開啟和關閉。國內手機廠商最近幾年都在增加隱私看板供能,消費者可以看到相機、錄音機被其他應用訪問的記錄,包含次數、時長等信息。
尤其Android 14,強制要求在信號區增加隱私指示器,可見安卓在隱私保護上的決心。
我估計手動控制權限的開啟和關閉,并不是這個特性和核心。關鍵是Google或者說安卓系統愿意把權限的調用暴露給普通的消費者,本身這個態度帶來的社會效應,至少讓消費者最擔心的聲音和圖像的泄露問題,得到了緩解。
本文主要是探討起技術實現原理:
google官方文檔鏈接如下,中英文還是略微有些區別,注意甄別https://source.android.com/docs/core/permissions/privacy-indicators
里面關鍵的圖:
上圖可見,核心的交互模塊是AppOps,AppOps并不是Android12的新事物,早在Android 4.0就有了,其內部核心的幾個類,
AppOpsManager
IAppOpsService.aidl??
AppOpsService
AppOpsCheckingServiceImpl
?
普通的安卓應用可以調用下述接口,監聽Ops的訪問記錄
appOpsManager.startWatchingMode(AppOpsManager.OPSTR_READ_MEDIA_AUDIO, ?null /* all packages */, mModeListener);
其中,第二個參數,傳null代表,監聽所有應用,也可以傳具體的包名
當關心的包名,訪問了具體的Ops,監聽者就會收到回調。
調試手段:
adb shell dumpsys appops可以把ops服務的內部狀態dump出來
具體解釋如下:
Op mode watchers:Op COARSE_LOCATION:#0: ModeCallback{7f9fe97 watchinguid=-1 flags=0x0 op=FINE_LOCATION from uid=u0a144 pid=4204}#1: ModeCallback{82529b5 watchinguid=-1 flags=0x1 op=COARSE_LOCATION from uid=1000 pid=2265}#2: ModeCallback{926d7c2 watchinguid=-1 flags=0x0 op=READ_WRITE_HEALTH_DATA from uid=1000 pid=2265}#3: ModeCallback{da82a52 watchinguid=-1 flags=0x1 op=MONITOR_LOCATION from uid=u0a21 pid=4702}#4: ModeCallback{efa62b9 watchinguid=-1 flags=0x1 op=FINE_LOCATION from uid=u0a21 pid=4702}Op FINE_LOCATION:#0: ModeCallback{59f601b watchinguid=-1 flags=0x1 op=FINE_LOCATION from uid=1000 pid=2265}#1: ModeCallback{7f9fe97 watchinguid=-1 flags=0x0 op=FINE_LOCATION from uid=u0a144 pid=4204}#2: ModeCallback{926d7c2 watchinguid=-1 flags=0x0 op=READ_WRITE_HEALTH_DATA from uid=1000 pid=2265}
這是按具體的ops排列,打印出所有的監聽者,可以配合ps -A命令查看具體的pid是哪個進程
Package mode watchers:Pkg com.microsoft.appmanager:#0: ModeCallback{5f879b8 watchinguid=-1 flags=0x0 op=SYSTEM_ALERT_WINDOW from uid=1000 pid=5190}Pkg com.youku.phone:#0: ModeCallback{4e42e95 watchinguid=-1 flags=0x0 op=SYSTEM_ALERT_WINDOW from uid=1000 pid=5190}#1: ModeCallback{cd0ffac watchinguid=-1 flags=0x0 op=REQUEST_INSTALL_PACKAGES from uid=1000 pid=5190}
這是按具體的包名排列,打印出所有的監聽者,可以配合ps -A命令查看具體的pid是哪個進程
Uid u0a237:state=cchcapability=------appWidgetVisible=falsePOST_NOTIFICATION: mode=ignoreLEGACY_STORAGE: mode=allowPackage com.alphainventor.filemanager:WAKE_LOCK (allow): null=[Access: [top-s] 2023-11-14 11:33:19.924 (-7d1h1m54s148ms) duration=+42ms]READ_EXTERNAL_STORAGE (allow): null=[Access: [top-s] 2023-11-14 11:33:16.111 (-7d1h1m57s961ms)]
這是按具體的Uid(包名),打印出最近的訪問記錄