關于ApplicationInfo flags快速了解
在Application中我們可以常常通過添加flags來标志一些屬性和能力,比如android:protectionLevel="system"或android:protectionLevel="signatureOrSystem"就表示添加了FLAG_SYSTEM這個标志,表示屬于系統級應用,當然,這個FLAG_SYSTEM依賴于簽名檢查或權限。
flag的判斷和使用
首先在Application中flages的預設值是0,而這些标志則用移位運算符号(<<) 表示。
以flag:FLAG_TEST_ONLY為例子
- 對于int值 1 來說,他的二進制為00000000 00000000 00000000 00000001(32位),FLAG_TEST_ONLY= 1<<8; 相對于 将1向左移動8位即00000000 00000000 00000001 00000000 == 2的8次方 即256
- 如果此時我們的flags隻添加了FLAG_DEBUGGABLE,那麼此時flags這個辨別的值為2 (二進制表示為00000000 00000000 00000000 00000010),當我們需要再去添加FLAG_TEST_ONLY辨別時,其實是做了或位運算**,flags=flags|FLAG_TEST_ONLY**
- 或位運算運算過程即二進制下同一位上如果有1則賦1,如下
計算對象 | 第32位 | … | 第10位 | 第9位 | 第8位 | 第7位 | 第6位 | 第5位 | 第4位 | 第3位 | 第2位 | 第1位 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
flags | 1 | |||||||||||
FLAG_TEST_ONLY | 1 | |||||||||||
計算後flags | 1 | 1 |
是以flags的最後結果就是00000000 00000000 00000001 00000010 即 258,這時可能會有同學好奇為什麼不直接加起來,這樣結果不是一樣的嗎?這時其實就要考慮一種情況,我的flags如果在代碼中添加的這個flag(比如FLAG_TEST_ONLY)之前已經添加過了,就會重複計算,那麼這時我們的結果就會出現問題,是以或位是目前較為好的選擇。
簡單來說,你可以把每一位想成一個flag,如果你添加了此flag那麼這個二進制位上的值肯定是1,如果沒有就是0,是以flag作為int類型最多也隻能有32種标志位,這樣的好處就是不用通過設定大量的bool變量來辨別是否開啟。
/**
* Value for {@link #flags}: set to true if this application would like to
* allow debugging of its
* code, even when installed on a non-development system. Comes
* from {@link android.R.styleable#AndroidManifestApplication_debuggable
* android:debuggable} of the <application> tag.
*/
public static final int FLAG_DEBUGGABLE = 1<<1;
/**
* Value for {@link #flags}: this is set if the application has specified
* {@link android.R.styleable#AndroidManifestApplication_testOnly
* android:testOnly} to be true.
*/
public static final int FLAG_TEST_ONLY = 1<<8;
public int flags = 0;
flag判斷
和或位運算相似,我們通過與位運算即可判斷該flags是否已添加了這個标志符,具體原理和或位相似,這裡不做贅述,使用樣例如下:
if ((getApplicationInfo().flags&ApplicationInfo.FLAG_TEST_ONLY)!=0){
//包含了此flag
.......
}else {
//未包含
.......
}
flag添加
對于flag我們的使用方式有兩種
一種為直接在 applicatio 标簽下添加需要的flag辨別
<application
.....
android:allowBackup="true" //對應FLAG_ALLOW_BACKUP
android:protectionLevel="system" //對應FLAG_SYSTEM
android:testOnly="true"> //對應FLAG_TEST_ONLY
........
</application>
另一種可以通過擷取到ApplicationInfo中的flags在代碼裡通過或為運算添加
ApplicationInfo中的flag 解析大全
flage名字 | 内容描述 | 值 |
---|---|---|
FLAG_SYSTEM | 如果設定,則此應用程式安裝在裝置的系統映像中 | 1<<0 |
FLAG_DEBUGGABLE | 如果此應用程式希望允許調試其代碼,則設定為 true,即使安裝在非開發系統上也是如此。 application 标簽android:debuggable | 1<<1 |
FLAG_HAS_CODE | 如果此應用程式具有與其關聯的代碼,則設定為 true。 application 标簽android:hasCode | 1<<2 |
FLAG_PERSISTENT | 如果此應用程式是持久的,則設定為 true。 application 标簽android:persistent | 1<<3 |
FLAG_FACTORY_TEST | 如果此應用程式擁有android.Manifest.permission.FACTORY_TEST權限并且裝置在工廠測試模式下運作,則設定為 true。 | 1<<4 |
FLAG_ALLOW_TASK_REPARENTING | 預設添加,android:allowTaskReparenting,一般和TaskAffinity屬性配對使用 | 1<<5 |
FLAG_ALLOW_CLEAR_USER_DATA | 預設添加,android:allowClearUserData,使用者是否能選擇自行清除資料,預設為true,程式管理器包含一個選擇允許使用者清除資料。當為true時,使用者可自己清理使用者資料,反之亦然 | 1<<6 |
FLAG_UPDATED_SYSTEM_APP | 如果此應用程式已安裝為内置系統應用程式的更新,則設定此值。 | 1<<7 |
FLAG_TEST_ONLY | application 标簽 android:testOnly ,辨別應用僅用于測試 | 1<<8 |
FLAG_SUPPORTS_SMALL_SCREENS | 當應用程式的視窗可以縮小以适應較小的螢幕時為真。 對應于android:smallScreens | 1<<9 |
FLAG_SUPPORTS_NORMAL_SCREENS | 當應用程式的視窗可以在普通螢幕上顯示時為真。 對應于android:normalScreens | 1<<10 |
FLAG_SUPPORTS_LARGE_SCREENS | 當應用程式的視窗可以為更大的螢幕增加大小時為真。 對應于android:largeScreens | 1<<11 |
FLAG_RESIZEABLE_FOR_SCREENS | 當應用程式知道如何針對不同的螢幕尺寸調整其 UI 時為 true。 對應于android:resizeable | 1<<12 |
FLAG_SUPPORTS_SCREEN_DENSITIES | 當應用程式知道如何适應不同的螢幕密度時為真。 對應于android:anyDensity 。已棄用:以 API 4 或更高版本為目标時預設設定,應用程式不應将此設定為 false | 1<<13 |
FLAG_VM_SAFE_MODE | 如果此應用程式想要請求 VM 在安全模式下運作,則設定為 true。 application标簽 android:vmSafeMode | 1<<14 |
FLAG_ALLOW_BACKUP | 如果應用程式不希望允許對其資料進行任何作業系統驅動的備份,則設定為false ; 否則為true 。application 标簽android:allowBackup屬性。 | 1<<15 |
FLAG_KILL_AFTER_RESTORE | 如果應用程式必須在全系統還原操作後保留在記憶體中,則設定為false ; 否則為true 。 通常,在完整的系統還原操作期間,每個應用程式都會在執行其代理的 onRestore() 方法後關閉。 将此屬性設定為false可防止出現這種情況。 大多數應用程式不需要設定此屬性。如果android:allowBackup設定為false或未指定android:backupAgent ,則該标志将被忽略。application 标簽android:killAfterRestore屬性。 | 1<<16 |
FLAG_RESTORE_ANY_VERSION | 如果應用程式的備份代理聲稱能夠處理甚至“來自未來”的恢複資料,即來自版本代碼大于裝置上目前安裝的版本代碼的應用程式版本,則設定為true 。 謹慎使用! 預設情況下,此屬性為false ,備份管理器将確定在還原操作期間永遠不會提供來自應用程式“未來”版本的資料。如果android:allowBackup設定為false或未指定android:backupAgent ,則該标志将被忽略。application 标簽android:restoreAnyVersion屬性。 | 1<<17 |
FLAG_EXTERNAL_STORAGE | 如果應用程式目前安裝在外部/可移動/不受保護的存儲上,則設定為 true。 如果目前未安裝此類應用程式的存儲,則此類應用程式可能不可用。 當它所在的存儲不可用時,它看起來像是應用程式已被解除安裝(其 .apk 不再可用),但其持久資料并未删除 | 1<<18 |
FLAG_SUPPORTS_XLARGE_SCREENS | 當應用程式的視窗可以為超大螢幕增加大小時為真。 對應于android:xlargeScreens | 1<<19 |
FLAG_LARGE_HEAP | 當應用程式為其程序請求大堆時為真。 對應于android:largeHeap | 1<<20 |
FLAG_STOPPED | 如果此應用程式的包處于停止狀态,則為 true。 | 1<<21 |
FLAG_SUPPORTS_RTL | 當應用程式願意支援 RTL(從右到左)時為 true。 所有活動都會繼承這個值。 從活動清單中的android.R.attr.supportsRtl屬性設定。 預設值為 false(不支援 RTL) | 1<<22 |
FLAG_INSTALLED | 如果目前為調用使用者安裝了應用程式,則為 true。 | 1<<23 |
FLAG_IS_DATA_ONLY | 如果應用程式隻安裝了它的資料,則為 true; 應用程式包本身目前不存在于裝置上 | 1<<24 |
FLAG_IS_GAME | flags值:如果應用程式被聲明為遊戲,則為 true,如果它是非遊戲應用程式,則為 false。已棄用:請改用CATEGORY_GAME 。 | 1<<25 |
FLAG_FULL_BACKUP_ONLY | true如果應用程式要求,隻有全資料流的資料進行備份,即使它定義了一個進行BackupAgent ,這通常表示該應用程式将通過增量鍵/值更新管理其備份資料。 | 1<<26 |
FLAG_USES_CLEARTEXT_TRAFFIC | 如果應用程式可能使用明文網絡流量(例如,HTTP 而不是 HTTPS;WebSockets 而不是 WebSockets Secure;XMPP、IMAP、STMP 沒有 STARTTLS 或 TLS),則為true 。 如果為false ,則應用聲明它不打算使用明文網絡流量,在這種情況下,平台元件(例如,HTTP 堆棧、 DownloadManager 、 MediaPlayer )将拒絕應用使用明文流量的請求。 鼓勵第三方圖書館也尊重這個标志。**注意: WebView為面向 API 級别 26 及更進階别的應用程式提供此标志。**如果存在 Android 網絡安全配置,則在 Android N 及更高版本上會忽略此标志。application 标簽 android:usesCleartextTraffic | 1<<27 |
FLAG_EXTRACT_NATIVE_LIBS | 設定安裝程式從 .apk 檔案中提取本機庫時為true | 1<<28 |
FLAG_HARDWARE_ACCELERATED | 當應用程式的渲染應該是硬體加速時為true | 1<<29 |
FLAG_SUSPENDED | 如果此應用程式的包處于挂起狀态,則為 true | 1<<30 |
FLAG_MULTIARCH | 如果來自此應用程式的代碼需要加載到其他應用程式的程序中,則為 true。 在支援多個指令集的裝置上,這意味着代碼可能會加載到使用任何裝置支援的指令集的程序中。系統可能會特别對待此類應用程式,例如,通過為所有支援的指令集提取應用程式的本地庫或通過為所有支援的指令集編譯應用程式的 dex 代碼 | 1<<31 |
最後
資料整理不易,如果可以,請同學們多多點贊,收藏,鼓勵!!!
