Android系统信息和安全机制
主要内容:
- Android系统信息的获取
- PackageManager的使用
- ActivityManager的使用
- Android安全机制
1.Android系统信息获取
要获取系统的配置信息,通常可以从以下两个方面获取
- android.os.Build
SystemProperty
1.1 android.os.Build
android.os.Build类中的信息非常丰富,它包含了系统编译时的大量设备,配置信息:
Build.BOARD // 主板
- Build.BRAND // Android系统定制商
- Build.SUPPORTED_ABIS // CPU指令集
- Build.DEVICE // 设备参数
- Build.DISPLAY // 显示屏参数
- Build.FINGERPRINT // 唯一编号
- Build.SERIAL // 硬件序列号
- Build.ID // 修订版本列表
- Build.MANUUFACTURER //硬件制造商
- Build.MODER // 版本
- 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 // 编译时间
1.2 SystemProperty
SystemProperty包含了许多系统配置属性值和参数,很多信息与上面通过android.os.Build获取的值是相同的:
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.vender // Java Vender属性
- java.version // Java版本
- java.home // Java Home属性
1.3 Android系统信息实例
String board = Build.BOARD;
String brand = Build.BRAND;
String os_version = System.getProperty("os.version");
String os_name = System.getProperty("os.name");
2. Android Apk应用信息获取之PackageManager
2.1 PackageManager
在上图中,最里面的框代表整个Activity的信息,系统提供了ActivityInfo类来进行封装。
最外面的框代表着整个Mainifest文件中节点的信息,系统提供了PackageInfo来进行封装。
而Android系统提供了PackageManager来负责管理所有已安装的App。
- ActivityInfo
ActivityInfo封装了在Mainifest文件中和之间的所有信息,包括name,icon,label.launchmode等 - ServiceInfo
ServiceInfo与ActivityInfo类似,它封装了之间的所有信息。 - ApplicationInfo
ApplicationInfo也是一样,它封装了之间的信息,不过特别的是,ApplicationInfo包含很多Flag,FLAG_SYSTEM表示系统应用,FLAG_EXTERNAL_STORAGE表示安装在SDCard上的应用等,通过这些Flag,可以方便地判断应用的类型。 - PackageInfo
PackageInfo与前面三个Info类似,都是用于封装Mainifest文件的相关节点信息,而PackageInfo包含了所有的Activity,Service等信息。 - ResolveInfo
ResolveInfo比较特殊,它封装的是包含信息的上一级信息,所以它可以返回ActivityInfo,ServiceInfo等包含的信息,它经常用来帮助我们找到那些包含特定Intent条件的信息,如带分享功能,播放功能的应用。
有了上面这些用于封装的Bean对象后,PackageManager就可以通过调用各种方法,返回不同类型的Bean对象了。PackageManager经常使用方法:
- getPackageManager——通过调用这个方法返回PackageManager对象。
- getApplicationInfo——以ApplicationInfo的形式返回指定包名 的ApplicationInfo
- getApplicationIcon——返回指定包名的Icon
- getInstalledApplication——以ApplicationInfo的形式返回安装的应用
- getInstalledPackages——以PackageInfo的形式返回安装的应用
- queryIntentActivites——返回指定intent的ResolveInfo对象,Activity对象
- queryIntentServices——返回指定intent的ResolveInfo对象,Service对象
- resolveActivity——返回指定intent的Activity
- resolveService——返回指定intent的Service
判断App类型的依据,就是利用ApplicationInfo中的FLAG_SYSTEM来进行判断,代码如下:
app.flags & ApplicationInfo.FLAG_SYSTEM
通过这样的标志区分,可以判断出以下几种不同的应用类型
- 如果当前应用的flags & ApplicationInfo.FLAG_SYSTEM != 0 则为系统应用。
- 如果当前应用的flags & ApplicationInfo.FLAG_SYSTEM <= 0 则为第三方应用。
- 特殊的,当系统应用经过升级后,也将成为第三方应用:flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP != 0 。
- 如果当前应用的flags & ApplicationInfo.FALG_EXTERNAL_STORAGE != 0 则为安装在SDCard上的应用。
3. Android Apk应用信息获取之ActivityManager
PackageManager重点在于获得应用的包信息,而ActivityManager重点在于获得在运行的应用程序信息。
内存信息:
- ActivityManager.MemoryInfo
MemoryInfo有几个非常重要的字段:availMem——系统可用内存,totalMem——总内存,threshold——低内存的阈值,即区分是否低内存的临界值,lowMemory——是否处于低内存。
- Debug.MemoryInfo
ActivityManager.MemoryInfo通常用于获取全局的内存使用信息,而Debug.MemoryInfo用于统计进程下的内存信息。
- RunningAPPProgressInfo
RunningAPPProgressInfo是运行进程的信息,存储的字段是进程相关的信息,progressName——进程名,pid——进程pid,uid——进程uid,pkgList——该进程下的所有包。
- RunningServiceInfo
RunningServiceInfo用于封装运行的服务信息,activeSince——第一次被激活的时间,方式,foreground——服务是否在后台执行。
5. Android安全机制
5.1 Android安全机制简介
Android开发者在Android系统中建立了五道防线来保护Android系统的安全。
5.1.1 第一道防线
代码安全机制——代码混淆progrard
5.1.2 第二道防线
应用接入权限控制——AndroidMainifest文件权限声明,权限检查机制。
5.1.3 第三道防线
应用签名机制——数字证书
5.1.4 第四道防线
Linux内核层安全机制——Uid、访问权限控制
5.1.5 第五道防线
Android虚拟机沙箱机制——沙箱隔离
5.2 Android系统安全隐患
5.2.1 代码漏洞
5.2.2 Root风险
5.2.3 安全机制不健全
5.2.4 用户安全意识
5.2.5 Android开发原则与安全
5.3 Android Apk反编译
三个工具: