Android系統信息與安全機制

雙十一快要來臨了,安卓三個版本已近更新完畢,打包上線,所以最近在瘋狂的寫博客、歡迎大家前來討論問題,互相學習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中,所以一個應用崩潰也不會導致其他應用奔潰。

掃碼關注公衆號“偉大程序猿的誕生“,更多幹貨新鮮文章等着你~

公衆號回覆“資料獲取”,獲取更多幹貨哦~

有問題添加本人微信號“fenghuokeji996” 或掃描博客導航欄本人二維碼

發佈了97 篇原創文章 · 獲贊 961 · 訪問量 49萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章