雙十一快要來臨了,安卓三個版本已近更新完畢,打包上線,所以最近在瘋狂的寫博客、歡迎大家前來討論問題,互相學習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” 或掃描博客導航欄本人二維碼