SDK(software development kit)
软件开发工具包,只是简单的为某个程序设计语言提供应用程序接口的一些文件,但也可能包括能与某种嵌入式系统通讯的复杂的硬件。一般的工具包括用于调试和其他用途的实用工具。SDK还经常包括示例代码、支持性的技术注解或者其他的为基本参考资料澄清疑点的支持文档。软件工程师通常从目标系统开发者那里获得软件开发包。为了鼓励开发者使用其系统或者语言,许多SDK是免费提供的。SDK经常可以直接从互联网下载。
SDK提供的文档和接口需要使用者容易理解和调用。
根据单一职责将系统拆分为不同的小模块,每个模块相对独立
对逻辑的封装,并具备单个可移植性
将SDK整体划分为两部分:宿主和插件.宿主只向开发者提供必要的服务接口,并提供了自定义插件加载器.而核心的逻辑则是存在于插件中.当需要采集数据的时候,只需要由开发人员开发好数据采集插件并下发到指定设备即可;当需要修复SDK缺陷时,同样也只需要下发新的插件包即可.
通过在SDK使用插件化方案,可以有效的对开发者屏蔽手动更新的过程.宿主相对稳定,一旦确定,一般不会变动,而后续的业务变化则只需要通过更新插件来支撑.
通过体验公司发布的游戏可以了解到SDK主要功能模块是登录功能、支付功能、个人中心等,在研究各功能模块怎么实现前应该了解一下如何制作一个SDK
首先要了解到,Android中使用的第三方库有.jar和.aar两种类型,这两种类型返回的区别如下
文件夹名称 | 文件夹内文件功能 |
---|---|
assets | 原生资源文件 |
com | 存放class文件 |
META-INF | 配置 |
文件夹名称 | 文件夹内文件功能 |
---|---|
aapt | Android资源打包工具 |
aidl | Android接口定义 |
assets | 原生资源文件 |
jni | java与natived的桥梁 |
libs | 库 |
res | 资源文件 |
AndroidManifest.xml | 声明文件 |
classes | java类文件 |
R | 映射资源 |
1、先使用Android Studio创建项目工程;
2、在项目里面新建一个module;新建一个Class文件,然后添加一个方法(即后面jar包里要调用的方法)
3、在module的gradle里面添加下面的内容(注:文件最外层添加),如下:
task makeJar(type:org.gradle.api.tasks.bundling.Jar) {
//指定生成的jar名
baseName 'sdk'
//从哪里打包class文件/TestRxJava/testlibrary/
from('build/intermediates/classes/debug/com/example/mymodule/')
//打包到jar后的目录结构TestRxJava/testlibrary/libs/
into('TestRxJava/testlibrary/libs/')
// into('org/cmdmac/cloud/pluginsdk/')
//去掉不需要打包的目录和文件
exclude('test/', 'BuildConfig.class', 'R.class')
//去掉R开头的文件
exclude{ it.name.startsWith('R');}
}
makeJar.dependsOn(build)
4、点击Sync Now,等Android Studio运行完成后,点击右上角的Gradle按钮,然后点开我们的module(就是之前建的 sdklibrary),你取的什么名字在这就是什么名字,点开只有在点开other,然后再展开的方法里面,找到我们的makeJar
5、双击makeJar按钮,等到运行结束,就可以看到build/libs/这个文件夹下面生成了classes.jar文件,就算完成了。
6、将jar包导入你想要用的工程里,然后调用相应的方法就好了
1、首先使用Android Studio通过new Module建立一个lib项目
2、编码,配置,混淆
3、点击最右边的gradle,选择对应的module点击build/assembleRelease脚本
系统会在module目录下的build/outputs/aar下面生成一个release.aar
然后你把这个压缩包解压,把里面的classes.jar作为lib导入到一个项目中(Android Studio自带反编译功能)查看下项目代码是否已经混淆,混淆的程度是否满足你的预期(辛辛苦苦写的代码 随随便便给别人拿走可不好),记住你提供的入口API文件千万不要混淆
1、点击【File>New>New Module】
2、选择 【Import .JAR/.AAR Package,点击【Next】
3、输入.arr文件所在路径并点击【finish】.
4、点击【File>Project Settings 】(或者使用快捷键[Ctrl+Shift+Alt+S](适用于Windows)).
5、在左侧菜单【Modules】栏目下,选择需要依赖.aar包的module(通常为app).
6、点击Dependencies分页
7、点击右上角绿色的【+】
8、选择【Module Dependency】
9、选择你导入的ARR所在的【Module】
思路从用户第一次打开游戏出发
1、游戏客户端调用SDK提供的注册页面,用户输入注册信息,SDK将用户信息提交给SDK服务器
2、SDK服务器接受SDK传递过来的用户注册信息 ,为新用户注册,返回用户的token令牌
3、SDK接受到token令牌,将token令牌里的内容解析,然后将信息传递给游戏客户端,游戏客户端向游戏服务端传递该信息
4、游戏客户端接收到该信息,向SDK服务端匹配用户信息,匹配成功后生成该用户唯一标识USERID,然后返回给游戏客户端
5、游戏客户端获取USERID,缓存到本地,使用该ID进行其他操作
6、用户第二次打开游戏客户端,访问缓存的USERID,获取到USERID,然后进行其他操作
Fiddler是一个使用C#实现的抓包调试工具,它可以对网络中发送和接受的数据包进行截获、重发、编辑、转存等操作,不仅对电脑本身的数据的抓取,还可以对处于同一局域网内的Android/iphone手机的数据进行操作。是一个非常常用的抓包工具。
### Fiddler的抓包原理
客户端和服务器之间建立一个代理服务器,监听本机发出的请求和服务器返回的响应结果。iddler是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888.当Fiddler启动后将自己变成一个代理服务器,这个代理服务器默认监听127.0.0.1:8888.
1、Fiddler抓取客户端向服务器发送请求
2、fiddler向服务器发送请求进行握手, 获取到服务器的CA证书, 用根证书公钥进行解密, 验证服务器数据签名, 获取到服务器CA证书公钥
3、fiddler伪造自己的CA证书, 冒充服务器证书传递给客户端浏览器, 客户端浏览器做跟fiddler一样的事。
4、客户端浏览器生成https通信用的对称密钥,用fiddler伪造的证书公钥加密后传递给服务器, 被fiddler截获。
5、fiddler将截获的密文用自己伪造证书的私钥解开, 获得https通信用的对称密钥。
6、fiddler将对称密钥用服务器证书公钥加密传递给服务器, 服务器用私钥解开后建立信任, 握手完成, 用对称密钥加密消息, 开始通信。
7、fiddler接收到服务器发送的密文, 用对称密钥解开, 获得服务器发送的明文。再次加密, 发送给客户端浏览器。
8、客户端向服务器发送消息, 用对称密钥加密, 被fidller截获后, 解密获得明文。
打开Fiddler,自动设置好了http/https的代理,关闭时候,代理还原。开启时确保File –> Capture Traffic开启着。需要Https的话需要开启Tools –> Fiddler Options –> HTTPS 的Decrypt HTTPS Traffic
在使用fiddler代理监听访问时,可以使用statistics分页去统计请求和响应的一些信息。
说明:
1、request count:请求数,表示该session总共发起了多少个请求。
2、Bytes sent:发送请求的字节数(包括请求头和请求体)
3、Bytes received:接收到的字节数(包括响应头和响应体)
4、clientconnected:客户端连接的时间;
5、clientbeginrequest:客户端开始发送请求的时间;
6、gotrequestheaders:获得请求头文件的时间;
7、clientdonerequest:客户端完成请求的时间;
8、determine gateway:确定网关使用的时间;
9、dns lookup:查看dns使用的时间;
10、tcp/ip connect:tcp/ip 连接使用的时间;
11、https handshake:https握手使用的时间;
12、serverconnected:服务连接发生的时间;
13、fiddlerbeginrequest:fiddler开始请求的时间;
14、servergotrequest:服务器得到请求的时间;
15、serverbeginresponse:服务器开始响应的时间;
16、gotresponseheaders:得到响应头文件的时间;
17、serverdoneresponse:服务器完成响应的时间;
18、clientbeginresponse:客户端开始响应的时间;
19、clientdoneresponse:客户端完成响应的时间;
20、overall elapsed:全部花掉的时间(使用客户端完成响应的时间-客户端开始请求的时间)
response bytes(by content-type)–响应的字节(内容格式)
estimated worldwide performance
(世界其他地方的性能–即其他地方访问该网站需要的时间)
可以使用statistics分页,完成简单的性能测试。查看其接口的响应时间。
该页可以查看当前请求的会话内容,上半部分是请求的内容,下半部分是响应的内容
AutoResponder允许你拦截指定规则的求情,并返回本地资源或Fiddler资源,从而代替服务器响应。匹配规则有两种匹配方式
字符串匹配(默认):只要包含指定字符串(不区分大小写),全部认为是匹配
正则表达式匹配:以“regex:”开头,使用正则表达式来匹配,这个是区分大小写的
该页中可以自定义网络请求
用于过滤无用的请求信息。有两种方式进行过滤
Zone 指定只显示内网(Intranet)或互联网(Internet)的内容:
Host 指定显示某个域名下的会话:
无论是开发APP还是SDK,反编译都是非常重要。反编译自己的应用,查看自己代码的混淆。防止其他人利用反编译手段对自己的应用进行破坏。分析其他应用的实现原理。无论是对安全还是自身都有着无可厚非的重要。
目前常用的反编译软件有apktool、dex2jar、jd-gui、jadx。想完全编译一个应用,用一个工具的效果是不足够分析的,因为每个工具都各有所长,综合几个工具一起使用,效果最好。
apktool
资源文件的获取,简单直接的资源文件查看
dex2jar
对修改后缀.apk->.zip的文件解压,获得classes.dex,对classes.dex反编译成jar包
jd-gui
打开dex2jar反编译后jar包,获得java源代码
jadx
这个工具和apktool相似,但拥有gui界面。在apktool中,对应的java类会被反编译成smali文件,jadx使用asm这个工具来生成class文件,实现Java代码的可视化。总体相对apktool来说,性能差一点,不能修改代码和不能进行回编译。
这一周的工作主要是针对SDK开发开展一系列知识学习的知识了解,如要SDK的用途,性能特征,如何打包封装等。从开始对SDK开发的懵懵懂懂到现在的略懂还是有很大的帮助。还有针对应用安全的网络抓包,反编译等。这些知识在平时学习中确实是容易忽略的部分。这一周的学习中也了解Android开发代码规范,为打造可维护易扩展的产品做了充足的准备。
[1]便捷的将你的项目作为SDK—用aar代替过时的jar
[2]AndroidStudio打包jar包
[3]AndroidStudio封装SDK的那些事
[4]Fiddler 工作原理
[5]fiddler之数据统计(statistics)
[6]抓包工具总结
[7]Android逆向之旅—反编译利器Apktool和Jadx源码分析以及错误纠正