android P 隱藏API對系統APP的影響
android P限制了第三方APK對@hide API的呼叫,那麼對系統APK有什麼影響呢?
國內各大手機廠商對ROM進行各種定製,可以很容易繞過這些限制,那對於需要出海並且滿足CTS要求的廠商有什麼影響呢?
先說結論:對系統廠商APK沒有任何影響,依然可呼叫任何API
-
第三方APK,受hide限制
-
系統platform簽名APK,不受限制
-
非platform簽名APK,整合在system分割槽,又在hiddenapi-package-whitelist.xml,不受限制。(且目前 不影響CTS)
一、對第三方APK、系統APK的影響
SDK28 | @hide 淺灰 | @hide 黑名單 | @systemapi |
---|---|---|---|
非platform簽名 | |||
/data/app | 是,警告 | 否 | 是,需permisison許可權 |
/system/app | 是,警告 | 否 | 是,需permisison許可權 |
/system/priv-app | 是,警告 | 否 | 是,需permisison許可權 |
hiddenapi-package-whitelist.xml (/system/app、priv-app) |
是 | 是 | 是,需permisison許可權 |
platform簽名 | |||
/data/app /system/app /system/priv-app |
是 | 是 | 是,需permisison許可權 |
二、新增hiddenapi-package-whitelist.xml名單,能否通過CTS?
實測無影響。
但不確定google後續CTS版本是否加強檢查,有風險 。
相關測試項:
CtsHiddenApiBlacklistApi27TestCases
CtsHiddenApiBlacklistCurrentApiTestCases
CtsHiddenApiBlacklistDebugClassTestCases
CtsHiddenApiKillswitchDebugClassTestCases
CtsHiddenApiKillswitchWhitelistTestCases
CtsHiddenApiKillswitchWildcardTestCases
三、Hide API限制原理
詳細的原理牽扯到編譯時、執行時,還是比較複雜的,下面僅從較巨集觀的角度闡明受限原理、加白原理。
a.訪問受限原理
hiddenapi-light-greylist.txt包含的api,會在dex中對應的Method結構生成HiddenApiAccessFlags::kLightGreylist訪問許可權標記。
- 生成正常framework dex
- Hiddenapi工具根據hiddenapi-light-greylist.txt等配置檔案對dex的access_flags進行修改
- 新的帶access標記的framework dex
ART通過access_flags判斷是否可以呼叫:
Action action = GetActionFromAccessFlags(member->GetHiddenApiAccessFlags()); if (action == kAllow) { return action; }
b.加白不受限原理
- 構造ApplicationInfo時會判斷platform簽名、hide-package-whitelist,來確定HIDDEN_API_ENFORCEMENT的flag
private boolean isAllowedToUseHiddenApis() { return isSignedWithPlatformKey() || (isPackageWhitelistedForHiddenApis() && (isSystemApp() || isUpdatedSystemApp())); }
- ActivityManagerService中startProcessLocked()啟動程序時會把是否檢查hide api的flag傳給zygote
@HiddenApiEnforcementPolicy int policy =app.info.getHiddenApiEnforcementPolicy(); int policyBits = (policy << Zygote.API_ENFORCEMENT_POLICY_SHIFT); runtimeFlags |= policyBits;
- fork新的app程序後,呼叫ZygoteHooks_nativePostForkChild( ),初始化art虛擬機器引數hidden_api_policy_,設定不進行hide api檢查的kNoChecks選項。