您的位置:首页 > 移动开发 > Android开发

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;
}
}


代码地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息