前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android系统信息与安全机制

Android系统信息与安全机制

作者头像
先知先觉
发布2019-01-21 15:00:25
7440
发布2019-01-21 15:00:25
举报

双十一快要来临了,安卓三个版本已近更新完毕,打包上线,所以最近在疯狂的写博客、欢迎大家前来讨论问题,互相学习o!!! 今天和大家分享一下—Android系统信息与安全机制–

1、安卓系统信息的获取

代码语言:javascript
复制
/********************设备配置信息相关********************/

/**
*主板
*/
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一样,用老封装程序的相关信息。 下面列举一下常用的封装信息:

代码语言:javascript
复制
 /**
     * 根据传入类型获取设备上安装的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–服务是否在后台执行

接下来通过例子来看一下:

代码语言:javascript
复制
/**
     * 通过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中,所以一个应用崩溃也不会导致其他应用奔溃。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年10月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、安卓系统信息的获取
  • 2.PackageManager的使用
  • 3.ActivityManager的使用
  • 4.Android安全机制
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档