06-30 10:39:56.653 4064
4064 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main
06-30 10:39:56.653 4064
4064 E AndroidRuntime: java.lang.SecurityException:
uid 1000 does not have android.permission.BATTERY_STATS.
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
android.app.ContextImpl.enforce(ContextImpl.java:2443)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
android.app.ContextImpl.enforceCallingPermission(ContextImpl.java:2463)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.server.am.BatteryStatsService.getStatisticsStream(BatteryStatsService.java:188)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.internal.os.BatteryStatsHelper.getStats(BatteryStatsHelper.java:977)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.internal.os.BatteryStatsHelper.load(BatteryStatsHelper.java:968)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.internal.os.BatteryStatsHelper.getStats(BatteryStatsHelper.java:211)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.internal.os.BatteryStatsHelper.refreshStats(BatteryStatsHelper.java:292)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.internal.os.BatteryStatsHelper.refreshStats(BatteryStatsHelper.java:285)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.internal.os.BatteryStatsHelper.refreshStats(BatteryStatsHelper.java:278)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.server.LpnetManagerService.updateMonitorData(LpnetManagerService.java:1434)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.server.LpnetManagerService.freezeBasedOnLRU(LpnetManagerService.java:3006)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.server.LpnetManagerService.access$5000(LpnetManagerService.java:114)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.server.LpnetManagerService$5$7.run(LpnetManagerService.java:1120)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
android.os.Handler.handleCallback(Handler.java:739)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
android.os.Handler.dispatchMessage(Handler.java:95)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
android.os.Looper.loop(Looper.java:145)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.server.SystemServer.run(SystemServer.java:460)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.server.SystemServer.main(SystemServer.java:344)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
java.lang.reflect.Method.invoke(Native Method)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
java.lang.reflect.Method.invoke(Method.java:372)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
06-30 10:39:56.653 4064
4064 E AndroidRuntime: at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
|
Uid 1000的系统进程竟然被报没有权限。
段迪问我怎么能给framework的service加上权限。因为他需要在service中使用一个API,而该API用enforceCallingPermission限定了某种权限。
调用的地方:LpnetManagerService.java
updateMonitorData()
BatteryStatsHelper.refreshStats
该API的位置:BatteryStatsService.java.
那下面咱们去看enforceCallingPermission()
到底是什么个条件
原来答案在这里,
if(pid != Process.myPid()) {
return
checkPermission(permission, pid, Binder.getCallingUid());
}
Return PackageManager.PERMISSION_DENIED;
这一段话,首先进程需要是通过Binder调用(有些地方有这样的限制是为了防止有些耗内存操作过大)。
其次,该操作必须是跨进程的,否则return DENIED;
这个方法是系统进程内,也就是说系统服务是不允许访问的。
谷歌的设计也没什么太多注释,不知道其用意。
看了一下电池service中其它的接口
Smart Manager 为了使用该API,将其更改为enforceCallingOrSelfPermission接口。
这个接口就没有进程的限制了。