csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论
android跨进程通信实战视频课程(加群获取优惠)
hi,大家好!
在做framework开发过程中相信很多朋友会有一些关于系统应用的一些权限问题,在学习过千里马相关系统内置应用相关课程后,大家也知道了系统内置应用一般放在system/app路径下,这样就不会被用户随意卸载了,但是app放在这下面具体运行起来有哪些权限和没有哪些权限就不是很清楚了。
这里刚好做一个比较全面总结:
android中app主要有3个路径可以放:
data/app —这个就是最为普遍 的第三方应用的apk路径,安装在这里一般 可以随意 进行卸载
system/app --系统内置应用,这里面的app是不可以 进行卸载的,所以叫做系统应用,但是系统应用的每个应用的签名却没有要求,即可以是自己应用根据情况确定,比如大部分内置应用是platform,也有shared,media等
system/priv-app —这个部分是android后来版本新加入系统特权应用路径,这里面应用和system/app一样是不可以卸载的,但是这里大家肯定会想他和system/app有什么区别么?这里其实最主要是在于二者目录的权限apk运行起来不一样
那么这里是不是有个疑问,那么是不是系统应用如果在priv-app下是不是权限就是最高 ?
就可以自然拥有很多系统权限才可以干的是它都可以干?这个其实并不是这样的哦,权限虽和你是不是priv-app有关系 ,但并不是说你 预制在priv-app既可以拥有系统权限。这里我们就举个例子吧:
以下是一个可以 修改任何app的组件是否开放(即enable状态)的一个权限,这里要求是需要声明以下权限的,普通权限如网络什么的这里声明其实就可以了,但是这是系统级别当然不是普通第三方应用就可以拥有。
<uses-permission
android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
这里看这权限要求保护级别是signature(平台签名platform)或者privileged(特权app),
那么我们来尝试把app预制到priv-app里面去,具体方法:
在 对应mk中加入:LOCAL_PRIVILEGED_MODULE := true
这里编译后就会把apk预制到priv-app了,然后我们运行一下,发现依然会报出没有权限相关的运行错误。。。。这个是为啥明明我们就是priv-app.
这里其实我们还忽略了一个重要的,那就是还要去framework对应permission文件下进行声明权限具体方案:
android-8.1.0_r1/frameworks/base/data/etc/目录下有一个 privapp-permissions-platform.xml文件,这里面有各priv-app权限声明
比如我们看到musicfx就有 对一个权限 进行声明,所以这里我们也需要在这里对我们应用进行声明,具体就完全参考musicfx既可以,只需要改变一下包名既可以