《Android群英传》读书笔记(10)第九章:Android系统信息与安全机制

  1. Android系统信息获取

获取系统信息的途径,有下面两种途径:

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

  • Build.BOARD——主板
  • Build.BRAND——Android系统定制商
  • Build.SUPPORTED_ABIS——CPU指令集
  • Build.DEVICE——设备参数
  • Build.DISPLAY——显示屏参数
  • Build.FINGERPRINT——唯一编号
  • Build.SERIAL——硬件序列号
  • Build.ID——修订版本列表
  • Build.MANUFACTURER——硬件制造商
  • Build.MODEL——版本
  • Build.HARDWARE——硬件名
  • Build.PRODUCT——手机产品名
  • Build.TAGS——描述Build的标签
  • Build.TYPE——Builder类型
  • Build.VERSION.CODENAME——当前开发代号
  • Build.VERSION.INCREMENTAL——源码控制版本号
  • Build.VERSION.RELEASE——版本字符串
  • Build.VERSION.SDK_INT——版本号
  • Build.HOST——host值
  • Build.USER——User名
  • Build.TIME——编译时间
下面来看一下SystemProperty里的常用参数,可以通过System.getProperty:

  • os.version——OS版本
  • os.name——OS名称
  • os.arch——OS架构
  • user.home——home属性
  • user.name——name属性
  • user.dir——Dir属性
  • user.timezone——时区
  • path.separator——路径分隔符
  • line.separator——行分隔符
  • file.separator——文件分隔符
  • java.vendor.url——Java vender Url属性
  • java.class.path——Java Class属性
  • java.class.version——Java Class版本
  • java.vendor——Java Vender属性
  • java.version——Java版本
  • java.home——Java Home属性

2.PackageManager

Android提供了PackageManager来负责管理所有已安装的App,PackageManager可以获得AndroidManifest中不同节点的封装信息,下面是一些常用的封装信息:
  • ActivityInfo
ActivityInfo封装在了Mainfest文件中的<activity></activity>和<receiver></receiver>之间的所有信息,包括name、icon、label、launchMode等。
  • ServiceInfo
ServiceInfo与ActivityInfo类似,封装了<service></service>之间的所有信息。
  • ApplicationInfo
它封装了<application></application>之间的信息,特别的是,ApplicationInfo包含了很多Flag,FLAG_SYSTEM表示为系统应用,FLAG_EXTERNAL_STORAGE表示为安装在SDcard上的应用,通过这些flag可以很方便的判断应用的类型。
  • PackageInfo
PackageInfo包含了所有的Activity和Service信息。
  • ResolveInfo
ResolveInfo包含了<intent>信息的上级信息,所以它可以返回ActivityInfo、ServiceInfo等包含了<intent>的信息,经常用来帮助找到那些包含特定intent条件的信息,如带分享功能、播放功能的应用。
有了这些封装的信息后,还需要有特定的方法来获取它们,下面就是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。
根据ApplicationInfo的flag来判断App的类型:
如果当前应用的flags & ApplicationInfo.FLAG_SYSTEM != 0则为系统应用
如果flags & ApplicationInfo.FLAG_SYSTEM <= 0 则为第三方应用
特殊的当系统应用升级后也会成为第三方应用,此时 flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP != 0;
如果flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE != 0 则为安装在SDCard上的应用。

下面是一个列出手机上安装的所有App的示例:
public class PkgMgr extends AppCompatActivity implements View.OnClickListener {
    private PackageManager mPackageManager;

    private ListView mList;
    private PkgAdapter mAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pkg_mgr);
        mPackageManager = getPackageManager();
        mList = (ListView) findViewById(R.id.list);
        mAdapter = new PkgAdapter(this);
        mList.setEmptyView(findViewById(R.id.empty));
        mList.setAdapter(mAdapter);
        findViewById(R.id.btn_all).setOnClickListener(this);
        findViewById(R.id.btn_third).setOnClickListener(this);
        findViewById(R.id.btn_system).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        List<AppInfo> result;
        switch (v.getId()) {
            case R.id.btn_all:
                result = getAppInfo(R.id.btn_all);
                break;
            case R.id.btn_third:
                result = getAppInfo(R.id.btn_third);
                break;
            case R.id.btn_system:
                result = getAppInfo(R.id.btn_system);
                break;
            default:
                result = new ArrayList<>();
        }
        mAdapter.addAll(result);
    }

    private List<AppInfo> getAppInfo(int flag) {
        List<ApplicationInfo> appInfos = mPackageManager.getInstalledApplications(
                PackageManager.GET_UNINSTALLED_PACKAGES);
        List<AppInfo> list = new ArrayList<>();
        //根据不同的flag来切换显示不同的App类型
        switch (flag) {
            case R.id.btn_all:
                list.clear();
                for (ApplicationInfo appInfo : appInfos) {
                    list.add(makeAppInfo(appInfo));
                }

                break;
            case R.id.btn_third:
                list.clear();
                for (ApplicationInfo appInfo : appInfos) {
                    if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
                        list.add(makeAppInfo(appInfo));
                    } else if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){
                        list.add(makeAppInfo(appInfo));
                    }
                }
                break;
            case R.id.btn_system:
                list.clear();
                for (ApplicationInfo appInfo : appInfos) {
                    if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                        list.add(makeAppInfo(appInfo));
                    }
                }
                break;
        }
        return list;
    }

    private AppInfo makeAppInfo(ApplicationInfo appInfo) {
        AppInfo info = new AppInfo();
        info.setAppIcon(appInfo.loadIcon(mPackageManager));
        info.setAppLabel(appInfo.loadLabel(mPackageManager).toString());
        info.setPkgName(appInfo.packageName);
        return info;
    }

}
下面是Adapter类:
public class PkgAdapter extends BaseAdapter {

    private Context mContext;
    private List<AppInfo> mList;
    public PkgAdapter(Context context) {
        mContext = context;
        mList = new ArrayList<>();
    }

    public void addAll(List<AppInfo> list) {
        mList.clear();
        mList.addAll(list);
        notifyDataSetChanged();
    }
    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public AppInfo getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        AppInfo item = getItem(position);
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_app_info, parent, false);
            holder.mIcon = (ImageView) convertView.findViewById(R.id.iv_icon);
            holder.mLabel = (TextView) convertView.findViewById(R.id.tv_label);
            holder.mPkgName = (TextView) convertView.findViewById(R.id.tv_pkg_name);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.mIcon.setImageDrawable(item.getAppIcon());
        holder.mLabel.setText(item.getAppLabel());
        holder.mPkgName.setText(item.getPkgName());
        return convertView;
    }

    static class ViewHolder{
        ImageView mIcon;
        TextView mLabel;
        TextView mPkgName;
    }
}

AppInfo 类,将获得的ApplicationInfo进一步封装,在ListView中显示:
public class AppInfo {

    private String appLabel;
    private String pkgName;
    private Drawable appIcon;

    public String getAppLabel() {
        return appLabel;
    }

    public void setAppLabel(String appLabel) {
        this.appLabel = appLabel;
    }

    public String getPkgName() {
        return pkgName;
    }

    public void setPkgName(String pkgName) {
        this.pkgName = pkgName;
    }

    public Drawable getAppIcon() {
        return appIcon;
    }

    public void setAppIcon(Drawable appIcon) {
        this.appIcon = appIcon;
    }
}
下面是运行效果:

3.ActivityManager

与PackageManager不同,ActivityManager侧重于获取正在运行的应用程序信息,可以通过context.getSystemService(Context.ACTIVITY_SERVICE);来获得。下面是这个类中封装的一些信息:
  • ActivityManager.MemoryInfo——MemoryInfo有几个非常重要的字段:availMem(系统可用内存),totalMem(总内存),threshold(低内存的阈值,即区分是否低内存的临界值),lowMemory(是否处于低内存)。
  • Debug.MemoryInfo——这个MemoryInfo用于统计进程下的内存信息。
  • RunningAppProcessInfo——运行进程的信息,存储的字段有:processName(进程名),pid(进程pid),uid(进程uid),pkgList(该进程下的所有包)
  • RunningServiceInfo——运行的服务信息,在它里面同样包含了一些服务进程信息,同时还有一些其他信息。activeSince(第一次被激活的时间、方式),foreground(服务是否在后台执行)。
下面是使用ActivityManager获取运行的进程信息的示例:
public class  AtyMgr extends AppCompatActivity{
    private ActivityManager am;

    private ListView mList;

    private AtyAdapter mAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_aty_mgr);
        am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        mList = (ListView) findViewById(R.id.aty_list);
        mAdapter = new AtyAdapter(this,getRunningProcessInfo());
        mList.setAdapter(mAdapter);
    }

    private List<AtyInfo> getRunningProcessInfo() {
        List<ActivityManager.RunningAppProcessInfo> processInfoList;
        processInfoList = am.getRunningAppProcesses();
        List<AtyInfo> result = new ArrayList<>();
        Log.d("TAG", "size = " + processInfoList.size());
        for (ActivityManager.RunningAppProcessInfo processInfo : processInfoList) {
            result.add(makeProcessInfo(processInfo));
        }
        return result;
    }

    private AtyInfo makeProcessInfo(ActivityManager.RunningAppProcessInfo processInfo) {
        AtyInfo atyInfo = new AtyInfo();
        atyInfo.setPid(processInfo.pid + "");
        atyInfo.setUid(processInfo.uid + "");
        Debug.MemoryInfo[] memoryInfos = am.getProcessMemoryInfo(new int[]{processInfo.pid});
        int memorySize = memoryInfos[0].getTotalPss();
        atyInfo.setMemory(memorySize);
        atyInfo.setProcessName(processInfo.processName);
        return atyInfo;
    }

}
Adapter的代码与上面PackageManager示例类似,不再贴出来了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值