1. Android系统信息获取
要获取系统的配置信息,通常可以从以下两个方面获取
1.1. android.os.Build
Build
类包含了系统编译时的大量设备、配置信息
1.2. SystemProperty
SystemProperty包含了许多系统配置属性值和参数,很多信息与通过Build
获取的值是相同的
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");
系统信息最根本的来源在system/build.prop文件中,包含了很多RO属性值。进入/system目录,通过cat build.prop
命令查看文件信息。同时,在adb shell中,还可以通过getprop来获取对应属性的值,如getprop ro.build.id
。
除了上面两个方法,Android系统还有/proc目录来存储系统信息,这里的信息比通过Build
获得的信息更加丰富
2. Android Apk应用信息获取之PackageManager
ActivityInfo
: 封装了在Manifest文件中<activity></activity>
和<receiver></receiver>
之间的所有信息,包括name
、icon
、label
、launchmod
等ServiceInfo
: 封装了<service></service>
之间的所有信息ApplicationInfo
: 封装了<application></application>
之间的信息。ApplicationInfo
包含很多Flag,FLAG_SYSTEM
表示为系统应用,FLAG_EXTERNAL_STORAGE
表示为安装在SDCard上的应用PackageInfo
: 封装Manifest文件的相关节点信息,而PackageInfo包含了所有的Activity、Service等信息ResolveInfo
: 封装的是包含<intent>
信息的上一级信息,用来帮助找到那些包含特定Intent
条件的信息
有了上面这些用于封装的Bean对象之后,PackageManager
就可以通过调用各种方法,返回不同类型的Bean对象了
- 如果当前应用的
flags & ApplicationInfo.FLAG_SYSTEM != 0
则为系统应用 - 如果当前应用的
flags & ApplicationInfo.FLAG_SYSTEM == 0
则为第三方应用 - 当系统应用经过升级后,也将成为第三方应用:
flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP != 0
- 如果当前应用的
flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE != 0
则为安装在SDCard上的应用
3. Android Apk应用信息获取之ActivityManager
PackageManager
重点在于获得应用的包信息,而ActivityManager
重点在于获得在运行的应用程序信息
ActivityManager.MemoryInfo
:MemoryInfo
有几个非常重要的字段:availMem
系统可用内存,totalMem
总内存,threshold
低内存的阈值,lowMemory
是否处于低内存Debug.MemoryInfo
:ActivityManager.MemoryInfo
通常用于获取全局的内存使用信息,而Debug.MemoryInfo
用于统计进程下的内存信息RunningAppProcessInfo
: 运行进程的信息,存储的字段就是进程相关的信息,processName
进程名,pid
进程pid,uid
进程uid,pkgList
该进程下的所有包RunningServiceInfo
: 用于封装运行的服务信息,同样包含了一些服务进程的信息,同时还有一些其他信息
4. 解析Packages.xml获取系统信息
在系统初始化的时候,PackageManager
的底层实现类PackageManagerService
会去扫描系统中的一些特定的目录,并解析其中的Apk文件。同时,Android把它获得的应用信息,保存在/data/system/packages.xml中,当系统中的Apk安装、删除、升级时,它也会被更新
<permissions>
标签:定义了目前系统中的所有权限,并分为两类:系统定义的(package属性为Android)和Apk定义的(package属性为Apk的包名)<package>
标签:代表一个Apk的属性。name: Apk的包名,codePath: Apk安装路径,主要有/system/app和/data/app两种,userId: 用户ID, version: 版本号<perms>
标签:对应Apk的AndroidManifest文件中的标签,记录Apk的权限信息
5. Android安全机制
5.1. Android安全机制简介
- 第一道防线:代码安全机制——代码混淆proguard
- 第二道防线:应用接入权限控制——AndroidManifest文件权限声明、权限检查机制
- 第三道防线:应用签名机制——数字证书
数字证书用于保护App的作者对其App的信任关系,只有拥有相同数字签名的App,才会在升级时被认为是同一App - 第四道防线:Linux内核层安全机制——Uid、访问权限控制
Android继承了Linux的安全特性,比如文件访问机制 - 第五道防线:Android虚拟机沙箱机制——沙箱隔离
Android的App运行在虚拟机中,因此才有沙箱机制,可以让应用之间相互隔离
5.2. Android系统安全隐患
- 代码漏洞
- Root风险
- 安全机制不健全
- 用户安全意识
- Android开发原则与安全
Android与iOS系统一个非常显著的区别就是一个是开放系统一个是封闭系统
5.3. Android Apk反编译
apktool
执行反编译命令:apktool_2.0.0b7.jar d test.apk
重新打包:apktool_2.0.0b7.jar b test
执行该命令后,在test文件夹下就会生成两个新的文件夹,重新打包的Apk在dlist目录下Dex2jar、jd-gui
用解压缩工具解压Apk后的那个文件夹,有一个classes.dex文件
反编译dex文件:d2j-dex2jar.bat classes.dex
用jd-gui打开生成的classes-dex2jar.jar文件
5.4. Android Apk加密
为了能够对编译好的Java Class文件进行一些保护,通常会使用ProGuard来对Apk进行混淆处理,用无意义的字母来重命名类、字段、方法和属性