Mikee的八度空间

即便在大公司里当了一辈子工程师,又有几个人记得你呢?其实,所有的有人存在的地方都是围城,一群人笑着进去,一群人笑着出来。唯有虔诚的去追逐自己想要的东西,才能到达最完美的世界。


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

android系统https抓包问题分析

发表于 2020-07-07   |   分类于 逆向相关

前言

每次分析app时都免不了抓包这一环节。想要抓到包就要看app采取的什么通信协议了。由于http存在的种种不安全性,当前大部分的app基本都已经是采用https的通信协议。所以连抓包也变得越来越不友好。不论是使用burpsuite还是fiddler,当前的抓包工具基本原理都是采用的中间人的方式。原理就是这些工具作为中间人,对客户端伪装成服务端,对服务端伪装成客户端。

HTTPS

http即超文本传输协议,是互联网上应用最为广泛的一种网络协议 ,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。然而他也存在着一些缺点,比如通信使用明文,内容极易被窃听;不验证通信方的身份,因此有可能遭遇伪装;无法证明报文的完整性,所以有可能遭到篡改。因此,http的加强版https应运而生。https中的s是ssl或者tls,就是在原HTTP的基础上加上一层用于数据加密、解密、身份认证的安全层。

阅读全文 »

TCP协议三次握手过程详解

发表于 2019-08-28   |   分类于 协议相关

本文通过图来梳理TCP-IP协议相关知识。TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道。如图1所示,给出了TCP通信过程的示意图。

img

上图主要包括三部分: 建立连接、传输数据、断开连接。

建立TCP连接很简单,通过三次握手便可建立连接。建立好连接后,开始传输数据。TCP数据传输牵涉到的概念很多:超时重传、快速重传、流量控制、拥塞控制等等。断开连接的过程也很简单,通过四次握手完成断开连接的过程。三次握手建立连接:

阅读全文 »

Android开发中RecyclerView的一些优化技术

发表于 2019-08-16

关于RecyclerView的优化,自己会将它们分为两大类,一类是RecyclerView自带的系统优化,另一类就是我们通过代码实现的手动优化,先来介绍下RecyclerView自带的系统优化。系统优化我们不能做太多的干预,但是通过理解RecyclerView的系统优化能够让我们更好的理解RecyclerView的工作机制。

预取功能(Prefetch)

这个功能是rv在版本25之后自带的,也就是说只要你使用了25或者之后版本的rv,那么就自带该功能,并且默认就是处理开启的状态,通过LinearLayoutManager的setItemPrefetchEnabled()我们可以手动控制该功能的开启关闭,但是一般情况下没必要也不推荐关闭该功能,预取功能的原理比较好理解,如图所示

img

我们都知道android是通过每16ms刷新一次页面来保证ui的流畅程度,现在android系统中刷新ui会通过cpu产生数据,然后交给gpu渲染的形式来完成,从上图可以看出当cpu完成数据处理交给gpu后就一直处于空闲状态,需要等待下一帧才会进行数据处理,而这空闲时间就被白白浪费了,如何才能压榨cpu的性能,让它一直处于忙碌状态,这就是rv的预取功能(Prefetch)要做的事情,rv会预取接下来可能要显示的item,在下一帧到来之前提前处理完数据,然后将得到的itemholder缓存起来,等到真正要使用的时候直接从缓存取出来即可

阅读全文 »

Android开发的一些技术细节

发表于 2019-05-27

最近总结了一些开发中应该注意的技术细节,特此记录下

  • Message obtain跟直接new的区别 :本质是Message obtain是采用享元模式,所以效率会高一些
  • Rxjava操作符设计模式 :看了一下源码其实就是装饰器模式
  • Gson泛型擦除 :Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)
    意思就是说,我们传入一个泛型T,然后gson在解析的时候,会把泛型参数的类型擦除,那么我们就没办法获得参数的类型了。所以也就报错了,会把List< T > 泛型解析成LinkedTreeMap
  • 线程池如何保证核心线程不被销毁的 : 大致可以描述为线程池就是用一堆包装住Thread的Wroker类的集合,在里面有条件的进行着死循环,从而可以不断接受任务来进行。
  • 当有新任务来的时候,先看看当前的线程数有没有超过核心线程数,如果没超过就直接新建一个线程来执行新的任务,如果超过了就看看缓存队列有没有满,没满就将新任务放进缓存队列中,满了就新建一个线程来执行新的任务,如果线程池中的线程数已经达到了指定的最大线程数了,那就根据相应的策略拒绝任务。
  • 当缓存队列中的任务都执行完了的时候,线程池中的线程数如果大于核心线程数,就销毁多出来的线程,直到线程池中的线程数等于核心线程数。此时这些线程就不会被销毁了,它们一直处于阻塞状态,等待新的任务到来。
    阅读全文 »

Android工具类常用的几种方法

发表于 2017-10-10

1.安装应用APK

1
2
3
4
5
6
7
8
9
10
 private void installApk(String apkFilePath) {
File apkfile = new File(apkFilePath);
if (!apkfile.exists()) {
return;
}
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
startActivity(i);
}
}
阅读全文 »

2017年Android曲折的求职之路

发表于 2017-06-06

本人近况

先说下博主最近近况,5月底毅然离职没想到目前市场这么萧条,怪自己太作,有好的机会不好好把握,非得出来受虐哈,人都是犯贱的……所以目前整理几家去过的公司以免以后被坑。

金开门(好贷网旗下孵化创业公司)

这公司是在BOSS直聘上投的
总体面试还算不错吧Android技术那面一般也不会问特别深主要是最新的主流技术一般会问下,还有就是之前的项目会大致问一下
接下来是总监面,总监是个蛮不错的人,满有亲和力的,大概就是聊推送这一块的,还有支付,因为这公司主要业务是聚合支付相关的,总体还OK
接着是HR 谈薪水还有介绍公司近况,貌似最近一直是995的节奏
最后是大Boss面貌似很屌的说了一句目前我们就是996的节奏(应该是试探我的),我觉得跟他也没啥好谈,他一幅咄咄逼人的气势,由于他比较强势,我又不妥协,所以就没有后续了…

阅读全文 »

最近被问到的算法整理

发表于 2017-06-06   |   分类于 算法相关

题目:

1、取一个整数a从右端开始的4~7位

解题思路:

比如一个数 00000000 00000000 00000000 00000100 要取出4-7位,
我们可以先用&来把其他的位数化成0,然后只保留4-7位为1,
也就是我们可以&的数为00000000 00000000 00000000 11110000
变成十六进制也就是0xf0
&之后,再把后面4位给删掉,删掉我们可以用右移>>>4
来排除

通俗方法:

1
2
3
4
5
6
7
8
9
private static int findBitRight(int number,int fromIndex,int toIndex) {
subListRangeCheck(fromIndex, toIndex,31);
int i = 1<<fromIndex;
int tag = 1;
while (tag++ <= (toIndex - fromIndex)){
i |= (i << 1);
}
return (number&i)>>>fromIndex;
}
1
2
3
4
5
6
7
8
9
private static void subListRangeCheck(int fromIndex, int toIndex,int size) {
if (fromIndex < 0)
throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
if (toIndex > size)
throw new IndexOutOfBoundsException("toIndex = " + toIndex);
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex +
") > toIndex(" + toIndex + ")");
}

简易方法:

1
2
3
4
int get4to7(int number){
int number1=15&(number>>4);
return number1;
}

2、在一个全由字母组成的字符串中找到第一个只出现一次的字符并返回他的位置,没有则返回-1000

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static int firstUniqChar(String s) {
Map<Character,Integer> map = new HashMap<>();
for (char c : s.toCharArray()) {
if (map.get(c) == null){
map.put(c,1);
}else{
map.put(c,map.get(c)+1);
}
}
for (int i = 0; i < s.toCharArray().length; i++) {
Character c = s.charAt(i);
if (map.get(c) == 1){
return i;
}
}
return -1000;
}

关于调用系统照相机Activity被销毁问题解决

发表于 2016-05-11

在项目中需要启用系统照相机来拍照。本来很容易的一个问题。但在适配中出现了问题。
简单说一下问题:
有些手机拍照成功,有些手机拍完照后确定返回后activity数据丢失,被销毁了。
问题查找:
经过代码查找发现,当这些出问题的手机被调用系统手机拍照时,当前activity被销毁了之后又被重新创建了。即Acitivity 执行了ondestory()–>onCreate(),所以Activity被重新创建了从而内部的数据丢失,而按照正常的逻辑该Activity应该入后台堆栈。一开始以为是系统启用照相机内存不够自动销毁回收。可有些手机不会出现该问题。很无奈。
之后经过本人细心研究activity的生命周期才恍然大悟,原来当手机横竖屏时系统会重新创建一个activity,这就是为什么上个activity会ondestory()–>onCreate()。但为什么有些手机会执行有些不会呢。问题就出在横竖屏上。因为有些手机的系统照相机弄的很炫会自动旋转90度,从而导致了横竖屏的发生(–!看来最潮的也不是好东西,苦了我们这些碼农)。这就是为什有些手机会发生有些不会。跟系统照相机是否旋转有关系。
最后贴上解决方案。

阅读全文 »

对RecyclerView.Adapter的简单封装

发表于 2016-04-20

对分页展示而言,RecyclerView已经可以完全替代ListView。这里只进行一下对其Adapter的简单封装。

分析

  • 目的:目的是为了减少Adapter具体实现的代码,使代码整洁,易于维护。
  • 分析:与listview面向view的adapter不同,recyclerview面向的是viewholder。所以BaseRecyclerAdapter需要两个泛型声明,一个是数据源,一个是viewholder。
    onCreateViewHoler()方法中需要生成具体的viewhoder实例,所以暂时不去对其做封装。对onBindViewHoler()方法的操作分为两步,一步是bindItemData()将数据填充至itemview,下一步是setupOnItemClick()设置每个item的点击监听。其它方法都是对便利性的扩展,可以根据不同情况添加。
  • 并没有对viewholder动刀子,考虑到目前情况下在AS中利用ButterKnife可以高效的生成viewholder,对开发效率影响不大。不过ButterKnife毕竟是通过运行时反射对view进行绑定的,对效率是有影响,但是AS2.0之后发现Google有扶正DataBindding的趋势,所以综合考虑下,还是没有对viewholder动刀子。但是会在RecyclerView深入研究时思考这个问题。
    阅读全文 »

Gson解析(List和Map)格式json数据

发表于 2016-04-20

有时候服务端非得返回比较傻逼的Json

这时候可以用gson解析带有键值对的json

阅读全文 »
12
Mikee

Mikee

11 日志
3 分类
3 标签
© 2020 Mikee
本站总访问量次 | 本站访客数人
主题 - NexT.Muse