Android Socket 应用 - 网络编程与进程通讯

前阵子空闲时间学习了下 okhttp 源码,主要是重新学习 socket 网络编程,以及 okhttp 框架的一些特点。上周末,一个制作三星刷机包的朋友告诉我:国行三星手机通过官方 crom service 应用解锁手机后,才可以刷第三方刷机包,解锁后就保修就废了,很多人都不愿意解锁。于是朋友托我研究 crom service 上锁,如果研究成功,那么玩家更乐意解锁刷机。在研究上锁,刚好涉及到 android 底层 socket 通讯知识,同时分享下。文末介绍这次三星上锁之旅(反编译相关),成功但尴尬的结局。

socket 网络编程

在 okhttp 中,一次网络请求,在一条拦截链中完成,拦截链中每个拦截器完成比较少的任务(如重定向,失败重连,连接池,缓存等),很多大神也分享过拦截链的代码,就不重复介绍,这里主要介绍一次网络请求整个流程,可分以下四步:

序号 方法 描述
1 connectSocket 通过 socket 连接远程服务器
2 connectTls 传输层安全协议,握手
3 writeRequest 写请求信息
4 readResponse 读响应信息

Android Coding

简述

使用 okhttp 很长时间了,但一直没时间弄懂其中各种奥妙。上周相对空闲,于是阅读了 okhttp 源码,准备写写笔记。习惯写笔记时,写写比较核心的 demo 代码,想起前阵子朋友使用 github 的 rest api v3 开放接口实现了评论系统 comment.js ,于是 demo 代码中的网络请求就试试 github 的 rest api v3 开放接口。又因为之前也实现过类似 coding 一样的功能,一发不可收拾,便实现一个可关注动态,下载源码,查看文档和查看代码的 coding ,本文是 coding 的分享笔记,以后再做 okhttp 源码笔记。

开放接口 : https://developer.github.com/v3/

项目地址 : https://github.com/4ndroidev/Coding

下载样例 : http://fir.im/hb1w

如果你的项目想集成该功能,拷贝 coding 代码后,像 sample 一样,添加一行代码即可。

声明:感谢真coding,此假coding使用了真coding开源代码中的3个html和一些图标

效果

screenshot1
screenshot2

Android 实用布局

目录

英文名 中文名
FlowLayout 流式布局
NineGridLayout 九宫格布局
BoundLayout 回弹布局
RefreshLayout 下拉刷新布局

贩剑

Q: Github 一堆相应的UI组件库,为什么要重复造轮子?

A: 别人的劳斯莱斯轮子未必适合我这破单车。另外,做自己力所能及的事情,多练习也有好处。

基础

ViewGroup作为容器类,基本上布局都继承该类或其子类,重写onMeasureonLayout方法进行自定义布局。其中官方早已实现五大布局:FrameLayoutLinearLayoutRelativeLayoutTableLayoutAbsoluteLayout。随后,support库也出了不少优秀布局,如ConstraintLayoutCoordinatorLayout等。以上都是官方叼炸天的布局,下面说说作为一个平民,我能做到的布局,由易到难。

react-native bundle 解释与拆解

0. 成果

声明: 避免修改 RN 依赖下面代码,fork facebook/metro-bundler 进行修改
github: https://github.com/4ndroidev/metro-bundler

原理:

细心分析, bundle 文件中每一行都是一个Module.js对应的数据结构;打包过程中,在分析依赖时,引入base.js先进行基础依赖遍历,并对Module元素标记base: true,然后再对入口文件进行依赖分析,这种先后顺序能保证基础模块 id 在前,业务模块 id 在后;在打包输出时,将标记base: trueModule打包到base.bundle,否则打包到business bundle

使用方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 安装打包工具
npm install rocket-bundler
# or
yarn add rocket-bundler
# 打包bundle
test ! -d output && mkdir output
node node_modules/rocket-bundler/src/cli.js bundle \
--dev false \
--platform android \
--entry-file index.android.js \
--bundle-output output/index.android.bundle \
--base-file base.js \
--base-output output/base.bundle \
--assets-dest output/ \
--sourcemap-output output/sourcemap.txt \

结果:

bundle-result

爱壁纸爬虫

声明:

如有侵权,邮件627014295@qq.com告知,四十八小时内删除
涉及图片格式,需要安装PIL

笔试题

第n个无平方数因数的数

如果一个正整数不能被大于1的完全平方数所整除,那么我们就将该数称为无平方数因子的数。例如,靠前的一些无平方数因数的数是{1,2,3,5,6,7,10,11,13,14,15,17,19…}。给出一个整数n,返回第n个无平方数因子的数。

输入:

输入一个整数n. n 的取值范围为1到1,000,000(其中包括1和1,000,000)

输出:

返回第n个无平方数因数的数

举例:

n = 13, 返回19.

思路:

统计 start = 1 到 end = n 中平方数倍数的个数cnt(注意避免重复),如果cnt>0, 继续统计 start = end+1 到 end = end+cnt 中平方数倍数的个数k,直至 cnt==0,输出 end

Android反编译分享

声明:本文仅供学习使用,如有侵犯,请通知我,24小时内删除!
前言:反编译工作特点:1.体力活 2.需要耐心 3.坚持不懈 4.熟能生巧

纲目

  • 反编译作用
  • 反编译工具
  • Smali简介
  • 代码插桩
  • 实战例子(如何获取网易云音乐接口,查看整个反编译流程)

Android IPC机制

摘自 《Android 技术内幕》系统卷 – 杨丰盛 著, 好记性不如烂笔头

Binder概述

Linux系统中,以进程为单位分配和管理资源的。处于保护机制,一个进程不能直接访问另一个进程的资源,也就是说,进程间互相封闭。但是,一个复杂的应用系统中,通常会使用多个相关进程来共同完成一项任务,因此要求进程之间必须能够互相通信。从而共享资源和信息。所以,操作系统内核必须提供进程间的通信机制(IPC)。

应用程序虽然是以独立的进程来运行的,但是相互之间还是需要通信的,比如,在多进程的环境下,应用程序和后台服务通常会运行在不同的进程中,有着独立的地址空间,但是因为需要相互协助,彼此间又必须进行通信和数据共享,这就需要进程通信来完成。在Linux系统中,进程间通信的方式有socket、named pipe、message queue、signal、share memory等;Java系统中的进程间通信方式也有socket、named pipe等,所以Android可以选择的进程通信的方式也很多,但是主要包括以下几种方式

  • 标准Linux Kernel IPC接口
  • 标准D-BUS接口
  • Binder接口

Android Apk 签名破解

阅读本文前,应先了解反编译工具的使用,和smali代码的插桩修改

前提:应用厂商为防止二次打包发布,一般会校验签名,甚至使用签名作为网络请求起算参数,防止服务器资源被盗用
作用:避免二次打包后签名校验导致无法运行问题,破解签名后,可插桩日志代码,分析应用请求接口
破解方法:很简单,伪造正确签名,欺骗程序读取正确签名

步骤:

  1. 判断是否使用了签名校验
  2. 获取正确签名并保存
  3. 欺骗程序获取正确签名