隐藏API(hidden api)怎么对应
ApplicationInfo.java
private boolean isAllowedToUseHiddenApis() {
//platform签名豁免
if (isSignedWithPlatformKey()) {
return true;
//SystemApp(/system/pri-app;/system/app;/product/pri-app;/product/app都是)
//isUpdatedSystemApp表示systemApp通过install进行了更新的App
} else if (isSystemApp() || isUpdatedSystemApp()) {
//是否在白名单里
return usesNonSdkApi() || isPackageWhitelistedForHiddenApis();
} else {
return false;
}
}
综上,第三方应用由于不是system应用所以不豁免,系统应用(指位于系统分区或者product分区的应用,通常是厂商预装的,不能卸载的应用)如果是在白名单中的豁免。
添加白名单两种方式:1.白名单中添加,可参考我另一篇文章。2.AndroidManifest中指定 android:usesNonSdkApi=“true”,这个是Q上新出的属性,所以如果是P只能使用白名单添加。
当然源码编译需要指定LOCAL_PRIVATE_PLATFORM_APIS:=true才能编过,但这个命令只是编过,如果不是platform签名仍然需要添加白名单。
pri-app和app目录下的应用的不同点
pri-app是指定了privileged:true的应用(此处举例bp方式指定),也即特权应用,通过添加特权白名单能够获取系统特权,即privileged类型的权限。app目录下的应用不能通过这种方式获取特权。两种应用的isSystemApp都返回true。
android:sharedUserId意义
通过指定这个属性可以让多个包共享同一个userId,所以权限会共享。通过白名单获取的特权也能够共享,所以白名单声明一次即可。