-
2020-07-24 16:37:42
主要针对下部分导航条,顶部导航条,如果不设置将显示不全。
最初由iOS浏览器提供,用于允许开发人员将其内容放置在视口的安全区域中,该规范中定义的
safe-area-inset-*
值可用于确保内容即使在非矩形的视区中也可以完全显示。语法
/* Using the four safe area inset values with no fallback values */ env(safe-area-inset-top); env(safe-area-inset-right); env(safe-area-inset-bottom); env(safe-area-inset-left); /* Using them with fallback values */ env(safe-area-inset-top, 20px); env(safe-area-inset-right, 1em); env(safe-area-inset-bottom, 0.5vh); env(safe-area-inset-left, 1.4rem);
safe-area-inset-top
,safe-area-inset-right
,safe-area-inset-bottom
,safe-area-inset-left
safe-area-inset-*
由四个定义了视口边缘内矩形的 top, right, bottom 和 left 的环境变量组成,这样可以安全地放入内容,而不会有被非矩形的显示切断的风险。对于矩形视口,例如普通的笔记本电脑显示器,其值等于零。 对于非矩形显示器(如圆形表盘,iPhoneX屏幕),在用户代理设置的四个值形成的矩形内,所有内容均可见。注意: 不同于其他的 CSS 属性,用户代理定义的属性名字对大小写敏感。
body { padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) }
更多相关内容 -
Android项目实战——手机安全卫士开发案例解析(随书代码文件
2013-06-16 15:39:24Android项目实战——手机安全卫士开发案例解析 随书代码文件 -
《手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解》 勘误
2018-10-29 02:25:06为方便和及时的回复读者对书中或者TEE相关的问题的疑惑(每天必看一次),也为了大家能有一个统一的交流平台。我搭建了一个简单的论坛,网址如下: ... ...也欢迎大家发帖,一起讨论TEE相关的一些有意思的feature。...为方便和及时的回复读者对书中或者TEE相关的问题的疑惑(每天必看一次),也为了大家能有一个统一的交流平台。我搭建了一个简单的论坛,网址如下:
https://www.huangtengxq.com/discuz/forum.php
关于您的疑问可在“相关技术讨论“”中发帖,我会逐一回复。也欢迎大家发帖,一起讨论TEE相关的一些有意思的feature。共同交流。同时该论坛中也会添加关于移动端虚拟化的相关技术的板块,欢迎各位共同交流学习,共同学习
目录
书中所用的OP-TEE代码已经上传到百度云盘,读者可自行下载:
提取码: cd94
本书是基于OP-TEE2.6.0左右的代码进行介绍,也收到一些读者的反馈,书中有错误之处,现将书中错误更正如下:
1. 代码的抓取和环境的搭建
本书中所包含的示例可在OP-TEE_2.6.0稳定版本中运行。正确抓取代码和搭建编译操作如下:
A. 建立保存OP-TEE工程的代码目录
B. 使用如下指令进行repo init的操作
repo init -u https://github.com/OP-TEE/manifest.git -m default_stable.xml --repo-url=git://codeaurora.org/tools/repo.git -b 2.6.0
C. 做如下操作修正manifest.xml文件:
1. 切换到建立好的OP-TEE工程目录
2.运行如下指令:
sed -i "s/\.git//g" .repo/manifest.xml
3. 修改.repo/manifest.xml文件中的 linux project(删除改行的revision字段), 内容如下:
<project name="linux" path="linux" remote="linaro-swg" revision="50403184d40d04b3daf140417e031c16c2985eaf"/>
改为:
<project name="linux" path="linux" remote="linaro-swg"/>
D. 使用如下命令开始抓取OP-TEE的tag2.6.0的代码
repo sync -j8
E. 切换到build目录,使用如下指令安装交叉编译器
make -f toolchain.mk toolchains
F. 切换到build目录,使用如下命令开始编译整个工程
make -f qemu.mk all
G. 切换到build目录,使用如下命令开始使用qemu运行op-tee
make -f qemu.mk run-only
H. 执行完上述命令之后在 qemu界面中输入小写字母“c”来运行op-tee
2. 书中示例代码的集成
书中所有的示例已经在TAG 2.6.0的工程中集成完毕,读者下载完示例代码之后,可使用如下操作将示例代码集成到OP-TEE的工程中进行运行:
A. 使用git clone命令下载书中的示例代码
B. 将示例代码包中的<xxx>_common_2.6.0.patch文件和<xxx>_qemu_2.6.0.patch文件拷贝到build目录中
C.使用如下命令将示例集成到OP-TEE工程中
git apply <xxx>_common_2.6.0.patch
git apply <xxx>_qemu_2.6.0.patch
D.使用make -f qemu.mk all重新编译整个工程,编译完成之后再使用make -f qemu.mk run-only运行整个工程
E.按照书中所写运行相关命令查看集成效果
3. 书中内容更正
第8页,execution 改为 exception
第8页,AMR改为ARM
第9页和第11页,APB-AXI-APB改为AXI-to-APB
第19页,pip install:wand改为pip install wand
2.2.3章节 图2-4中,示意框图内的“TZSAC”应改为“TZASC”
-
学习笔记之《Android项目实战——手机安全卫士》
2017-04-10 22:20:35【Android项目实战-手机安全卫士】 目标:快速积累开发经验,具备中级Android工程师能力。 如遇到难以理解的逻辑或功能,可以先将程序打断点观察程序的执行逻辑。 第一章项目简介:欢迎界面、主界面 第二章...【Android项目实战-手机安全卫士】
目标:快速积累开发经验,具备中级Android工程师能力。
如遇到难以理解的逻辑或功能,可以先将程序打断点观察程序的执行逻辑。
第一章项目简介:欢迎界面、主界面
第二章手机防盗:手机sim卡绑定、GPS定位、远程锁屏、远程删除数据
第三章通讯卫士:黑名单添加、电话拦截、短信拦截
第四章软件管家:软件的快速启动、卸载、分享、设置
第五章手机杀毒:第三方数据库的使用、病毒扫描、病毒查杀
第六章缓存清理:获取手机中的缓存信息并对缓存清理
第七章进程管理:获取手机中正在运行的进程、结束进程、锁屏时是否清理进程
第八章流量统计:运营商信息设置、获取流量套餐、显示本月和本日流量
第九章高级工具:号码归属地查询、短信备份、短信还原、程序锁
第十章设置中心:手机卫士设置(是否开启黑名单拦截、是否开启程序锁)
动手完成每一个功能模块!
本项目按照功能分类放在不同的包中。以章节为编号作为包名将每个大的功能模块放在一个包中。例如操作界面的Activity都直接放在章节包中(chapter01)。
主界面HomeActivity因为是公用界面,这里单独放在mobilesafe包中。
按章节具体学习如下:
【第一章】
HomeAdapter主界面的布局填充器(填充界面中的9个功能图标及文字信息)
VersionEntity封装版本信息的实体类(从服务器获取到的信息存储到实体类中)
DownLoadUtils从服务器下载apk的工具类
MyUtils获取应用程序的版本信息、实现新版本apk的安装
VersionUpdateUtils进行版本更新的工具类
SplashActivity展示欢迎界面及版本信息
HomeActivity展示程序主界面及实现各个功能图标的点击事件
由于需要获取服务端应用的版本号以及下载最新apk,所以需要搭建一个服务器。
1.这里采用tomcat作为服务器,点击tomcat目录下bin/startup.bat开启服务器。
2.创建一个HTML页面(updateinfo.html),该页面返回的信息需要包括服务器中apk的版本号、版本说明、新版本的下载地址。
updateinfo.html页面的json信息如下(直接新建一个只含有下面内容的网页即可):
{
"code":"2.0",
"des":"手机卫士2.0版本,新增了手机杀毒功能",
"apkurl":"http://172.16.25.13:8080/mobilesafe.apk"
}
3.将updateinfo.html页面及卫士2.0版本的apk(经过签名打包用于发布的apk,而不是调试的apk)复制到tomcat的webapps/ROOT文件夹下。
本项目采用第三方开源框架xUtils下载apk,因此需要将xUtils的jar包导入。它包含很多工具类,本项目用到:
1.HttpUtils类用于发送Http请求、上传文件、下载文件等。
2.RequestCallBack<File>接口有三个抽象方法可以获取到文件的下载状态。
Java中是没有指针的,因此在实现回调时都是通过接口或抽象类。
主界面包含一个GridView(九宫格控件),它的每个Item类似,都由一张图片和一个标题组成,因此创建一个Item布局为GridView设置每个条目数据。
要将这个Item中的功能图标和文字填充到主界面中,还需要创建一个布局填充器HomeAdapter。
【第二章】
ContactAdapter用于填充联系人界面的数据适配器
InterPasswordDialog自定义的dialog对话框,用于输入防盗密码
SetUpPasswordDialog自定义对话框,用于设置防盗密码
ContactInfo用于存储联系人信息的实体类
BootCompleteReciever用于监听手机开机启动的广播接收者,检测SIM卡是否更换
MyDeviceAdminReciever用于获取超级管理员权限的广播接收者
SmsLostFindReciver监听短信到来的广播接收者,接收到指令后进行相应的报警操作
GPSLocationService用于定位手机的服务
ContactInfoParser用于从数据库中解析联系人信息
MD5Utils加密算法的工具类
BaseSetUpActivity设置向导的公共父类,封装了一些手势识别的方法
ContactSelectActivity获取手机中的联系人并展示到界面中
LostFindActivity用于显示手机防盗界面以及防盗指令
SetUp1Activity显示设置向导第一个界面
SetUp2Activity显示设置向导第二个界面并绑定SIM卡
SetUp3Activity显示设置向导第三个界面并选择安全联系人
SetUp4Activity显示设置向导第四个界面并开启防盗保护功能
在设置密码界面布局setup_password_dialog.xml中drawable/coner_bg_white这个文件中使用shape属性自定义对话框的样式,
其中corners指定对话框的圆角solid指定圆角的颜色。
在values/styles是自定义对话框样式文件。
在保存用户密码时,采用了MD5加密算法,这种算法是不可逆的。每次验证时,把新输入密码在加密后和最初设置密码加密后的结果比对。
小圆点界面(滑动到当前界面的动态指示小圆点),界面中这些小圆点实际上就是RadioGroup中放了一组RadioButton,通过background属性来指定按钮颜色。
在setup_radiogroup.xml中使用了selector(背景选择器)drawable/circle_purple_bg_selector,其中circle_purple又指定按钮的颜色和形状。
在设置向导界面一中activity_setup1.xml通过include标签引入小圆点布局。
titlebar.xml用于设置标题栏。
滑屏动画:res/anim目录下。(p代表屏幕,整个屏幕左上角代表坐标轴原点0,0)
下一个(从右往左)界面进入动画:next_in.xml,android:fromXDelta="100%p"与android:toXDelta="0"表示当前界面从X轴坐标100%p移动到0。
下一个(从右往左)界面切出:next_out.xml。
上一个(从左往右)界面进入:pre_in.xml。
上一个(从左往右)界面切出:pre_out.xml。
手势滑动:通过手势左右滑动实现切换设置向导的4个界面。每个界面都需要滑动,可以定义一个父类实现手势识别功能,其他类继承该类。
在检测SIM卡是否发生变化时,可以使用Application类。该类是Android框架的一个系统组件,当Android程序启动时系统会创建Application对象。
它用来存储系统的一些信息,直到应用的所有Activity全部被销毁之后才会被释放。可以进行数据传递、数据共享、数据缓存操作。
当Application启动时,系统会创建一个进程ID,所有的Activity都会在此进程上运行。
当Application创建时会初始化全局变量,所以同一个应用的所有Activity都可以取得这些全局变量的值。
通常它会由系统自动创建,如果需要使用,就自己创建一个类继承它,并在配置文件中application标签进行注册(只需增加name属性即可)。
因此,通过这种特性,可以将检测方法放在Application的onCreate()方法中,当程序启动时就会检测SIM卡是否变更。本项目是App类继承它的。
有时需要重启手机识别新的SIM卡,因此还需要创建一个开机启动的广播接收者BootCompleteReciever来
实现监听手机开机事件,并调用APP中的correctSIM()方法判断SIM卡是否变更。
在第三个向导界面中,联系人列表的界面(activity_contact_select.xml)需要在ListView控件中展示,
同时该控件需要填充列表的Item布局item_list_contact_select.xml。联系人的实体类ContactInfo用于封装联系人信息。
ContactInfoParser:联系人信息都存储在SQLite数据库中,需要先获取到联系人的id,
根据id在data表中查询联系人名字和电话,并封装到ContactInfo中,然后存入List集合。
从数据库中查询出的联系人信息,通过数据适配器(ContactAdapter)填充到ListView中,本ListView有两处提升性能的优化。
在ContactSelectActivity类中将数据填充到界面。
在4个向导界面之后是防盗指令界面LostFindActivity。
为了监听设置的安全号码发来的短信,识别其中的防盗指令,需要创建一个广播接收者SmsLostFindReciver根据收到的短信指令来执行不同操作。
在执行远程锁屏和删除数据时,需要获得超级管理员权限,可以手动开启,可以通过代码开启。大多情况是需要代码开启的。有三步:
1.定义超级管理员的广播接收者MyDeviceAdminReciever。
2.在配置清单文件中,注册上述广播,并且添加权限BIND_DEVICE_ADMIN用于指定绑定超级权限。
其中,meta-data标签表示超级管理员的元数据,里面的resource属性用于指定安全策略。
3.安全策略在文件xml/device_admin_sample.xml中。
防盗指令中的定位服务GPSLocationService,用于获取手机所在经纬度、移动速度、精确度。
【第三章】
BlackContactAdapter用于填充黑名单的数据适配器
ContactAdapter用于填充手机联系人信息的数据适配器
BlackNumberDao用于对黑名单中的数据进行增删查
BlackNumberOpenHelper创建黑名单数据库,继承自SQLiteOpenHelper
BlackContactInfo存储黑名单信息的实体类
ContactInfo联系人信息的实体类
InterceptCallReciever拦截电话的广播接收者
InterceptSmsReciever拦截短信的
TestBlackNumberDao操作黑名单数据的测试类
ContactInfoParser联系人信息的解析器(从系统通信录中读取联系人信息)
AddBlackNumberActivity添加黑名单界面
ContactSelectActivity显示系统联系人界面
SecurityPhoneActivity显示黑名单信息界面
黑名单数据库使用SQLite存储黑名单信息,BlackNumberOpenHelper创建了数据库blackNumber.db和表格blacknumber。
因为需要保存黑名单中联系人信息,所以定义一个黑名单联系人的实体类BlackContactInfo。
操作黑名单数据库的工具类BlackNumberDao,对黑名单中数据进行增删查。
模块方法测试:对每一个新模块或者方法可以进行测试来避免bug。
此处对数据库工具类中操作黑名单数据的方法测试(黑名单数据需要填充到主界面中,为了避免后期出现错误导致调试困难)。
Android系统自带了测试框架JUnit,使用该框架对数据库工具类中的方法进行测试,
首先要在清单文件中配置相应信息<instrumentation>及在<application>标签下添加<uses-library android:name="android.test.runner"/>,
然后写测试文件(TestBlackNumberDao继承自AndroidTestCase,并对数据库中增删查进行测试。需要注意:
在JUnit测试框架中,测试方法的异常必须抛出,不能使用try-catch,否则测试框架捕获不到异常),
运行时点击Android JUnit Test,如果测试通过则会在JUnit窗口中显示绿色条。
通讯卫士主界面布局activity_securityphone.xml中黑名单列表ListView的Item布局是item_list_blackcontact.xml。
主界面逻辑代码SecurityPhoneActivity包括显示黑名单信息,点击删除将当前黑名单从数据库中删除。
主界面通过ListView显示黑名单列表时,使用的数据适配器BlackContactAdapter。
添加黑名单逻辑,包括手动输入和从联系人列表中选择。
联系人列表的开发同上一章内容,这一部分包括:ContactInfo联系人信息的实体类、ContactInfoParser联系人信息的解析器(从系统通信录中读取联系人信息 )、ContactAdapter用于填充手机联系人信息的数据适配器、ContactSelectActivity显示系统联系人界面。
当电话和短信到来时都会产生广播,因此可以利用广播接收者将广播终止,实现拦截。
拦截短信InterceptSmsReciever,在广播中获取到电话号码以及短信内容,查询该号码是否在黑名单中(需在清单文件中注册并设置优先级最高)。
拦截电话InterceptCallReciever,需要自动挂断电话并且不在界面上显示该记录,由于Android系统的安全性而隐藏了挂断电话的服务方法,
因此该操作只能通过反射获取底层服务(使用了AIDL进程间通信)。具体参考代码和以下注释说明:
/**
* 挂断黑名单的呼入电话,需要复制两个aidl。
* 首先通过反射 获取到ServiceManager字节码,然后通过该字节码获取getService()方法,
* 该方法接收一个String类型的参数,然后通过invoke()执行getService()方法。
* 由于getService()方法是静态的,因此invoke()的第一个参数可以为null,第二个参数是TELEPHONY_SERVICE。
* 由于getService()方法的返回值是一个IBinder对象(远程服务的代理类),因此需要使用AIDL的规则将其转化为接口类型,
* 由于操作是挂断电话,因此需要使用与电话相关的ITelephony.aidl,然后调用接口中的endCall()方法将电话挂断即可。
* 还要注意的是:
* 与电话相关的操作一般都使用TelephonyManager类,但是由于挂断电话的方法在ITelephony接口中,而这个接口是隐藏的(@hide),
在开发时看不到,因此需要使用ITelephony.aidl。
* 在使用ITelephony.aidl时,需要创建一个与其包名一致的包com.android.internal.telephony,然后把系统的ITelephony.aidl文件复制进来。
* 同时,由于ITelephony.aidl接口关联了NeighboringCellInfo.aidl,也需要一起复制进来。
但是注意,NeighboringCellInfo.aidl所在的包名是android.telephony,
* 因此还需要新建一个android.telephony包,然后把NeighboringCellInfo.aidl放到该包中。
*/
同时,该广播也要注册,并添加相应权限(CALL_PHONE,READ_CALL_LOG,WRITE_CALL_LOG)。
【第四章】
AppManagerAdapter主界面的数据适配器
AppInfo应用程序的实体类
AppInfoParser获取手机中的所有应用程序
DensityUtil单位dip与px互转的工具类
EngineUtils启动、卸载、分享、设置应用的业务工具类
AppManagerActivity展示软件管家界面,包括应用列表、手机剩余内存、SD卡剩余内存
软件管家界面中,ListView中的Item布局item_appmanager_list.xml(在选中某个应用程序时,程序下方会浮出小条目,提供启动卸载分享设置四个选项)。
在获取应用程序列表之前首先需要创建一个实体类AppInfo,用于存储应用程序的相关信息。
在布局文件中设置单位时可以使用px或dip,通常情况下会使用dip,这样可以保证在不同分辨率机器上布局的一致。
但是代码中,有很多控件中都只提供设置px的方法,例如AppManagerAdapter文件中动态设置TextView的setPadding()方法并没有提供设置dip的方法, 因此需要转换后再调用。
在业务工具类EngineUtils中,当用户选中某个条目时,隐藏在下面的线性布局就会弹出(启动、卸载、分享、设置四个选项)。
软件管家界面中,AppManagerActivity将手机内存信息及应用程序列表等数据加载到界面中显示(本类是重点,逻辑比较多)。
只要使用了ListView控件,必须创建数据适配器AppManagerAdapter,用于填充数据到界面中。
【第五章】
手机中的病毒都存在于apk文件中,只要将病毒所在的apk文件删除即可将其清理掉。
手机杀毒模块的核心代码就是查询程序的MD5码是否在病毒库中,如果在数据库中那么该程序就是病毒,不在就不是病毒。
MD5Count.exe是一种获取MD5码的工具。每个程序的MD5码都是唯一的。如果两个文件内容是相同的,即使文件名字不同,其MD5码也是一样的。
ScanVirusAdapter杀毒界面ListView的适配器
AntiVirusDao病毒数据库的操作类
ScanAppInfo应用程序的实体类
MD5Utils获取文件MD5码的工具类
VirusScanActivity手机杀毒模块的主界面逻辑,主要包含上次查杀时间与跳转按钮
VirusScanSpeedActivity病毒查杀进度界面逻辑
这里使用较完整的第三方病毒数据库antivirus.db,该文件在assets目录下,使用SQLite Expert可以打开该数据库。
病毒查杀界面activity_virusscan.xml,逻辑代码VirusScanActivity实现在初始化时将病毒数据库从assets目录下复制到工程目录中,
并通过sharedpreferences得到上次扫描的时间显示在界面上。
在查杀进度界面中使用了ListView控件,需要定义一个Item布局item_list_applock.xml用于展示应用程序信息。
VirusScanSpeedActivity实现显示查杀进度的百分比、正在扫描的程序、显示已扫描程序的列表。
【第六章】
CacheCleanAdapter扫描缓存界面的ListView适配器
CacheInfo用于存储缓存信息的实体类
CacheClearListActivity扫描缓存程序界面的逻辑代码
CleanCacheActivity缓存清理界面的逻辑
缓存信息是通过AIDL接口调用系统底层方法获取的。
扫描缓存界面布局activity_cacheclearlist.xml中的@anim/broom_animation是一个帧动画,类似GIF图片,通过一系列图片依次显示来模拟动画。
该界面下的ListView的缓存清理Item布局item_cacheclean_list.xml。
扫描缓存的逻辑是获取每个应用程序的缓存大小、将所有缓存累加在一起展示在界面上、展示扫描后的应用列表。
在获取缓存时,IPackageStatsObserver是一个远程服务的AIDL接口,获取缓存时需要使用这个接口,因此需要创建一个android.content.pm包,
将IPackageStatsObserver.aidl复制到这个包下。由于该接口还依赖于PackageStats.aidl接口,也需要复制到该包下。
同时需要在清单文件中注册权限GET_PACKAGE_SIZE。
在清理缓存时,需要在界面上不停地更新数据,显示清理了多少缓存;清理完成时,动态切换布局,显示完成界面。
在方法cleanAll()中,清除全部 缓存,是利用Android系统的一个漏洞:freeStorageAndNotify
//通过反射的形式获取到freeStorageAndNotify(long freeStorageSize,IPackageDataObserver observer)方法,
//第一个参数表示要释放的缓存大小,第二个是远程服务接口。漏洞在于第一个参数,
//当freeStorageSize设置的值大于手机本身的内存空间时,可以清除掉所有缓存。
由于用到IPackageDataObserver.aidl接口,需要将其复制到android.content.pm包中。同时需要在清单文件中注册权限CLEAR_APP_CACHE。
【第七章】
ProcessManagerAdapter进程管理的数据适配器
TaskInfo进程信息的实体类
AutoKillProcessService锁屏清理进程的服务类
SystemInfoUtils获取手机内存信息的工具类
TaskInfoParser进程信息的解析器
ProcessManagerActivity进程管理界面逻辑
ProcessManagerSettingActivity进程设置界面逻辑(是否显示系统进程、锁屏时是否清理进程)
进程管理界面布局activity_processmanager.xml,界面中的ListView的Item布局item_processmanager_list.xml展示条目数据。
将所有正在运行的进程分为用户进程和系统进程展示,当选中某些进程时,点击清理即可。
用于获取系统信息SystemInfoUtils工具类。
用于获取正在运行的进程TaskInfoParser工具类。
在清理进程时,ProcessManagerSettingActivity可以设置为在手机睡眠时自动清理进程(利用服务和广播接收者在锁屏时自动清理进程)。
当设置界面中开启锁屏清理时,就会打开进程清理服务,在该服务中注册了监听屏幕锁屏的广播接收者,当监听到锁屏时会自动清理进程。
AutoKillProcessService服务在清单文件中注册中,persistent="true"可以保证该应用程序所在进程不会被LMK机制(最小内存阀值)杀死。
【第八章】
TrafficDao对流量数据库进行修改查询增加的工具类
TrafficOpenHelper保存流量信息的数据库
BootCompleteReciever监听开机启动的广播接收者,当手机开机时打开服务
TrafficMonitoringService获取流量具体数据的服务
SystemInfoUtils判断服务是否开启的工具类
OperatorSetActivity信息设置界面(第一个界面)逻辑
TrafficMonitoringActivity流量监控界面(第二个界面)逻辑
OperatorSetActivity运营商设置界面将选择的手机使用的运营商存储到SharedPreferences对象中,点击确定按钮后进入流量监控界面。
存储每日流量使用SQLite数据库,由于向运营商发送短信只能获取本月使用总流量和本月已用流量,无法得到每日使用流量,需要实时计算,
并根据日期将使用的流量存储到数据库中,不断更新数据库。TrafficOpenHelper创建数据库traffic.db。TrafficDao实现对数据库操作。
流量监控界面,实现显示当天、本月流量。点击校正流量时,会自动发送(代码以联通3G为例)一条短信进行获取当前流量使用情况并显示。
开启一个服务,实时统计已使用的流量数据,获取应用程序的实时流量信息,并通过SharedPreferences对象进行存储。
另外,为了实现在手机刚开机时开启流量监控服务,利用开机广播监听并开启该服务。
【第九章】
AppLockAdapter未加锁和已加锁界面ListView控件的适配器
AppLockDao程序锁数据库的操作逻辑
NumBelongtoDao查询号码归属地的数据库逻辑
AppLockOpenHelper创建程序锁数据库
AppInfo应用程序的实体类
SmsInfo短信的实体类
AppLockFragment已加锁应用的界面逻辑
AppUnLockFragment未加锁应用的界面逻辑
AppLockService程序锁服务(判断应用是否已加锁,如果应用加锁则打开应用时显示输入密码框)
AppInfoParser获取手机中所有的应用程序的工具类
Crypto加密和解密base64编码后的内容,用作程序锁密码
DensityUtil工具类dp与px互转换
SmsBackUpUtils短信备份的工具类
SmsReducitionUtils短信还原的工具类
UIUtils封装Toast的工具类
AdvancedToolsView自定义控件,封装高级工具模块的主页面
MyCircleProgress自定义控件(带进度的圆形按钮),用于显示短信备份与还原时的进度
AdvancedToolsActivity高级工具主界面逻辑
AppLockActivity程序锁界面逻辑
EnterPswActivity输入密码界面逻辑
NumBelongtoActivity归属地查询界面逻辑
SMSBackupActivity短信备份界面逻辑
SMSReducitionActivity短信还原界面逻辑
由于高级工具界面的四个条目布局类似,因此条目布局使用自定义组合控件来实现,自定义控件开发方法如下:
1.创建条目布局ui_advancedtools_view.xml,由三部分组成(左边图标,中间名称,右边箭头)
2.自定义属性,在res/values目录下建立attrs.xml文件,在该文件中对控件添加自定义属性(用于在自定义控件中引用)。
在自定义一个控件时,如果需要定义一些新的属性,就会用到attrs.xml文件。该文件中定义的是类的属性,
这些属性为了能在XML文件中被引用到,换句话说就是指定类中变量的值,这些属性会在类的构造方法中用到。
3.创建自定义控件类AdvancedToolsView,该类需要继承系统布局或者控件,并使用带AttributeSet参数的类的构造方法,
在构造方法中将自定义控件类中变量与attrs.xml中的属性连接起来。
4.布局中使用自定义控件,在布局中引用已经创建好的自定义控件activity_advancetools.xml。
在使用自定义控件时,每个控件的开始节点和结束节点都为自定义控件类的全路径,
其中custom_android:desc属性和android:src属性是自定义的,分别用于显示描述文字及功能图标。要注意,
在使用自定义控件时必须使用XML命名空xmlns:custom_android="http://schemas.android.com/apk/res/cn.itcast.mobliesafe"将
自定义控件引入到布局。
至此,自定义控件已经完成。要使用自定义控件,需要在具体类中创建该自定义控件类对象,然后对控件中属性进行操作。
主界面逻辑AdvancedToolsActivity,设置每一个条目的点击事件,跳转到相应界面,该类中需要创建上面的自定义控件对象。
查询号码归属地,用到一个第三方数据库address.db(在assets目录下),该库存储了大量的归属地信息,包含两个表data1和data2,
data1中RecNo自增主键,id存储号码前7位,outkey是外键与data2表中的id关联;data2中id为自增主键,location归属地,area座机区号。
查询时,根据号码截取前7位找到data1对应的outkey值,然后将该值作为data2中的id查询对应的location值;如果是座机号码直接查询data2。
查询时,需要创建数据库操作类NumBelongtoDao。归属地查询逻辑NumBelongtoActivity。
要把短信备份在本地有很多方法,这里使用XML的形式保存短信内容。
Android手机中的短信是在data/data/com.android.provider.telephony应用的database目录下mmssms.db数据库中。
用SQLiteExpert工具打开该数据库的sms表,可以看到短信的内容。该表中,只需关心几项数据即可:
address短信地址,type短信类型(1代表接收,2发送),date短信时间,body短信内容。只需将这几项数据以节点形式存入XML文件即可。
在类SmsBackUpUtils获取短信内容时,不直接操作数据库,而是使用ContentResolver得到短信数据库中的这几项数据。
使用base64对象将短信内容加密解密Crypto。
短信备份界面使用了自定义控件(界面中间有一个红色按钮,点击之后开始备份短信,并显示备份进度):
由于要在该控件中使用自定义的属性,显示备份进度和颜色,因此先要在attrs.xml中创建对应的变量,根节点是MyCircleProgress,
然后创建控件类MyCircleProgress,接着在布局activity_smsbackup.xml中引用该控件,
最后在短信备份逻辑界面SMSBackupActivity上创建该控件对象来使用。
相对应的,在还原手机中删除的短信时,使用XML解析器将已备份的短信还原。
短信还原界面与短信备份界面唯一不同的地方就是中间按钮的文字。
短信还原逻辑SMSReducitionActivity控制短信的还原、取消、还原进度。
程序锁功能是将加锁的程序信息存入数据库,当程序锁服务打开时,后台会运行一个服务检查当前打开的程序,打开加锁程序时会弹出输入密码界面。
首先创建用于存储加锁应用的数据库AppLockOpenHelper及数据库操作类AppLockDao。获取手机上的所有应用程序AppInfoParser。
为了方便对应用进行操作,定义应用程序的实体类AppInfo。
程序锁界面包含两个Fragment(分别展示已加锁和未加锁界面),并使用ViewPager控件使这两个界面可以滑动切换。
程序锁逻辑AppLockActivity是控制两个Fragment的切换(对应用的加解锁操作都在Fragment中进行)。
未加锁界面fragment_appunlock.xml和已加锁fragment_applock.xml界面;未加锁逻辑AppUnLockFragment和已加锁逻辑AppLockFragment。
未加锁和已加锁界面ListView使用的数据适配器都是AppLockAdapter,它接收一个List集合,不同界面调用Adapter时传输的数据集合不同。
程序锁服务AppLockService通过获取任务栈的信息来判断当前开启的是哪个应用,是否弹出密码锁界面。
密码锁界面activity_enterpsw.xml,密码锁逻辑EnterPswActivity。
【第十章】
SystemInfoUtils判断程序锁服务是否运行
SettingView自定义控件类(设置中心的条目)
SettingsActivity设置中心界面逻辑
自定义控件布局ui_settings_view.xml。
自定义控件属性(在attrs.xml中的SettingView节点中)。
实现自定义控件类SettingView。
设置中心界面在布局activity_settings.xml中引入两个自定义组合控件SettingView。
设置中心逻辑SettingsActivity,完成黑名单及程序锁的设置。
-
Android项目:手机安全卫士(3)—— 主界面布局
2016-02-27 21:57:15Android项目:手机安全卫士(3)—— 主界面布局1 总纲前面实现了“手机安全卫士”的闪屏界面与版本检测升级问题,接下来的任务就是实现主界面了,这个相对简单,因为没有涉及到具体的功能开发,本文主要内容:九宫...Android项目:手机安全卫士(3)—— 主界面布局
1 总纲
前面实现了“手机安全卫士”的闪屏界面与版本检测升级问题,接下来的任务就是实现主界面了,这个相对简单,因为没有涉及到具体的功能开发,本文主要内容:九宫格显示功能列表,跑马灯提示效果,自定义样式几个方面,关于项目相关文章,请访问:
项目源码地址(实时更新):https://github.com/xwdoor/MobileSafe
2 九宫格的方式显示主界面
首先创建主界面对应的 Activity:HomeActivity,以及相应的布局文件,这不必多说了。主界面主要显示 9 个功能:”手机防盗”, “通讯卫士”, “软件管理”, “进程管理”, “流量统计”, “手机杀毒”, “缓存清理”, “高级工具”, “设置中心”,呈现 9 宫格的形式,如图所示:
布局文件 activity_home.xml 的内容如代码所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".activity.HomeActivity" android:background="@android:color/white" android:orientation="vertical"> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="50dp" android:text="功能列表" android:gravity="center" android:textSize="22sp" android:background="@android:color/holo_blue_light" android:textColor="@android:color/black"/> <GridView android:id="@+id/gv_fuction" android:layout_width="match_parent" android:layout_height="match_parent" android:verticalSpacing="15dp" android:numColumns="3"/> </LinearLayout>
主界面,最上方是一个 TextView ,作为标题使用,下方是一个 GridView,用来显示功能列表,并设置列数为 3,当然,作为与 ListView 同一级别的控件,怎么能少的了它的搭档 adapter(适配器)呢,当然,在此之前,需要先创建一个布局文件(item_home_adapter.xml),用于显示 GridView 中的每一个 Item,布局文件如下所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical"> <ImageView android:id="@+id/iv_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/home_apps" /> <TextView android:id="@+id/tv_func_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="3dp" android:text="手机防盗" android:textColor="@android:color/black" android:textSize="18sp" /> </LinearLayout>
然后,就可以创建我们的适配器了,创建一个 adapter,继承自 BaseAdapter,代码如下:
/** * 用于主页面九宫格的列表展示所用的adapter * * Created by XWdoor on 2016/2/26 026 14:31. * 博客:http://blog.csdn.net/xwdoor */ public class HomeAdapter extends BaseAdapter { private final Context mContext; //功能列表的文字描述项 private String[] mStrItems; //功能列表的图片展示项 private int[] mImgIds; public HomeAdapter(Context context,String[] mStrItems, int[] mImgIds) { this.mContext = context; this.mStrItems = mStrItems; this.mImgIds = mImgIds; } //返回功能列表项目数量 @Override public int getCount() { return mStrItems.length; } //获取某功能项目 @Override public Object getItem(int position) { return null; } //获取某功能Id @Override public long getItemId(int position) { return position; } //显示相应功能的视图 @Override public View getView(int position, View convertView, ViewGroup parent) { //生成视图 View view = View.inflate(mContext, R.layout.item_home_adapter,null); //获取视图中的图片展示项的控件 ImageView ivIcon = (ImageView) view.findViewById(R.id.iv_icon); //获取文字描述项的控件 TextView tvFuncName = (TextView) view.findViewById(R.id.tv_func_name); //设置文字和图片 ivIcon.setImageResource(mImgIds[position]); tvFuncName.setText(mStrItems[position]); return view; } }
好了,准备就绪,接下来就是给 GridView 设置适配器了,老规矩,代码伺候:
private int[] mImgIds; private String[] mGvItems; /** * Activity启动方法,方便团队开发,参数信息一目了然 */ public static void startAct(Context context) { Intent intent = new Intent(context, HomeActivity.class); context.startActivity(intent); } @Override public void initVariables() { mGvItems = new String[]{"手机防盗", "通讯卫士", "软件管理", "进程管理", "流量统计", "手机杀毒", "缓存清理", "高级工具", "设置中心"}; mImgIds = new int[]{R.drawable.home_safe, R.drawable.home_callmsgsafe, R.drawable.home_apps, R.drawable.home_taskmanager, R.drawable.home_netmanager, R.drawable.home_trojan, R.drawable.home_sysoptimize, R.drawable.home_tools, R.drawable.home_settings}; } @Override protected void initViews(Bundle savedInstanceState) { setContentView(R.layout.activity_home); GridView gvFunction = (GridView) findViewById(R.id.gv_fuction); HomeAdapter adapter = new HomeAdapter(this,mGvItems,mImgIds); gvFunction.setAdapter(adapter); }
3 跑马灯提示效果
所谓的跑马灯,相信做过嵌入式开发的都知道,就是有一排 Led 灯,一个一个的顺序点亮。现在要做一个文字提示,有自动播放的效果,请原谅我拙劣的用词。好了,让我们来实现这个效果,先给出代码:
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" android:focusable="true" android:focusableInTouchMode="true" android:ellipsize="marquee" android:textColor="#000" android:textSize="18sp" android:text="手机安全卫士,作者:xwdoor,博客:http://blog.csdn.net/xwdoor" android:layout_marginBottom="6dp"/>
对,就一个 TextView 就能搞定,关键点在于几个属性:
- ellipsize 属性:值必须是 marquee,翻译过来,就是跑马灯
- focusable 属性:是否获取焦点,设置为 true,表示获取焦点,因为只有在获取焦点的情况下,跑马灯效果才能生效
- focusableInTouchMode 属性:设置为 true,表示在触摸的情况下,也是获取焦点,原因同上
4 自定义样式(Style)
主界面中的“功能列表”标题栏,在其他功能界面中也会用到,只是显示文字不同而已,所以我们就将它的样式提出来,放到 style.xml 文件中,代码如下所示:
<style name="TitleBar"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">50dp</item> <item name="android:gravity">center</item> <item name="android:textSize">22sp</item> <item name="android:background">@android:color/holo_blue_light</item> <item name="android:textColor">@android:color/black</item> </style>
然后在主界面中,修改 TextView 的样式,如下所示:
<TextView android:id="@+id/tv_title" android:text="功能列表" style="@style/TitleBar"/>
5 总结
好了,主界面的开发到这里就完成了,本文重点在于 adapter 的使用,和自定义 style 的方法。本来周五就可以更新的,但是到下班时间的时候,还留了一点尾巴,结果到了周六才有时间补上,关于项目相关文章,请访问:
项目源码地址(实时更新):https://github.com/xwdoor/MobileSafe
-
手机怎么进入安全模式
2021-06-09 02:44:42不仅Windows系统有安全模式,Android手机在4.0版本之后也加入了安全模式。与Windows的安全模式类似,Android的安全模式是系统屏蔽掉了所有非系统自带程序,仅启动原系统内自带程序。在这种模式下,手机将以最安全的... -
关注手机病毒:重点手机安全事件盘点
2010-09-05 08:37:00转载:http://www.netqin.com/security/securityinfo.jsp?id=3012&type=2重点手机安全事件盘点时间:2010-08-10 随着智能手机的普及和无线互联网技术的飞速发展,人们的生活、工作几乎已经离不开手机了。... -
华为手机怎么进入和退出安全模式?华为手机进入安全模式按哪个键
2021-08-04 01:06:45如果您不小心在非正规渠道安装的软件有病毒或者木马、或者与手机不兼容等状况,很容易造成手机隐患,这个时候,手机的“安全模式”就非常重要了,可以保护手机里面的数据、图片等保存下来,但是,很多人不知道手机... -
手机出现安全模式怎么取消
2021-06-07 11:15:26手机安全模式,通常是因为我们错手按错了按钮进入的,当然不排除一些用户需要通过进入手机安全模式来解决正常模式下无法处理的问题。如果遇到第一种情况,请不必担心。接下来,小编就来给大家介绍一下手机出现安全... -
基于android的手机安全卫士的实现心得一
2018-04-09 16:15:46毕设是做一个基于android的手机安全助手,因为也是android新手,边学边做,记录一下做个过程和学习心得,以便写毕业论文也方便以后复习。希望能通过这个项目,基本掌握android开发,不至于虚度光阴。首先是需求分析... -
android手机如何接收google安全码
2022-03-16 10:41:51今天换浏览器登陆firebase,登陆谷歌账号的时候,要求输入安全码,获取了两次,手机都没有任何反应。解决办法如下: 1、首先确认在手机已经安装谷歌框架,谷歌服务。然后打开了梯子。 2、此时在手机设置中找到... -
安卓手机进入安全模式之后怎么解除
2021-06-09 06:57:47现在的智能手机是不会自动进入到安全模式中的,但是如果在操作的过程中不小心导致安卓手机进入到安全模式了的话,也并不是代表我们的手机出现了问题,遇到这种情况时我们只需要解除手机的安全模式就可以了,不过还是... -
腾讯手机安全验证失败怎么回事
2020-12-20 04:06:58设置了QQ登录保护后,在QQ客户端登录QQ时,需要您在弹出的统一安全验证窗口中验证密保,如QQ安全中心手机版,成功完成验证后即可登录QQ;若您需要取消QQ登录保护,请您进入QQ安全中心网站,再点击【关闭保护】链接,... -
智能手机安全:黑客是如何秘密控制你手机号码
2019-04-20 00:12:19信息化时代,现在基本上是每人都拥有一台手机,现实中,可能你会收到某个亲戚的短信或电话,来电是显示“亲人”名字,然而你仔细看看号码,这并不是你亲友手机号码,这是怎么回事呢?近日,国内知名黑客安全组织东方... -
Android手机安全之我见
2014-08-24 12:15:41众所周知,iphone手机带来了手机时代的变革,而Android又掀起了手机发展的一个浪潮,然而手机中又有多少鲜为人知的秘密,又有多少人真正了解手机安全方面的知识呢?新的事物都具有2面型,带来好的同时也会有不好的... -
Android项目:手机安全卫士(7)—— 手机防盗功能
2016-03-08 15:13:08Android项目:手机安全卫士(7)—— 手机防盗功能1 介绍前面已经将手机防盗的界面、业务代码逻辑完成了,现在就是最后的功能实现了,手机防盗主要有这么几个功能: 短信:发送警报短信,接收命令短信 播放报警音乐 ... -
安全测试(五)Android APK软件安全 APP应用安全 手机软件安全 apk安全 apk反编译 应用日志窃取 apk漏洞 ...
2021-12-26 11:46:05安全测试(五)APP应用安全 手机软件安全 Android APK软件安全 apk安全 apk反编译 应用日志窃取 apk漏洞 应用软件本身功能漏洞 高危权限泄密风险等 移动应用常规安全讲解Android移动端安全 1、APP 接口安全 未加密 ... -
网秦发布2012Q3全球手机安全报告
2012-11-06 22:52:53日前,移动安全服务厂商网秦发布了第三季度手机安全报告,相对于2012年网秦上半年的安全报告,Q3报告呈现出几个明显新趋势:第三季度感染量超上半年总和、山东省手机安全危险系数升至全国第三、二维码感染突然流行、... -
手机安全卫士开发系列(1)——功能列表
2013-08-13 22:29:47根据sim的变更,判断手机是否被盗,根据协议发送手机中sim卡的信息,和当前手机的位置(经纬度),给安全号码. 快速进入手机防盗 可以远程发送指令,锁屏,工厂重置手机 md5加密 2、通讯卫士: 来电归属地显示,来电黑... -
Android项目:手机安全卫士(13)—— 通讯卫士之电话拦截与挂断
2016-03-17 17:19:22Android项目:手机安全卫士(13)—— 通讯卫士之电话拦截与挂断1 介绍上一节我们讲了黑名单数据的存储等 CRUD 操作,今天,就到了它们发挥作用的时候了,通讯卫士功法终于要练成了。关于项目相关文章,请访问: ... -
uniapp全面屏手机设置底部安全区颜色
2020-07-21 11:19:14这个情况是在全面屏手机下产生的,在这之前先要有个概念,叫安全区!上张图大家就能大致就能知道是个啥! 没错就是这样的! 我们写代码看看! <template> <view class="box"> <view>11</... -
Android项目:手机安全卫士(8)—— 管理员权限
2016-03-09 11:58:29Android项目:手机安全卫士(8)—— 管理员权限1 介绍关于手机防盗的功能,前面我们已经完成了一半,今天将要完成另一半,我们先来看看整体的功能描述:现在,我们还差两个功能: 远程删除数据 远程锁屏 需要说明... -
2021年隐私和安全性最佳的8款Linux手机
2021-03-06 19:32:31许多人担心手机的安全性。尽管这似乎是常识,但许多人没有意识到,当能够使用Linux安全电话来保护自己的在线隐私时,利用技术便是如此容易。 最佳Linux保密电话 为旅途做好准备,系好安全带。为了保护您的隐私. -
手机移动APP安全测试方法、工具和一些容易产生安全问题
2017-06-14 15:51:05“用户手机安装APP以后,企业即埋下一颗种子,可持续与用户保持联系。” 种子是种下了,可要是它本身就是个[特洛伊木马]呢?试想你在某某知名APP平台下载安装一款知名APP,深更半夜突然响起了[THE PHANTOM OF THE ... -
手机安全修改IMEI的方法
2015-12-22 10:05:34如题所示,为啥说安全修改IMEI,这也是我们经过长期尝试之后的一个经验,分享给大家,之前我们测试过许多工具,能修改imei的教程,大多数需要修改系统文件,要么需要重启手机才能生效,但试了之后总是感觉不方便,一... -
-
Android项目实战--手机卫士完整源码part1
2014-01-14 14:27:33Android项目实战--手机卫士完整源码part1 -
2016安卓手机安全隐私之对比与分析
2016-08-17 13:25:56而在手机上,这种情况得到了更大的体现,假如你的朋友可以自由的打开你的手机,去看你手机中的照片和视频或者查看手机中的重要文件,你会不会觉得有些尴尬或不舒服?如果遇到别有用心的人,那银行卡密码、支付宝密码... -
手机安全随手记
2013-08-18 15:41:34BYOD 的流行,可以把传统软件的智慧安全设计原则应有到手机设备上------SIMPLE S: system 系统化 I:Inciddent oriented 面向事件 M:Management 高效管理 P:Professionalism 降低专业化 L:Labor Cost 减少... -
解决了:androi 有些手机(vivo/华为)出现了《安全风险/发现病毒》提现
2020-04-16 15:08:03百度查了半天找不到原因。。。最后我阅读了这文章(360常见风险) 操就这一行《关闭备份模式 allowBackup=false》感兴趣的话点这里 #解决方案: gradle.properties中添加: allowBackup=false ...