Android系统信息与安全机制
来源:互联网 发布:java实现高斯模糊 编辑:程序博客网 时间:2024/05/16 10:10
双十一快要来临了,安卓三个版本已近更新完毕,打包上线,所以最近在疯狂的写博客、欢迎大家前来讨论问题,互相学习o!!!
今天和大家分享一下—Android系统信息与安全机制–
1、安卓系统信息的获取
/********************设备配置信息相关********************//***主板*/publicstaticfinalStringBUILD_BOARD=Build.BOARD;/***系统定制商*/publicstaticfinalStringBUILD_BRAND=Build.BRAND;/***设备参数*/publicstaticfinalStringBUILD_DEVICE=Build.DEVICE;/***显示屏参数*/publicstaticfinalStringBUILD_DISPLAY=Build.DISPLAY;/***唯一编号*/publicstaticfinalStringBUILD_FINGERPRINT=Build.FINGERPRINT;/***硬件序列号*/publicstaticfinalStringBUILD_SERIAL=Build.SERIAL;/***修订版本列表*/publicstaticfinalStringBUILD_ID=Build.ID;/***硬件制造商*/publicstaticfinalStringBUILD_MANUFACTURER=Build.MANUFACTURER;/***版本*/publicstaticfinalStringBUILD_MODEL=Build.MODEL;/***硬件名*/publicstaticfinalStringBUILD_HARDWARE=Build.HARDWARE;/***手机产品名*/publicstaticfinalStringBUILD_PRODUCT=Build.PRODUCT;/***描述build的标签*/publicstaticfinalStringBUILD_TAGS=Build.TAGS;/***Builder类型*/publicstaticfinalStringBUILD_TYPE=Build.TYPE;/***当前开发代号*/publicstaticfinalStringBUILD_VERSION_CODENAME=Build.VERSION.CODENAME;/***版本号*/publicstaticfinalintBUILD_VERSION_SDK_INT=Build.VERSION.SDK_INT;/***编译时间*/publicstaticfinallongBUILD_TIME=Build.TIME;/***User名*/publicstaticfinalStringBUILD_USER=Build.USER;/***host值*/publicstaticfinalStringBUILD_HOST=Build.HOST;
2.PackageManager的使用
PackageManager是安卓提供的来负责所有安装的APP;
这些封装信息就像我们自己封装的bean一样,用老封装程序的相关信息。
下面列举一下常用的封装信息:
/** * 根据传入类型获取设备上安装的app信息 * flag :1 ------全部应用 * flag :2 ------系统应用 * flag :3 ------第三方应用 * flag :4 ------SD卡应用 * @param flag * @param context * @return */ public static List<PMAppInfo> getAppInfo(int flag,Context context){ //获取packageManager对象 PackageManager pm = context.getPackageManager(); //获取应用信息 List<ApplicationInfo> listAppcations =pm.getInstalledApplications(PackageManager.GET_URI_PERMISSION_PATTERNS); List<PMAppInfo> appInfos = new ArrayList<PMAppInfo>(); //判断应用类型 switch (flag){ case 1: //全部应用 appInfos.clear(); for(ApplicationInfo app : listAppcations){ appInfos.add(makeAppInfo(app,pm)); } break; case 2: //系统应用 appInfos.clear(); for(ApplicationInfo app : listAppcations){ if((app.flags & ApplicationInfo.FLAG_SYSTEM)!= 0){ appInfos.add(makeAppInfo(app,pm)); } appInfos.add(makeAppInfo(app,pm)); } break; case 3: //第三方APP appInfos.clear(); for(ApplicationInfo app : listAppcations){ if((app.flags & ApplicationInfo.FLAG_SYSTEM) <= 0){ appInfos.add(makeAppInfo(app,pm)); }else if((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){ appInfos.add(makeAppInfo(app,pm)); } } break; case 4: //SD卡APP appInfos.clear(); for(ApplicationInfo app : listAppcations){ if((app.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE)!= 0){ appInfos.add(makeAppInfo(app,pm)); } appInfos.add(makeAppInfo(app,pm)); } break; default: return null; } return appInfos; } private static PMAppInfo makeAppInfo(ApplicationInfo app,PackageManager pm){ PMAppInfo pmAppInfo = new PMAppInfo(); pmAppInfo.setAppLabel((String) app.loadLabel(pm)); pmAppInfo.setAppIcon(app.loadIcon(pm)); pmAppInfo.setPkgName(app.packageName); return pmAppInfo; }
3.ActivityManager的使用
前面使用PackageManger获得了所有的应用包信息,下面介绍ActivityManager。
PackageManger重点在于获得应用的包信息,而ActivityManager重点在获得运行的应用程序信息。
同PackageManger一样,ActivityManager也封装了不少Bean对象,如:
(1)内存信息—-ActivityManager.MemoryInfo
MemoryInfo有几个非常重要的字段:avaiMem–系统可用内存,totalMem–总内存,threshold–低内存的阈值(即区分低内存的临界值),lowMemory–是否处于低内存
(2)Debug.MemoryInfo获取当前进程下的内存信息
而ActivityManager.MemoryInfo是全局的内存信息
(3)运行进程的信息—-RunningAppProcess
存储进程相关的信息,如:
processName–进程名,pid–进程pid,uid–进程uid,pkgList–该进程下的所有包。
(4)运行的服务信息
它里面包含一些服务进程的信息,如:
activitySince–第一次被激活的时间、方式,foreground–服务是否在后台执行
接下来通过例子来看一下:
/** * 通过ActivityManager获取当前进程的相关信息 * @param context * @return */ public static List<com.puzzle.libin.utils_library.bean.AMProcessInfo> getRunningProcessInfo(Context context){ ArrayList<AMProcessInfo> amProcessInfosList = new ArrayList<>(); ActivityManager manager = (ActivityManager)context.getSystemService(context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> appProcessesList = manager.getRunningAppProcesses(); for (int i = 0 ; i<appProcessesList.size();i++){ ActivityManager.RunningAppProcessInfo info = appProcessesList.get(i); int pid = info.pid; int uid = info.uid; String processName = info.processName; int[] memoryPid = new int[]{pid}; Debug.MemoryInfo[] processMemoryInfo = manager.getProcessMemoryInfo(memoryPid); int memorySize = processMemoryInfo[0].getTotalPss(); AMProcessInfo amProcessInfo = new AMProcessInfo(); amProcessInfo.setPid(pid+""); amProcessInfo.setUid(uid+""); amProcessInfo.setMemorySize(memorySize+""); amProcessInfo.setProcessName(processName); amProcessInfosList.add(amProcessInfo); } return amProcessInfosList; }
4.Android安全机制
安全不管在哪个平台都非常重要,首先介绍一下Android系统五道防线:
第一道防线:
代码安全机制—-代码混淆proguard
即使编译成apk也可以被反编译,所以混淆关键diamante、替换命名可以破坏阅读难度
第二道防线:
应用接入权限—-AndroidMainfest文件权限声明,权限检查机制
这个防线天生有问题:被授予的权限无法停止;在应用声明APP使用权限时,用户无法针对部分权限限制;权限的声明机制与用户安全理念相关;
Android系统会通过以下
首先,先判断permission名称,如果为空返回PERMISSION_DENIED;
其次,判断uid,为0则为root权限,不限制权限,如果如System Server则为系统服务,不限制权限,如果返回uid与请求的uid不同,则返回PERMISSION_DENIED;
最后,通过PackageManagerServer.checkUidPermission()方法判断该权限,会先去XML权限表和系统级platform.xml中进行查找。
第三道防线:
应用签名机制—-数字证书
只有相同的数字签名的App在升级的时候才会被认为是同一个,而且没有签名的APP是无法发布到应用市场的,而且数字证书的时间是需要自己设置的,一般设置20年,曾有人设置一年结果把自己坑了。
第四道防线:
Linux内核安全机制—-Uid、访问权限控制
Android继承了Linux,所以安全机制也继承过来了,通常情况下只有system、root用户才能访问到系统文件,一般用户无法访问
第五道防线:
安卓虚拟机沙箱机制—-沙箱隔离
安卓的APP是运行在虚拟机中的,所有才有了沙箱机制,每个app都有一个与之对应的uid,每个app也运行在单独的app中,所以一个应用崩溃也不会导致其他应用奔溃。
- Android系统信息与安全机制
- Android系统信息与安全机制
- 《Android群英传》读书笔记9.Android系统信息与安全机制
- Android进阶-Android系统信息与安全机制
- Android系统信息与安全
- Android系统信息和安全机制
- 《Android群英传》读书笔记(10)第九章:Android系统信息与安全机制
- Android群英转读书笔记第9章(Android 系统信息与安全机制)
- Android群英传知识点回顾——第九章:Android系统信息与安全机制
- Android群英传学习——第九章、Android系统信息与安全机制
- 系统信息与安全
- Android系统信息和安全机制(学习笔记)
- Android群英传笔记——第九章:Android系统信息和安全机制
- Android群英传笔记——第九章:Android系统信息和安全机制
- 二、Android安全机制之系统防线
- Android安全机制解析与应用实践
- Android安全机制解析与应用实践
- Android安全机制分析与解决方案探析
- 秩为1的矩阵,向量,绩的联合使用
- 正则表达式的运算符优先级
- docker镜像制作之Dockerfile文件---hadooop伪分布式
- 用verilog设计一数字钟系统
- 第八周oj题目求倒数和
- Android系统信息与安全机制
- HDU 1873 看病要排队 (优先队列)
- Intel Edison用mjpg-streamer进行视频传输
- Children of the Candy Corn(图的遍历bfs最小步数)
- @contextmanager:Python实现with结构的好方法
- ajax
- C++中int转化为string
- 一个偷偷写的svm库
- Python version 2.7 required, which was not found in the registry