Android系统信息和Apk应用信息获取

Android系统信息获取

要获取系统的配置信息,通常可以从以下两个方面获取:

  • android.os.Build
  • SystemProperty
android.os.Build

android.os.Build类里面的信息非常丰富,它包含了系统编译时的大量设备、配置信息,下面列举了一些常用的信息,如下所示:

        String board = Build.BOARD;//主板String brand = Build.BRAND;//Android系统定制商String supported_abis = Build.SUPPORTED_ABIS[0];//CPU指令集String device = Build.DEVICE;//设备参数String display = Build.DISPLAY;//显示屏参数String fingerprint = Build.FINGERPRINT;//唯一编号String serial = Build.SERIAL;//硬件序列号String id = Build.ID;//修订版本列表String manufacturer = Build.MANUFACTURER;//硬件制造商String model = Build.MODEL;//版本String hardware = Build.HARDWARE;//硬件明String product = Build.PRODUCT;//手机产品名String tags = Build.TAGS;//描述Build的标签String type = Build.TYPE;//Builder类型String codename = Build.VERSION.CODENAME;//当前开发代号String incremental = Build.VERSION.INCREMENTAL;//源码控制版本String release = Build.VERSION.RELEASE;//版本字符串String sdk_int = "" + Build.VERSION.SDK_INT;//版本号String host = Build.HOST;//Host值String user = Build.USER;//User名String time = "" + Build.TIME;//编译时间
SystemProperty

SystemProperty包含了许多系统配置属性值和参数,很多信息与android.os.Build获取的值是相同的,下面列举了一些常用信息:

        String os_version = System.getProperty("os.version");//OS版本String os_name = System.getProperty("os.name");//OS名称String os_arch = System.getProperty("os.arch");//OS架构String user_home = System.getProperty("user.home");//Home属性String user_name = System.getProperty("user.name");//Name属性String user_dir = System.getProperty("user.dir");//Dir属性String user_timezone = System.getProperty("user.timezone");//时区String path_separator = System.getProperty("path.separator");//路径分隔符String line_separator = System.getProperty("line.separator");//行分隔符String file_separator = System.getProperty("file.separator");//文件分隔符String java_vendor_url = System.getProperty("java.vendor.url");//Java vendor URL 属性String java_class_path = System.getProperty("java.class.path");//Java Class 路径String java_class_version = System.getProperty("java.class.version");//Java Class 版本String java_vendor = System.getProperty("java.vendor");//Java vendor 属性String java_version = System.getProperty("java.version");//Java 版本String java_home = System.getProperty("java_home");//Java Home属性

Android Apk 应用信息获取之PackageManager

这里写图片描述

在上图中,最里面的框代表了整个Activity的信息,系统提供了ActivityInfo类来进行封装。

在最外面的框代表着整个Manifest文件中节点的信息,系统提供了PackageInfo来进行封装。

而Android系统提供了PackageManager来负责管理所有已安装的App。这些封装信息就像我们自己封装的Bean对象一样,用来封装程序的相关信息,下面列举了一些常用的系统封装信息。

  • ActivityInfo
    ActivityInfo封装了在Manifest文件中activity、receiver标签之间的所有信息,包括name、icon、label、launchMode等。

  • ServiceInfo
    ServiceInfo封装了在Manifest文件中service标签之间的所有信息。

  • ApplicationInfo
    ApplicationInfo封装了application标签之间的所有信息。不过特别地是,ApplicationInfo包含很多Flag,FLAG_SYSTEM表示为系统应用,FLAG_EXTERNAL_STORAGE表示为安装在SDCard上的应用等,通过这些Flag,可以很方便的判断应用的类型。

  • PackageInfo
    PackageInfo用于封装Manifest文件中的相关节点信息,而且PackageInfo包含了所有的Activity、Service等信息。

  • ResolveInfo
    ResolveInfo封装的是包含intent信息的上一级信息,所以它可以返回ActivityInfo、ServiceInfo等包含intent的信息,它经常用来帮助我们找到那些包含特定Intent条件的信息,如带分享功能、播放功能的应用。

有了上面这些用于封装的Bean对象之后,PackageManager就可以通过调用各种方法,返回不同类型的Bean对象了。PackageManager经常使用以下方法:

  • getPackageManager:通过调用这个方法返回一个PackageManager对象。
  • getApplicationInfo:以ApplicationInfo的形式返回指定包名的ApplicationInfo。
  • getApplicationIcon:返回指定包名的Icon。
  • getInstalledApplications:以ApplicationInfo的形式返回安装的应用。
  • getInstalledPackages:以PackageInfo的形式返回安装的应用。
  • queryIntentActivities:返回指定intent的ResolveInfo对象、Activity集合。
  • queryIntentServices:返回指定intent的ResolveInfo对象、Service集合。
  • resolveActivity:返回指定intent的Activity。
  • resolveService:返回指定intent的Service。

下面通过PackageManager筛选不同类型的App。要判断App类型的依据,就是利用ApplicationInfo的FLAG_SYSTEM来进行判断,代码如下所示:

app.flags & ApplicationInfo.FLAG_SYSTEM

通过这样的标志区分,可以判断出以下几种不同的应用类型:

  • 如果当前应用的app.flags & ApplicationInfo.FLAG_SYSTEM != 0则为系统应用。
  • 如果当前应用的app.flags & ApplicationInfo.FLAG_SYSTEM <= 0则为第三方应用。
  • 特殊的,当系统应用经过升级后,也将成为第三方应用:app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP != 0。
  • 如果当前应用的app.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE != 0则为安装在SDCard上的应用。

通过上面所说的判断方法来判断各种类型的应用,代码如下所示:

/*** Created by Administrator on 2016/6/6.* 通过PackageManager筛选不同类型的App*/
public class PMActivity extends Activity {public static final int ALL_APP = 0;public static final int SYSTEM_APP = 1;public static final int THIRD_APP = 2;public static final int SDCARD_APP = 3;private ListView mListView;private PMAdapter adapter;private List<ApplicationInfo> mListApplications;private PackageManager pm;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_pm);mListView = (ListView) findViewById(R.id.listView_pm);adapter = new PMAdapter(this);mListView.setAdapter(adapter);// 获取PackageManager对象pm = getPackageManager();// 获取应用信息mListApplications = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);}private List<PMAppInfo> getAppInfo(int flag) {List<PMAppInfo> appInfos = new ArrayList<>();// 判断应用类型switch (flag) {case ALL_APP:for (ApplicationInfo app : mListApplications) {appInfos.add(makeAppInfo(app));}break;case SYSTEM_APP:for (ApplicationInfo app : mListApplications) {if((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0)appInfos.add(makeAppInfo(app));}break;case THIRD_APP:for (ApplicationInfo app : mListApplications) {if((app.flags & ApplicationInfo.FLAG_SYSTEM) <= 0)appInfos.add(makeAppInfo(app));else if((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0)appInfos.add(makeAppInfo(app));}break;case SDCARD_APP:for (ApplicationInfo app : mListApplications) {if((app.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0)appInfos.add(makeAppInfo(app));}break;}return appInfos;}private PMAppInfo makeAppInfo(ApplicationInfo app) {PMAppInfo appInfo = new PMAppInfo();appInfo.setAppLabel((String) app.loadLabel(pm));appInfo.setAppIcon(app.loadIcon(pm));appInfo.setPkgName(app.packageName);return appInfo;}public void btnAllApp(View view) {adapter.addData(getAppInfo(ALL_APP));}public void btnSystemApp(View view) {adapter.addData(getAppInfo(SYSTEM_APP));}public void btn3rdApp(View view) {adapter.addData(getAppInfo(THIRD_APP));}public void btnSdcardApp(View view) {adapter.addData(getAppInfo(SDCARD_APP));}
}

运行的效果如下所示:

这里写图片描述

Android Apk 应用信息获取之ActivityManager

PackageManager重点在于获得应用的包信息,而ActivityManager重点在于获得在运行的应用程序信息。同PackageManager一样,ActivityManager也封装了不少Bean对象,下面列举了一些比较重要的对象:

  • ActivityManager.MemoryInfo
    MemoryInfo有几个非常重要的字段:availMem——系统可用内存,totalMem——总内存,threshold——低内存的阀值,即区分是否低内存的临界值,lowMemory——是否处于低内存。

  • Debug.MemoryInfo
    Android中还有一个MemoryInfo,它来自 Debug.MemoryInfo,前面的ActivityManager.MemoryInfo通常用于获取全局的内存使用信息,而 Debug.MemoryInfo用于统计进程下的内存信息。

  • RunningAppProcessInfo
    RunningAppProcessInfo就是运行进程的信息,存储的字段自然是进程相关的信息,processName——进程名,pid——进程pid,uid——进程uid,pkgList——该进程下的所有包。

  • RunningServiceInfo
    RunningServiceInfo与RunningAppProcessInfo类似,用于封装运行的服务信息,在它里面同样包含了一些服务进程的信息,同时还有一些其他信息。activeSince——第一次被激活的时间、方式,foreground——服务是否在后台执行。

使用ActivityManager的示例代码如下:

public class AMActivity extends Activity {private ListView mListView;private ActivityManager mActivityManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_am);mListView = (ListView) findViewById(R.id.listView_am_process);mActivityManager = (ActivityManager) getSystemService(Activity.ACTIVITY_SERVICE);mListView.setAdapter(new AMProcessAdapter(this, getRunningProcessInfo()));}public List<AMProcessInfo> getRunningProcessInfo() {List<AMProcessInfo> amProcessInfos = new ArrayList<AMProcessInfo>();//获取当前运行的进程信息List<ActivityManager.RunningAppProcessInfo> runningAppProcesses =mActivityManager.getRunningAppProcesses();for (int i = 0; i < runningAppProcesses.size(); i++) {ActivityManager.RunningAppProcessInfo info = runningAppProcesses.get(i);int pid = info.pid;int uid = info.uid;String processName = info.processName;int[] memoryPid = new int[]{pid};Debug.MemoryInfo[] memoryInfo = mActivityManager.getProcessMemoryInfo(memoryPid);int memeorySize = memoryInfo[0].getTotalPss();AMProcessInfo amProcessInfo = new AMProcessInfo();amProcessInfo.setPid("" + pid);amProcessInfo.setUid("" + uid);amProcessInfo.setProcessName(processName);amProcessInfo.setMemorySize("" + memeorySize);amProcessInfos.add(amProcessInfo);}return amProcessInfos;}
}

代码地址