Android系统info与safe机制

本文详细介绍了如何使用Android系统API获取设备信息、应用程序信息及运行时内存状态,并深入探讨了Android的安全机制,包括权限控制、应用签名及内核层面的安全措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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就确定了使用者是否具有某项使用权限。
第三道防线:应用签名机制——数字证书。
第四道防线:Linux 内核层安全机制——Uid、访问权限控制。
第五道防线:Android虚拟机沙箱机制——沙箱隔离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值