Android O 8.0

1.src\com\android\packageinstaller\permission\mode\PermissionGroups.java

        @Override
public List<PermissionGroup> loadInBackground() {
ArraySet<String> launcherPkgs = Utils.getLauncherPackages(getContext());
PermissionApps.PmCache pmCache = new PermissionApps.PmCache(
getContext().getPackageManager()); List<PermissionGroup> groups = new ArrayList<>();
Set<String> seenPermissions = new ArraySet<>(); PackageManager packageManager = getContext().getPackageManager();
List<PermissionGroupInfo> groupInfos = packageManager.getAllPermissionGroups(0); for (PermissionGroupInfo groupInfo : groupInfos) {
// Mare sure we respond to cancellation.
if (isLoadInBackgroundCanceled()) {
return Collections.emptyList();
} // 得到权限组里的所有权限
// Get the permissions in this group.
final List<PermissionInfo> groupPermissions;
try {
groupPermissions = packageManager.queryPermissionsByGroup(groupInfo.name, 0);
} catch (PackageManager.NameNotFoundException e) {
continue;
} boolean hasRuntimePermissions = false; // 查看某个权限组是否含有运行时权限
// Cache seen permissions and see if group has runtime permissions.
for (PermissionInfo groupPermission : groupPermissions) {
seenPermissions.add(groupPermission.name);
if ((groupPermission.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
== PermissionInfo.PROTECTION_DANGEROUS
&& (groupPermission.flags & PermissionInfo.FLAG_INSTALLED) != 0
&& (groupPermission.flags & PermissionInfo.FLAG_REMOVED) == 0) {
hasRuntimePermissions = true;
}
} // 权限组里没有运行时权限,我们不感兴趣,继续循环查询
// No runtime permissions - not interesting for us.
if (!hasRuntimePermissions) {
continue;
} // 如果权限组里含有运行时权限,则继续往下执行 // 获取权限组的label
CharSequence label = loadItemInfoLabel(groupInfo);
Drawable icon = loadItemInfoIcon(groupInfo); // 根据权限组 新建 PermissionApps 对象
PermissionApps permApps = new PermissionApps(getContext(), groupInfo.name, null,
pmCache);
permApps.refreshSync(); // 创建 PermissionGroup 对象
// Create the group and add to the list.
PermissionGroup group = new PermissionGroup(groupInfo.name,
groupInfo.packageName, label, icon, permApps.getTotalCount(launcherPkgs),
permApps.getGrantedCount(launcherPkgs));
groups.add(group);
} // 获取所有的安装包权限
// Make sure we add groups for lone runtime permissions.
List<PackageInfo> installedPackages = getContext().getPackageManager()
.getInstalledPackages(PackageManager.GET_PERMISSIONS); // We will filter out permissions that no package requests.
Set<String> requestedPermissions = new ArraySet<>();
for (PackageInfo installedPackage : installedPackages) {
if (installedPackage.requestedPermissions == null) {
continue;
}
// 将安装包请求的权限加入到 列表中
for (String requestedPermission : installedPackage.requestedPermissions) {
requestedPermissions.add(requestedPermission);
}
} for (PackageInfo installedPackage : installedPackages) {
if (installedPackage.permissions == null) {
continue;
} // 自定义的权限
for (PermissionInfo permissionInfo : installedPackage.permissions) {
// If we have handled this permission, no more work to do.
if (!seenPermissions.add(permissionInfo.name)) {
continue;
} // 关心的是 运行时权限
// We care only about installed runtime permissions.
if ((permissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
!= PermissionInfo.PROTECTION_DANGEROUS
|| (permissionInfo.flags & PermissionInfo.FLAG_INSTALLED) == 0) {
continue;
} // 没有app使用那个自定义的权限
// If no app uses this permission,
if (!requestedPermissions.contains(permissionInfo.name)) {
continue;
} CharSequence label = loadItemInfoLabel(permissionInfo);
Drawable icon = loadItemInfoIcon(permissionInfo); PermissionApps permApps = new PermissionApps(getContext(), permissionInfo.name,
null, pmCache);
permApps.refreshSync(); // Create the group and add to the list.
PermissionGroup group = new PermissionGroup(permissionInfo.name,
permissionInfo.packageName, label, icon,
permApps.getTotalCount(launcherPkgs),
permApps.getGrantedCount(launcherPkgs));
groups.add(group);
}
} Collections.sort(groups);
return groups;
}

2.PermissionApps.java

  /**
* Refresh the state and do not return until it finishes. Should not be called while an {@link
* #refresh async referesh} is in progress.
*/
public void refreshSync() {
mSkipUi = true;
createMap(loadPermissionApps());
}

3.

src\com\android\packageinstaller\permission\utils\EventLogger.java

/**
* For each permission there are four events. The events are in the order of
* #ALL_DANGEROUS_PERMISSIONS. The four events per permission are (in that order): "requested",
* "granted", "denied", and "revoked".
*/
public class EventLogger {
private static final String LOG_TAG = EventLogger.class.getSimpleName(); /** All dangerous permission names in the same order as the events in MetricsEvent */
private static final List<String> ALL_DANGEROUS_PERMISSIONS = Arrays.asList(
Manifest.permission.READ_CALENDAR,
Manifest.permission.WRITE_CALENDAR,
Manifest.permission.CAMERA,
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS,
Manifest.permission.GET_ACCOUNTS,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.CALL_PHONE,
Manifest.permission.READ_CALL_LOG,
Manifest.permission.WRITE_CALL_LOG,
Manifest.permission.ADD_VOICEMAIL,
Manifest.permission.USE_SIP,
Manifest.permission.PROCESS_OUTGOING_CALLS,
Manifest.permission.READ_CELL_BROADCASTS,
Manifest.permission.BODY_SENSORS,
Manifest.permission.SEND_SMS,
Manifest.permission.RECEIVE_SMS,
Manifest.permission.READ_SMS,
Manifest.permission.RECEIVE_WAP_PUSH,
Manifest.permission.RECEIVE_MMS,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_NUMBERS,
Manifest.permission.ANSWER_PHONE_CALLS,
Manifest.permission.ACCEPT_HANDOVER); private static final List<String> ALL_APPOP_PERMISSIONS = Arrays.asList(
Manifest.permission.ACCESS_NOTIFICATIONS,
Manifest.permission.SYSTEM_ALERT_WINDOW,
Manifest.permission.WRITE_SETTINGS,
Manifest.permission.REQUEST_INSTALL_PACKAGES); ...... }

4.

src\com\android\packageinstaller\permission\utils\Utils.java

    public static final String OS_PKG = "android";

    public static final String[] MODERN_PERMISSION_GROUPS = {  // 目前平台支持的权限组
Manifest.permission_group.CALENDAR,
Manifest.permission_group.CAMERA,
Manifest.permission_group.CONTACTS,
Manifest.permission_group.LOCATION,
Manifest.permission_group.SENSORS,
Manifest.permission_group.SMS,
Manifest.permission_group.PHONE,
Manifest.permission_group.MICROPHONE,
Manifest.permission_group.STORAGE
}; private static final Intent LAUNCHER_INTENT = new Intent(Intent.ACTION_MAIN, null)
.addCategory(Intent.CATEGORY_LAUNCHER);

5.

DeviceUtils.java
public class DeviceUtils {
public static boolean isTelevision(Context context) { // 电视
int uiMode = context.getResources().getConfiguration().uiMode;
return (uiMode & Configuration.UI_MODE_TYPE_MASK) == Configuration.UI_MODE_TYPE_TELEVISION;
} public static boolean isWear(final Context context) {// 穿戴设备
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
} public static boolean isAuto(Context context) {// 汽车、自动设备
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
}
}

Android O PackageInstaller 解析的更多相关文章

  1. Android Service完全解析,关于服务你所需知道的一切(下)

    转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...

  2. Android Service完全解析,关于服务你所需知道的一切(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...

  3. [转] Android Volley完全解析(一),初识Volley的基本用法

    版权声明:本文出自郭霖的博客,转载必须注明出处.   目录(?)[-] Volley简介 下载Volley StringRequest的用法 JsonRequest的用法   转载请注明出处:http ...

  4. Android OkHttp完全解析 --zz

    参考文章 https://github.com/square/okhttp http://square.github.io/okhttp/ 泡网OkHttp使用教程 Android OkHttp完全解 ...

  5. Android IntentService完全解析 当Service遇到Handler

    一 概述 大家都清楚,在Android的开发中,凡是遇到耗时的操作尽可能的会交给Service去做,比如我们上传多张图,上传的过程用户可能将应用置于后台,然后干别的去了,我们的Activity就很可能 ...

  6. Android Volley完全解析

    1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行H ...

  7. Android OkHttp完全解析 是时候来了解OkHttp了

    Android OkHttp完全解析 是时候来了解OkHttp了 标签: AndroidOkHttp 2015-08-24 15:36 316254人阅读 评论(306) 收藏 举报  分类: [an ...

  8. Android Bitmap 全面解析(四)图片处理效果对比 ...

    对比对象: UIL Volley 官方教程中的方法(此系列教程一里介绍的,ImageLoader的处理方法和官方的差不多) -------------------------------------- ...

  9. android源码解析(十七)-->Activity布局加载流程

    版权声明:本文为博主原创文章,未经博主允许不得转载. 好吧,终于要开始讲讲Activity的布局加载流程了,大家都知道在Android体系中Activity扮演了一个界面展示的角色,这也是它与andr ...

随机推荐

  1. C# Image与Base64编码互转函数

    public Bitmap GetImageFromBase64(string base64string) { byte[] b = Convert.FromBase64String(base64st ...

  2. EA修改生成代码的表头注释

    我们在做项目的过程中,每个代码文件都应有此文件的注释,比如说作者,文件说明等.但是如果用EA生成的代码文件的注释是纯英文的,而且有些不是我们需要显示的注释,有些我们需要显示的它又不具备.那么我们就可以 ...

  3. MySQL的sql_mode解析与设置,sql文件导入报错解决

    在往MySQL数据库中插入一组数据时,出错了!数据库无情了给我报了个错误:ERROR 1365(22012):Division by 0:意思是说:你不可以往数据库中插入一个 除数为0的运算的结果.于 ...

  4. 模式(一)javascript设计模式

    模式有三种:Architectural Pattern.Design Pattern.Coding Pattern,即:框架模式.设计模式.编程模式.本文主要讲解javascript中的设计模式,好的 ...

  5. 阿里云被挖矿使用,导致cpu长期处于100%,ddgs进程,xWx3T进程,关于redis密码

    1.使用top命令,查看到一个叫xWx3T的进程cpu占用99.8%,由于我的阿里云是单核的,所以最高只能100%. 把它用kill命令杀死后,过一会儿又启动了,又占用100%. 使用ps -ef可以 ...

  6. gcc和g++头文件和库路径的寻找和添加

    对所有用户有效修改/etc/profile文件 对个人有效则修改~/.bashrc文件 #在PATH中找到可执行文件程序的路径. export PATH =$PATH:$HOME/bin (可一次指定 ...

  7. MS Chart Control 學習手記(二) - 圓餅圖

    using System.Web.UI.DataVisualization.Charting; 02 using System.Drawing; 03   04 namespace Chart.AJA ...

  8. Android基础部分再学习---activity的状态保存

    主要是bundle   这个參数 參考地址:http://blog.csdn.net/lonelyroamer/article/details/18715975 学习Activity的生命周期,我们知 ...

  9. OpenSift源代码编译过程记录

    本文记录了在CentOS6.5上编译Sift的开源实现OpenSift的编译过程,同一时候记录了编译过程中的几个问题. sift的理论已经有非常多了,以下会给出链接: 1.Requirements a ...

  10. IIS------如何安装IIS

    1.打开“控制面板”->“程序”->“打开或关闭Windows功能” 2.如图所示: 3.如图所示: 4.点击确定,配置完成