Android系统信息获取
- android.os.Build
- SystemProperty
String board= Build.BOARD;
String brand=Build.BRAND;
String os_version=System.getProperty("os.version");
String os_name=System.getProperty("os.name");
PackageManager(获取应用的包信息)
ActivityInfo
ActivityInfo封装了在Mainifest文件中activity和 receiver之间的所有信息,包括name、icon、label、launchmode等。
ServiceInfo
与ActivityInfo类似,它封装了service之间的所有信息。
ApplicationInfo
ApplicationInfo也是一样,它封装了application之间的信息,不过特别的是,ApplicationInfo包含很多Flag , FLAG_SYSTEM表示为系统应用﹐FLAG_EXTERNAL_STORAGE表示为安装在SDCard 上的应用等,通过这些Flag,可以很方便地判断应用的类型。
PackageInfo
PackageInfo与前面三个 Info类类似,都是用于封装 Mainifest文件的相关节点信息,而PackageInfo包含了所有的Activity、Service等信息。
ResolveInfo
ResolveInfo 比较特殊,它封装的是包含信息的上一级信息,所以它可以返回ActivityInfo、ServiceInfo等包含的信息,它经常用来帮助我们找到那些包含特定Intent条件的信息,如带分享功能、播放功能的应用。
private List<PmAppInfo> getAppInfo(int flag){
manager=getPackageManager();
List<ApplicationInfo> applicationInfoList = manager.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
List<PmAppInfo>appInfos=new ArrayList<>();
switch (flag){
case ALL_APP:
appInfos.clear();
for (ApplicationInfo info : applicationInfoList) {
appInfos.add(makeAppInfo(info));
}
break;
case SYSTEM_APP:
appInfos.clear();
for (ApplicationInfo info : applicationInfoList) {
if ((info.flags&ApplicationInfo.FLAG_SYSTEM)!=0){
appInfos.add(makeAppInfo(info));
}
}
break;
case THIRD_APP:
appInfos.clear();
for (ApplicationInfo info : applicationInfoList) {
if ((info.flags&ApplicationInfo.FLAG_SYSTEM)<=0){
appInfos.add(makeAppInfo(info));
}if ((info.flags&ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)!=0){
appInfos.add(makeAppInfo(info));
}
}
break;
case SDCARD_APP:
appInfos.clear();
for (ApplicationInfo info : applicationInfoList) {
if ((info.flags&ApplicationInfo.FLAG_EXTERNAL_STORAGE)!=0){
appInfos.add(makeAppInfo(info));
}
}
break;
default:
return null;
}
return appInfos;
}
private PmAppInfo makeAppInfo(ApplicationInfo info){
PmAppInfo appInfo=new PmAppInfo();
appInfo.setAppIcon(info.loadIcon(manager));
appInfo.setAppLabel((String) info.loadLabel(manager));
appInfo.setPackageName(info.packageName);
return appInfo;
}
ActivityManager(获取在运行的应用程序信息)
ActivityManager.MemoryInfo
通常用于获取全局的内存使用信息,MemoryInfo有几个非常重要的字段:
- availMem——系统可用内存,
- totalMem———总内存
- threshold——低内存的阈值,即区分是否低内存的临界值
- lowMemory———是否处于低内存。
Debug.MemoryInfo
用于统计进程下的内存信息。
ActivityManager.RunningAppProcessInfo
顾名思义,就是运行进程的信息,存储的字段自然是进程相关的信息。
- processName——进程名
- pid——进程pid
- uid———进程uid
- pkgList[]——该进程下的所有包
ActivityManager.RunningServiceInfo
与 RunningAppProcessInfo类似,用于封装运行的服务信息,在它里面同样包含了一些服务进程的信息,同时还有一些其他信息。
- activeSince———第一次被激活的时间、方式
- foreground———服务是否在后台执行。
private List<AMProcessInfo> getRunningProcessInfo(){
ArrayList<AMProcessInfo> infos = new ArrayList<>();
ActivityManager manager= (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> processes = manager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo appProcessInfo : processes) {
int pid=appProcessInfo.pid;
int uid=appProcessInfo.uid;
String processName=appProcessInfo.processName;
int[] memoryPid=new int[]{pid};
Debug.MemoryInfo[] memoryInfo = manager.getProcessMemoryInfo(memoryPid);
int memorySize=memoryInfo[0].getTotalPss();
AMProcessInfo amProcessInfo=new AMProcessInfo();
amProcessInfo.setMemorySize(String.valueOf(memorySize));
amProcessInfo.setPid(String.valueOf(pid));
amProcessInfo.setUid(String.valueOf(uid));
amProcessInfo.setProcessName(String.valueOf(processName));
infos.add(amProcessInfo);
}
return infos;
}
安全机制
第一道防线:代码安全机制—代码混淆proguard。
第二道防线:应用接入权限控制——AndroidMainifest文件权限声明、权限检查机制。
- 首先,判断permission名称。如果为空则直接返回ERMISSION_DENIED。
- 其次,判断Uid。如果为0则为Root权限,不做权限控制;如果为System Server的 Uid为系统服务,不做权限控制;如果Uid与参数中的请求Uid不同,则返回PERMISSION_DENIED
- 最后,通过调用PackageManagerService.checkUidPermission()方法判断该Uid是否具有相应的权限。该方法会去XML的权限列表和系统级的 platform.xml中进行查找。
通过上面的步骤,Android就确定了使用者是否具有某项使用权限。