Android群英传知识点回顾——第九章:Android系统信息与安全机制


  • 9.1 Android系统信息获取

    • 9.1.1 android.os.Build
    • 9.1.2 SystemProperty
    • 9.1.3 Android系统信息实例
  • 9.2 Android Apk应用信息获取之PackageManager
    • 9.2.1 PackageManager
  • 9.3 Android Apk应用信息获取之ActivityManager
  • 9.4 解析Packages.xml获取系统信息
  • 9.5 Android安全机制
    • 9.5.1 Android安全机制简介
    • 9.5.2 Android系统安全隐患
    • 9.5.3 Android Apk反编译
    • 9.5.4 Android Apk加密

要获取系统的配置信息,通常可以从以下两个方面获取:

  • android.os.Build
  • SystemProperty

该类包含系统编译时大量设备、配置信息:

  • 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包含了许多系统配置属性值和参数:

  • 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属性

上面列举了那么多,让我们通过代码获取他们的系统信息:

我们还可以通过命令行模式查看系统信息:

  • 命令行模式进入system/build.prop文件目录,使用cat build.prop命令查看文件信息

我们还可以通过adb shell的getprop来获取对应的属性值:

  • 进入adb shell,使用getprop ro.build.id获取信息

还有一个非常重要的目录存储系统信息,那就是/proc目录:

  • 命令行模式进入/proc文件目录,使用cat cpuinfo命令打开cpuinfo文件查看系统信息

看了这么多系统信息,应该看Apk应用信息了,在ADB
Shell命令中,有两个非常强大的助手,PM和AM,PM主宰着应用的包管理,而AM主宰着应用的活动管理

  • ActivityInfo
    ActivityInfo封装在了Mainfest文件中的< activity >和<
    eceiver>之间的所有信息,包括name、icon、label、launchMode等。
  • ServiceInfo
    ServiceInfo与ActivityInfo类似,封装了< service>之间的所有信息。
  • ApplicationInfo
    它封装了<
    application>之间的信息,特别的是,ApplicationInfo包含了很多Flag

    • FLAG_SYSTEM表示为系统应用
    • FLAG_EXTERNAL_STORAGE表示为安装在SDcard上的应用
  • PackageInfo

    PackageInfo与前面三个Info类类似,都是用于封装Manifest文件的相关节点信息,而PageageInfo包含了所有的Activity和Service信息。

  • ResolveInfo
    ResolveInfo包含了<
    intent>信息的上一级信息,所以它可以返回ActivityInfo、ServiceInfo等包含了< 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

下面通过一个实际的例子通过PackageManager筛选不同类型的App,利用ApplicationInfo中的FLAG_SYSTEM来判断:

  • 如果当前应用的flags & ApplicationInfo.FLAG_SYSTEM !=0则为系统应用
  • 如果flags & ApplicationInfo.FLAG_SYSTEM <=0 则为第三方应用
  • 特殊的,当系统应用升级后,也将会成为第三方应用: flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP
    !=0
  • 如果当前应用的flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE !=0 则为安装在SDCard上的应用

我们封装一个Bean来保存我们所需的字段:

接下来,通过上面所说的判断方法来判断各种类型的应用:

ActivityManager获取应用程序信息封装了不少Bean对象:

  • ActivityManager.MemoryInfo

    MemoryInfo有几个非常重要的字段:availMem(系统可用内存),totalMem(总内存),threshold(低内存的阈值,即区分是否低内存的临界值),lowMemory(是否处于低内存)

  • Debug.MemoryInfo
    这个MemoryInfo用于统计进程下的内存信息
  • RunningAppProcessInfo

    运行进程的信息,存储的字段有:processName(进程名),pid(进程pid),uid(进程uid),pkgList(该进程下的所有包)

  • RunningServiceInfo

    运行的服务信息,在它里面同样包含了一些服务进程信息,同时还有一些其他信息,activeSince(第一次被激活的时间、方式),foreground(服务是否在后台执行)

下面同样通过例子来看看如何使用ActivityManager,我们封装一个Bean来保存我们所需的字段:

接下来,调用getRunningAppProcesses方法,返回当前运行的进程信息,并将我们关心的信息保存到Bean中:

在系统初始化的时候,PackageManager的底层实现类PackageManagerService会去扫描系统的一些特定目录,并且解析其中的Apk文件,同时,Android把它获取到的应用信息,保存到XML文件中,做成一个应用的花名册,当系统中的APK安装、删除、升级时,它也会被更新

这个packages.xml位于/data/system/目录下,我们用adb pull命令把他导出来,进行查看分析:

  • < permissions>标签
    permissions标签定义了目前系统所有的权限,并分为两类:系统定义的和Apk定义的
  • < package>标签
    package代表的是一个apk的属性,其中各节点的信息含义大致为
    • name:APK的包名
    • cadePath:APK安装路径,主要在system/app和data/app两种,前者是厂商定制的Apk,后者是用户安装的第三方Apk
    • userid:用户ID
    • version:版本
  • < perms>标签
    对应Apk的AndroidManifest文件中的<
    uses-permission>标签,记录Apk的权限信息

无知识点

  • 第一道防线:代码安全机制——代码混淆proguard

    proguard可以混淆关键代码、替换命名让破坏者阅读难,同样也可以压缩代码,优化编译后的Java字节码

  • 第二道防线:应用接入权限控制——清单文件权限声明,权限检查机制

    任何App在使用Android受限资源的时候,都需要显示向系统声明所需的权限,只有当一个应用App具有相应的权限,才能申请受限资源的时候,通过权限机制的检查并使用系统的Binder对象完成对系统服务的调用,但是这道防线也有先天性不足,如以下几项:

    • 被授予的权限无法停止
    • 在应用声明App使用权限的时,用户无法针对部分权限进行限制
    • 权限的声明机制与用户的安全理念相关
      Android系统通常按照以下顺序来检查操作者的权限:
      • 首先,判断permission名称,如果为空则直接返回PERMISSION_DENIED
      • 其次,判断Uid,如果为0则为root权限,不做权限控制,如果为System
        Service的Uid则为系统服务,不做权限控制,如果Uid与参数中的请求Uid不同则返回PERMISSION_DENIED
      • 最后,通过调用packagemanageservice.checkUidPermission()方法来判断该Uid是否具有相应的权限,该方法会去XML的权限列表和系统级的platform.xml中进行查找
  • 第三道防线:应用签名机制一数字证书

    Android中所有的App都会有一个数字证书,这就是App的签名,数字证书用于保护App的作者和其App的信任关系,只有拥有相同数字签名的App,才会在升级时被认为是同一App,而且Android系统不会安装没有签名的App

  • 第四道防线:Linux内核层安全机制一一Uid 访问权限控制

    Animid本质是基于Linux内核开发的,所以Android同样继承了Linux的安全特性,托福和雅思比如文件系统的权限控制是由user,group,other与读(r),写(w),执行(x)的不同组合来实现的,同样,Android也实现了这套机制,通常情况下,只有System、root用户才有权限访问到系统文件,而一般用户无法访问

  • 第五道防线:Android虚拟机沙箱机制——沙箱隔流

    Android的App运行在虚拟机中,因此才有沙箱机制,可以让应用之间相互隔离,通常情况下,不同的应用之间不能互相访问,每个App都有与之对应的Uid,每个App也运行在单独的虚似机中,与其他应用完全隔离,在实现安全机制的基础上,也让应用之间能够互不影响,即时一个应用崩溃,,也不会导致其他应用异常

  • 代码漏洞
  • Root风险
  • 安全机制不健全
  • 用户安全意识
  • Android开发原则与安全

书本列举的几个点相信大家也都比较熟悉,所以不做解释了

这里个人的博客有简单的介绍:Android四大组件——Activity切换效果、杀死进程、杀死所有Activity、安装及反编译

为了能够对编译好的JavaClass文件进行一些保护,通常会用ProGuard混淆代码:

  • ProGuard:用无意义的字母来重命名类、字段、方法和属性
  • 删除无用的类、字段、方法和属性,以及删除没用的注释,最大限度地优化字节码文件

使用ProGuard也简单,在Android Studio中可以打开build.gradle(Module:app):

这里的minifyEnabled就是打开ProGuard的开关,proGuardFiles属于配置混淆文件,分为两部分:

  • 使用默认的混淆文件,位于< SDK目录>/tools/proguard/proguard-android.txt目录下
  • 使用自定义混淆文件,可以在项目的App文件夹找到这个文件,在这个文件里可以定义引入的第三方依赖包的混淆规则

原文地址:https://www.cnblogs.com/zhanglixina/p/9603817.html

时间: 2024-10-10 12:36:35

Android群英传知识点回顾——第九章:Android系统信息与安全机制的相关文章

Android群英传知识点回顾——第二章:Android开发工具新接触

2.1 Google生态系统 2.1.1 Android Studio初体验 2.1.2 Android Studio配置 2.2 Android高级使用技巧 2.2.1 更新SDK 2.2.2 Android Studio常用界面 2.2.3 导入Android Studio工程 2.3 ADB命令使用技巧 2.3.1 ADB基础 2.3.2 ADB常用命令 2.3.2 ADB命令来源 2.4 模拟器使用与配置 Eclipse缺点: 内存占用高 经常崩溃 开发界面不美观 Android作为插件

Android群英传知识点回顾——第八章:Activity与Activity调用栈分析

8.1 Activity 8.1.1 起源 8.1.2 Activity形态 8.1.3 生命周期 8.2 Activity任务栈简介 8.3 ActivityManifest启动模式 8.3.1 standard 8.3.2 singleTop 8.3.3 singleTask 8.3.4 singleInstance 8.4 Intent Flag启动模式 8.5 清空任务栈 8.6 Activity任务栈使用 四大组件中出现频率最高的组件 Activity是与用户交互的第一接口,它提供了一

Android群英传知识点回顾——第六章:Android绘图机制与处理技巧

6.1 屏幕的尺寸信息 6.1.1 屏幕参数 6.1.2 系统屏幕密度 6.1.3 独立像素密度dp 6.1.4 单位转换 6.2 2D绘图基础 6.3 Android XML绘图 6.3.1 Bitmap 6.3.2 Shape 6.3.3 Layer 6.3.4 Selector 6.4 Android绘图技巧 6.4.1 Canvas 6.4.2 Layer图层 6.5 Android图像处理之色彩特效处理 6.5.1 色彩矩阵分析 6.5.2 Android颜色矩阵--ColorMatr

Android群英传知识点回顾——第七章:Android动画机制与使用技巧

7.1 Android View动画框架 7.1.1 透明度动画 7.1.2 旋转动画 7.1.3 位移动画 7.1.4 缩放动画 7.1.5 动画集合 7.2 Android属性动画分析 7.2.1 ObjectAnimator 7.2.2 PropertyValuesHolder 7.2.3 ValueAnimator 7.2.4 动画事件的监听 7.2.5 AnimatorSet 7.2.6 在XML中使用属性动画 7.2.7 View的animate方法 7.3 Android布局动画

Android群英传笔记——第四章:ListView使用技巧

Android群英传笔记--第四章:ListView使用技巧 近期也是比較迷茫.可是有一点点还是要坚持的,就是学习了.近期离职了,今天也是继续温习第四章ListView,也拖了事实上也挺久的了,listview可谓是老牌大将了,非常多的应用场景都要使用它,他也是我们用得最多的控件之中的一个了,尽管如今出来了一个RecyclerView,可是ListView的地位一时半会儿还是撼动不了的.这就促使我们更加应该去把他掌握了 一.Listview经常使用优化技巧 我们一步步来把ListView学习好

Android群英传笔记——第七章:Android动画机制和使用技巧

Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中十分重要的一部分,从早期的Android版本中,由于动画机制和绘图机制的不健全,Android的人机交互备受诟病,Android从4.X开始,特别是5.X,动画越来越完善了,Google也开始重视这一方面了,我们本章学习的主要内容有 Android视图动画' Android属性动画 Android动画

Android群英传笔记——第五章:Android Scroll分析

一.滑动效果是如何产生的 滑动一个View的本质其实就是移动一个View,改变其当钱所在的位置,他的原理和动画效果十分的相似,就是通过不断的改变View的坐标来实现这一效果,动态且不断的改变View的坐标,从而实现View跟随用户触摸滑动而滑动 但是在讲解滑动效果之前,需要先了解一下Android中窗口坐标体系和屏幕的触控事件--MotionEvent 1.Android坐标系 在物理学上,要描述一个物体的运动,就必须选定一个参考系,所谓滑动,正是相对于参考系的运动,在Android,系统将屏幕

Android群英传笔记——第九章:Android系统信息和安全机制

Android群英传笔记--第九章:Android系统信息和安全机制 本书也正式的进入尾声了,在android的世界了,不同的软件,硬件信息就像一个国家的经济水平,军事水平,不同的配置参数,代表着一个android帝国的强弱,所以厂商喜欢打配置战,本节就要是讲 Android系统信息的获取 PackageManager的使用 ActivityManager的使用 Android安全机制 一. Android系统信息的获取 由于android手机的开源性,手机的配置各种各样,那些优化大师之类的东西

Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 这一章很多,但是很有趣,也是这书的最后一章知识点了,我现在还在考虑要不要写这个拼图和2048的案例,在此之前,我们先来玩玩Android5.X的新特性吧!