Android学习笔记_64_手机安全卫士知识点归纳(4) 流量统计 Log管理 混淆打包 加入广告 自动化测试 bug管理
android 其实就是linux 上面包装了一个java的框架. linux 系统下 所有的硬件,设备(网卡,显卡等) 都是以文件的方式来表示. 文件里面包含的有很多设备的状态信息. 所有的流量相关的信息 都是记录在文件上的. 注意:模拟器 是不支持流量查询的. adb devices列出所以设置
然后通过 :adb -s 3835197E43F100EC shell 可以进入指定的设备. proc 系统的状态信息 adb -s 3835197E43F100EC shell 所以,那些流量都是读取的这些文件的内容. 在uid_stat 的目录下有一堆文件夹
名字是以应用程序的uid作为名字的.
内容就是这个应用程序 上传和下载产生的流量信息 tcp_rcv 采用tcp协议 接收到的数据的大小
tcp receive tcp_snd 采用tcp协议 发送的数据的byte大小
snd send tcp_rcv_pkt 采用tcp协议 接收到的包的数目 本来我们应该去遍历系统的这些文件,但是谷歌工程师用C已经
封装好了. 流量信息 : 上一次开机到现在这个程序产生的流量 . 世面安全软件:
定义一个数据库
packname uid appname lasttrafficdata 手机在关机的时候 是会有一个关机的广播事件ACTION_SHUTDOWN
,然后在这个广播里面会去把这次开机期间用的流量记录下来。 下一次开机的时候.
再去展示这个流量统计的界面。
后台每隔五分钟去更新一下数据库,很显然它也是非常费电的。 流量矫正.
其实大体的流量数据.
参考 禁止某一款应用上网.
root权限
原理 :使用了一个linux系统下的防火墙 iptables iptables_armv5 allow uid 10035
disallow uid 10074 iptables_armv5 需要有linux的一些核心库才运行
模拟器不支持iptables miui cymod 网上有一个开源的项目
droidwall (防火墙,)
google code. 屏幕适配:
尽量使用相对布局和线性布局.
不推荐使用绝对布局.
图片,控件的大小,最好都是用dip的单位作为控件的大小.
dip==dp
文件的大小使用sp hvga 48*48px
qvga 32*32px
wvga 60*60px 代码里面有hard code的大小
根据不同的分辨率做不同的适配. /********************************************************/
可扩展的ListView.
把这个数据库放在资产目录上,在资产目录下的资源不会生成相应的引用.
1、流量统计:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Get the total number of bytes received through the mobile interface.
/*long mobilerx = TrafficStats.getMobileRxBytes();
//Get the total number of bytes transmitted(发送) through the mobile interface.
long mobiletx = TrafficStats.getMobileTxBytes();
long mobiletotal = mobilerx + mobiletx;
StringBuilder sb = new StringBuilder();
sb.append("2g/3g总流量"+TextFormater.getDataSize(mobiletotal));
sb.append("\n");
//Get the total number of bytes received through all network interfaces.(总流量 ,包含WIFI 和手机上网)
long totalrx = TrafficStats.getTotalRxBytes();
long totaltx = TrafficStats.getTotalTxBytes(); long total = totalrx + totaltx; //WIFI可以用总流量减去用手机上网的流量
long wifitotal = total - mobiletotal;
sb.append("wifi总流量"+TextFormater.getDataSize(wifitotal));
sb.append("\n"); TextView tView = new TextView(this);
tView.setText(sb.toString());
setContentView(tView);*/ //我们应该得到的是每一个应用程序所用的流量 // 在手机里面得到所有的产生图标的应用程序
PackageManager pm = getPackageManager();
Intent intent = new Intent();
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resolveInfos) {
String appname = resolveInfo.loadLabel(pm).toString();
System.out.println("appname:"+appname);
Drawable icon = resolveInfo.loadIcon(pm);
System.out.println("icon:"+icon.getCurrent());
String packageName = resolveInfo.activityInfo.packageName;
try {
PackageInfo packageInfo = pm.getPackageInfo(packageName, 0);
int uid = packageInfo.applicationInfo.uid;
System.out.println("下载流量"+ TextFormater.getDataSize( TrafficStats.getUidRxBytes(uid)));
System.out.println("上传流量"+ TextFormater.getDataSize( TrafficStats.getUidTxBytes(uid)));
} catch (NameNotFoundException e) {
e.printStackTrace();
}
System.out.println("------");
} }
2、抽屉效果:
<!--抽屉最重要的两个属性:
android:handle="@+id/handle"
android:content="@+id/content"
一个是把手,另外一个是拖动把手显示的内容. -->
<SlidingDrawer
android:layout_width="match_parent"
android:layout_height="match_parent"
android:handle="@+id/handle"
android:content="@+id/content"
android:orientation="horizontal"
>
<ImageView
android:id="@id/handle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/notification"
/>
<ListView
android:id="@id/content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
</ListView> </SlidingDrawer>
3、手机杀毒 log管理 混淆打包 有米广告 自动化测试 robotium mantis bug管理
杀毒软件的原理: 1.基于签名的特征码的扫描(hash码-md5特征码的扫描)
有一个病毒数据库, 保存的有 病毒对应的hash. 特征:只能查杀已知的病毒,不能查杀未知的病毒. 瑞星 8个小时
卡巴斯基 6个小时
诺顿 xx小时 所以它们之间的区别就在杀毒引擎上
杀毒引擎: 获取hash 查询数据库的算法.
病毒库上: 千万条数据 联网->实时更新病毒数据库 服务器集群: 蜜罐.->病毒分析工程师. 2.主动防御:
监控敏感api ,
更改浏览器主页.
注册开机启动的行为
应用程序的内存注入 3.启发式扫描:
根据程序敏感的api 提示风险代码 4.云查杀(即服务器端有一个特别大的数据库,在本地查询完以后
把那些敏感的hash值上传到服务器去分析) 人工智能:一套复杂的if语句 if t t t 模糊逻辑 1万个左右 anroid
几千种病毒 1.窃取通讯费用 2.切用用户隐私 后台手机用户手机的log 进行一些非法. 3.纯恶作剧 4.偷取流量的软件
大点评网 云中书城 企业会去推广软件 2块钱推广费用. 30万 10块钱 300万 android手机杀毒软件 特征码的扫描 : 360隐私卫士: 基于规则进行主动防御. 特征api的拦截, root权限. 招商银行开发android客户端. 混淆之后,会保留四大组件,因为它都是在要配置文件里面配置的。
所以360会把这四大组件里面很多方法抽取到业务方法里面去进行
反编译。 在project.properties里面加上
proguard.config=proguard.cfg 混淆的原理-> 类名和方法名的映射转化
ContentProvider.getuserinfo.getchineselikemeetmale();
a.b.c(); native -> 类名_方法名 -optimizationpasses 5 设置混淆的压缩比率 0 ~ 7
-dontusemixedcaseclassnames -> Aa aA
-dontskipnonpubliclibraryclasses ->如果应用程序引入的有jar包,并且想混淆jar包里面的class
-dontpreverify
-verbose ->混淆后生产映射文件 map 类名->转化后类名的映射 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#混淆采用的算法. -keep public class * extends android.app.Activity 所有activity的子类不要去混淆
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * {
native <methods>; 所有native的方法不能去混淆.
} -keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
//某些构造方法
} -keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
} -keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
} -keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
} -keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
} 手电筒:
20行
1.把手机亮度调到最亮.
2.把界面的颜色调成白色. iphone
20万-> 1000pv 2毛~3毛
20美分~30分 200000*5/1000*1 = 1000元/天 findmyphone 吃裙子.
30万下载量. admod google
国外信用卡.
paypal 35美金. 万普广告 有米 十几家广告平台.
支持银联卡 聚合广告平台: 软件测试 根据测试的粒度不同: testcase: 方法测试 功能测试(若干个方法联合在一起) 集成测试: 与服务器联调一下 自动化测试:robotium,它其实是调用安卓底层的测试框架。instrumentationTest Bug管理平台:非常重要
1、administrator超级管理员,可以创建用户
2、project manager 查看项目状态,查看一共有多少个Bug,并且可以修改Bug的状态
3、developer开发软件,修Bug
4、tester/ 有的时间会出来有的时间不出来的叫random bug /*************************************************************/
操,原来那些扫描的软件动画,都是帧动画 。
这段代码包含了太多东西,好好看。以后做进度绝对没有问题。
public class AntivirusActivity extends Activity {
protected static final int STOP = 1;
private ImageView iv;
private ProgressBar pb;
private ScrollView sv ;
private LinearLayout ll;
private AnimationDrawable animationDrawable;
private SQLiteDatabase db;
//这是一个极为精妙的设计,因为这个点击事件会反复触发,当第一次触发后,把这个值设置为true,再触发事件的时间如果发现这个值为true,这个触摸事件直接就返回了。太好了。
private boolean flagscanning = false;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what == STOP) {
ll.removeAllViews();
animationDrawable.stop();
}
//开始不断更新界面 ,这个滚动的效果,其实就是不断的往线性布局里面加控件。
String string = (String) msg.obj;
TextView tv = new TextView(getApplicationContext());
tv.setText(string);
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(tv);
sv.scrollBy(0, 20);
};
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); iv = (ImageView) findViewById(R.id.iv);
iv.setBackgroundResource(R.drawable.anti_anim); pb = (ProgressBar) findViewById(R.id.progressBar1);
sv = (ScrollView) findViewById(R.id.sv);
ll = (LinearLayout) findViewById(R.id.ll);
animationDrawable = (AnimationDrawable) iv.getBackground(); System.out.println(Environment.getExternalStorageState()+"/antivirus.db");
//初始化DB
db = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()+"/antivirus.db", null, SQLiteDatabase.OPEN_READONLY); } /**
* 对整个activity进行监听的回调函数,因为activity实现了 Window.Callback, KeyEvent.Callback,这些个类
* KeyEvent.Callback是关于键盘的所有回调函数,例如onkeydown,onkeylbackup等,
* Window.Callback指对整个界面的各种事件都 有
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
//如果发现它为true,也就是它不是第一次点击发生的,那么让这个事件返回
if (flagscanning) {
return false;
} if (event.getAction() == MotionEvent.ACTION_UP) {
flagscanning = true;
animationDrawable.start();
new Thread(){
@Override
public void run() {
List<PackageInfo> infos = getPackageManager().getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES|PackageManager.GET_SIGNATURES);
// 获取每一个应用程序的签名 获取到这个签名后 需要在数据库里面查询
pb.setMax(infos.size());
int total = 0;//用于计算总体进度
int virustotal = 0;//病毒总数
for(PackageInfo info : infos){
total ++;
try {
sleep(200);//效果更明显
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg = Message.obtain();
msg.obj = "正在扫描"+info.packageName;
handler.sendMessage(msg);
//得到每一个应用的签名与数据库中的相比对
Signature[] signs = info.signatures;
String str = signs[0].toCharsString();
String md5 = MD5Encoder.encode(str);
Cursor cursor = db.rawQuery("select desc from datable where md5=?",new String[]{md5});
//如果发现了病毒
if (cursor.moveToFirst()) {
String desc = cursor.getString(0);
msg = Message.obtain();
msg.obj = info.packageName + " : "+desc;
handler.sendMessage(msg);
virustotal++;
}
cursor.close();
pb.setProgress(total);
}
//结束后
Message message = Message.obtain();
message.what = STOP;
message.obj = "扫描完毕,共发现"+virustotal+"个病毒";
handler.sendMessage(message);
pb.setProgress(0);
};
}.start();
}
return super.onTouchEvent(event);
} }
//开发中的log管理:
//实际开发中,Log都是通过配置文件进行管理的。
import android.util.Log;
import cn.itcast.mobilesafe.util.Logger; /**
* 在开发阶段把LOGLEVEL设置为6,在应用阶段把LOGLEVEL设置为0.
* @author chen
*
*/
public class Logger {
private static int LOGLEVEL = 0;
private static int VERBOSE = 1;
private static int DEBUG = 2;
private static int INFO = 3;
private static int WARN = 4;
private static int ERROR = 5; public static void v(String tag,String msg){
if (LOGLEVEL > VERBOSE) {
Log.v(tag, msg);
}
}
public static void d(String tag,String msg){
if (LOGLEVEL > DEBUG) {
Log.d(tag, msg);
}
}
public static void i(String tag,String msg){
if (LOGLEVEL > INFO) {
Log.i(tag, msg);
}
}
public static void w(String tag,String msg){
if (LOGLEVEL > WARN) {
Log.w(tag, msg);
}
}
public static void e(String tag,String msg){
if (LOGLEVEL > ERROR) {
Log.e(tag, msg);
}
} }
Android学习笔记_64_手机安全卫士知识点归纳(4) 流量统计 Log管理 混淆打包 加入广告 自动化测试 bug管理的更多相关文章
- Android学习笔记_63_手机安全卫士知识点归纳(3)分享 程序锁 服务 进程管理 widget
1.分享: Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.setT ...
- Android学习笔记_61_手机安全卫士知识点归纳(1)状态/形状图形 GPS 设备管理器DeviceAdminReceiver ImageView属性
1.在做程序自动安装更新的时候 ,必须保证程序的签名和包名是相同. C:\Documents and Settings\zehua\.android \ debug.keystore debug ...
- Android学习笔记_62_手机安全卫士知识点归纳(2)ListView重要属性 PopupWindow应用
1.缓存颜色: 为什么ListView在拖动的时间是黑色,而静止时间是自己的颜色是因为 ListView的缓存.只需一个配置即可.在这个ListView里面加上它即可. android:cacheCo ...
- Android学习笔记(3)----手机调试[OFFLINE]的解决方式
问题描述 今天用Android Studio开发了一个简单的调用摄像头的App,结果想调试的时候发现选择调试设备的对话框中,手机名称后面总是跟着一个[OFFLINE]的标识,只能选择启动AVD来进行调 ...
- Android学习笔记-获取手机内存,SD卡存储空间。
前面介绍到如何保存数据到手机内存或者SD卡,但是问题是,在保存以前,我们还需要对他们的空间(可用空间),进行判断,才可以进行后续操作,所以,本节我们就介绍如何获取手机内存以及Sd卡的空间. //这时获 ...
- Android学习笔记36:使用SQLite方式存储数据
在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...
- 【转】Pro Android学习笔记(三十):Menu(1):了解Menu
目录(?)[-] 创建Menu MenuItem的属性itemId MenuItem的属性groupId MenuItem的属性orderId MenuItem的属性可选属性 Menu触发 onOpt ...
- 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge
目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...
- 【转】Pro Android学习笔记(十四):用户界面和控制(2):Text类控制
目录(?)[-] TextView 例子1在XML中设置autoLink属性 例子2在代码中设置autoLink属性 EditText AutoCompleteTextView MultiAutoCo ...
随机推荐
- nodejs日志管理log4js
常用的2种配置: 1.按文件大小分片,备份若干数量的文件 var log4js = require('log4js'); log4js.configure({ "appenders" ...
- MYSQL系列-Mysql存储引擎选择
MYSQL系列-Mysql存储引擎选择 //查看当前数据库支持的存储引擎 show engines \G; 创建表的时候可以通过engine=MyISAM指定存储引擎 MyISAM: .MYISAM不 ...
- WPF 父子窗体联动
问题: 近段时间,由于项目上的一些原因,设计到在WPF项目使用引用COM组件的问题,部分WPF元素浮动在COM组件之上,并且实现拖.停靠.放大等功能(子窗体不要求等比缩放,只要位置跟随主窗体即可),如 ...
- sqlserver2008 调试存储过程
1.创建所需要调试的存储过程,并执行一下,也就是保存好 ,我要演示的存储过程名是 “usp_Passport_GetNewDepositary” 2.找到存储过程,右键“执行存储过程”,会弹出如下的界 ...
- 网页设计,Access入门 2010,语文
Access入门 2010(select查询) order by(按升序排列)?+desc(按降序排列) group by(进行分组,下一行只能用having) sum(数值总数)?+as?(新字段的 ...
- C#学习笔记13
1.Task概述:Task是对操作系统线程的抽象,目的是使线程池能高效地管理线程的分配和回收,Task使用的底层线程属于一种共享资源,任务需要互相协作,并及时归还线程,以便用相同的共享资源(线程)满足 ...
- Spring课程 Spring入门篇 4-6 Spring bean装配之基于java的容器注解说明--@ImportResource和@Value java与properties文件交互
1 解析 1.1 这两个注解应用在什么地方 1.2 应用方式 1.3 xml方式实现取值 2 代码演练 2.1 @ImportResource和@Value代码演练 1 解析 1.1 这两个注解应用在 ...
- JQuery.iviewer
from: http://test.dpetroff.ru/jquery.iviewer/test/# jquery.iviewer.js: /* * iviewer Widget for jQuer ...
- js变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级
原文出自:http://www.cnblogs.com/xxcanghai/p/5189353.html作者:小小沧海 题目如下: function Foo() { getName = functio ...
- 如何才能快速入门python3?
一些朋友自学python过程中,发现书也能看懂,书上的玩具代码也能看懂,但为啥自己不能做习题,不能写代码解决问题,自己不能动手写代码? 原因是初学者没有学会计算思维.解决问题的方法.编程思路. 编程思 ...