上节课已经把代码写好了,可惜我们发现一点击就crash啦,因为CHANGE_COMPONENT_ENABLED_STATE权限需要系统权限才可以

2021-12-17 23:09:15.078 4198-4198/com.android.things.privateapplication1 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.android.things.privateapplication1, PID: 4198
    java.lang.SecurityException: Attempt to change component state; pid=4198, uid=10064, component=com.panzq.applicationb/com.panzq.applicationb.TcpMainActivity
        at android.os.Parcel.readException(Parcel.java:2004)
        at android.os.Parcel.readException(Parcel.java:1950)
        at android.content.pm.IPackageManager$Stub$Proxy.setComponentEnabledSetting(IPackageManager.java:4732)
        at android.app.ApplicationPackageManager.setComponentEnabledSetting(ApplicationPackageManager.java:2276)
        at com.android.things.privateapplication1.MainActivity$1.onClick(MainActivity.java:51)
        at android.view.View.performClick(View.java:6294)
        at android.view.View$PerformClick.run(View.java:24770)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

怎么给与呢?
1、搞清楚这权限本身是什么保护程度
在这里插入图片描述
可以看出是平台签名或特权app级别的保护,即只要你是platform签名和priv-app就可以
2、授予权限
这里我们前面课程就已经学习过预制系统apk时候,其实是可以给指定签名的,这里我们只需要设置为platform签名既可以
在这里插入图片描述
这样就可以满足签名属于platform级别,就可以获取权限了
3、另一种方案是priv-app权限级别
这里priv-app,指的就是要预制到system/priv-app目录,原来我们是system/app,所以这里的话我们怎么实现预制到system/priv-app,其实很简单,只需要在mk加入一句话就可以
在这里插入图片描述
即加入:

LOCAL_PRIVILEGED_MODULE := true

这句就可以,但是大家注意哦,这里并没有完哦,我们还需要吧对应权限放入白名单里面,具体操作:

1 在frameworks/base/data/etc中的privapp-permissions-platform.xml进行一下我们的权限声明,这里我们可以参考其他应用是怎么声明的:
    <privapp-permissions package="com.android.things.privateapplication1">
        <permission name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
    </privapp-permissions>

到此就吧两种权限授予方法都给大家实战了一下,如果需要学习更多framework只是和视频可以b站关注:千里马学框架,购买课程最好加入422901085群里找千里马要优惠和答疑

课程答疑和新课信息:QQ交流群:422901085进行课程讨论,加群主qq享受 优惠
FrameWork入门课视频链接:https://edu.csdn.net/course/detail/30298
FrameWork实战课1视频链接:https://edu.csdn.net/course/detail/30275
FrameWork跨进程通信视频链接:https://edu.csdn.net/course/detail/35911
专题博客系列:
Android 8.1 zygote 启动过程源码
Android Framework实战视频–Zygote的fork进程篇
Android Framework实战视频–SystemServer启动篇
Android Framework实战视频–SystemServer启动FallbackHome篇
Android Framework实战视频–FallbackHome进程启动及Activity启动篇
Android Framework实战视频–FallbackHome结束启动Launcher篇
Android Framework实战视频–BootAnimation的启动源码分析(Android8.1)

Android Framework实战视频–init进程的bootanimation启动源码分析(补充Android 10部分的BootAnimation的启动源码分析)

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐