Android系统信息和Apk应用信息获取
2016-06-06 17:03
543 查看
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; @Override protected 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; @Override protected 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; } }
代码地址
相关文章推荐
- 使用Java代码获取服务器性能信息及局域网内主机名
- 使用Java获取系统信息的常用代码整理总结
- 使用 Python 获取 Linux 系统信息的代码
- 使用python编写脚本获取手机当前应用apk的信息
- 硬件系统信息收集-1-系统信息
- 硬件系统信息收集-3-内存磁盘
- 在SUN的sparc平台上显示系统信息(二)
- 查看Linux(CentOS)系统信息
- Linux-查看系统版本信息
- linux常用查看硬件设备信息命令
- Android获取手机应用信息
- vbs查询系统信息(名称,版本,系统盘,32or64)-wmi
- Linux命令之获取操作系统信息-uname
- windows XP查看系统信息
- C++获取系统信息(IP地址、硬件信息等)
- Check system info on Linux
- windows 获得系统信息 GetSystemInfo
- redhat查询系统信息
- 如何在SUN的sparc平台上显示系统信息(一)
- Linux下查看系统相关信息