關於system/priv-app和system/app目錄以及許可權
這篇文章將會說到有關android許可權,android簽名,所以會分為幾篇寫。
最近有個專案遇到一個問題,我把客戶的apk預置到了system/priv-app下,怎麼預置的?
在android.mk下加入一句LOCAL_PRIVILEGED_MODULE := true就行了。
然後就出現了一個問題,因為將usb遮蔽了所以客戶使用adb install 來安裝他們的apk,發現了一個問題,預置在裡面的apk版本1.0,他們在adb install完後的apk版本是1.1,但是——重啟之後版本又變回了1.0,想來想去極有可能是因為我把apk預置到了system/priv-app下了,於是就查閱了一些相關資料,瞭解了一些相關東西(雖然後面發現其實是客戶自己寫的apk版本寫的有問題,具體可以參考https://developer.android.com/studio/publish/versioning)。
先說明有關android許可權的一些東西,android有4種許可權:
normal:低風險許可權,只要申請了就可以使用(在AndroidManifest.xml中新增<uses-permission>標籤),安裝時不需要使用者確認;
dangerous:高風險許可權,安裝時需要使用者的確認才可使用;
signature:只有當申請許可權的應用程式的數字簽名與宣告此許可權的應用程式的數字簽名相同時(如果是申請系統許可權,則需要與系統簽名相同),才能將許可權授給它;
signatureOrSystem:簽名相同,或者申請許可權的應用為系統應用(在system image中)。
這些許可權都在frameworks/base/core/res/AndroidManifest.xml裡面定義:
<permission android:name="com.android.alarm.permission.SET_ALARM" android:label="@string/permlab_setAlarm" android:description="@string/permdesc_setAlarm" android:protectionLevel="normal" /> <permission android:name="android.permission.READ_CONTACTS" android:permissionGroup="android.permission-group.CONTACTS" android:label="@string/permlab_readContacts" android:description="@string/permdesc_readContacts" android:protectionLevel="dangerous" /> <permission android:name="android.permission.ACCESS_IMS_CALL_SERVICE" android:permissionGroup="android.permission-group.PHONE" android:label="@string/permlab_accessImsCallService" android:description="@string/permdesc_accessImsCallService" android:protectionLevel="signature|system" /> <permission android:name="android.permission.RECEIVE_EMERGENCY_BROADCAST" android:protectionLevel="signature|privileged" />
對於做應用開發的程式設計師來說,normal和dangerous級別的許可權是他們需要關心的,但是對於做framework的程式設計師來說四種級別的許可權都需要關注,因為預置apk這個事情做android平臺二次開發的程式設計師怕是都沒少做。