问题:客户反馈他们应用第一次打开申请相机权限,应用退出,需要第二次打开。
分析:先写一个简单的应用测试下
测试结果:
应用在申请完相机权限之后确实会被系统杀掉,日志中打了如下日志
Killing 8269:com.example.android.camera2basic/u0a85 (adj 100): permission grant or revoke changed gids(偷懒往下下载了一个相机的demo)
研究代码发现如下的逻辑:
final int result = permissionsState.grantRuntimePermission(bp, userId);
switch (result) {
case PermissionsState.PERMISSION_OPERATION_FAILURE: {
return;
}
case PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED: {
final int appId = UserHandle.getAppId(pkg.applicationInfo.uid);
mHandler.post(new Runnable() {
@Override
public void run() {
killUid(appId, userId, KILL_APP_REASON_GIDS_CHANGED);
}
});
}
break;
PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED是个什么东西?
这个flag表示权限授予成功,但是应用的gids改变了,那么就好理解了,因为申请了camera的权限,所以应用的gids改变了,系统认为gids变了就要杀掉应用(系统还有类似的逻辑,比如清除app数据也会导致应用被杀)
我们去frameworks/base/data/etc/platform.xm中看看
原来申请了CAMERA的权限之后就会把该应用加入camera组
再看看其他的权限
读写内部存储是没有引起组变化的
网络权限也会引起组变化,可是网络权限不用动态申请,所以没有这个问题