Android-相关总结-2020.04.03

1.va 相关总结:
VirtualApp在运行时,包含以下三部分:

Main Process
Server Process
VApp Process,进程名io.virtualapp

在新进程中启动组件,会首先创建该应用的 Application,并进行相应系统服务 ( ActivityManager 和 PackageManager )的代理构造和替换。

2.偷渠换柱 (占坑)

StubActivity 会从 Intent 中获取到 client 应用的相关信息,并修改自身 ActivityThread 的 handler。随后调用 startActivity 启动 client 应用。由于之前 Server Process 和 VApp Process 都已完成了相关系统服务的替换,这里会完成 client 应用的 bindApplication 调用、构造 client 应用的 LoadedApk,并通过反射完成真正的Application 和 Activity 的创建。最终,client 应用便运行在了我们的 VApp Process 中。

3.插件化:

双亲委派机制其工作原理的是:

如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,
如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,
如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试
自己去加载,这就是双亲委派模式。

Android 中有两个 ClassLoader 分别为 dalvik.system.DexClassLoader 和 dalvik.system.PathClassLoader

PathClassLoader 不能直接从 zip 包中得到 dex,因此只支持直接操作 dex 文件或者已经安装过的 apk
      (因为安装过的 apk 在 cache [/data/dalvik-cache] 中存在缓存的 dex 文件)。
DexClassLoader 可以加载外部的 apk\jar\dex 文件,并且会在指定的 outpath 路径存放其 dex 文件。

Android系统通过 Resource 对象加载资源,因此只需要添加资源(即 apk 文件)所在路径到 AssetManager 中,即可实现对插件资源的访问。
调起插件中的 Activity过程:

首先 Activity1 调用 startActivity,实际会调用 Instrumentation 类的 execStartActivity 方法,
通过跨进程的 binder 调用,进入到 ActivityManagerService(AMS)中, ApplicationThread 是
一个 binder 对象,其运行在 binder 线程池中,内部包含一个 H 类,该类继承于 Handler。

ApplicationThread 将启动 Activity2 的信息通过 H 对象发送给主线程。主线程拿到 Activity2 的
信息后,调用 Instrumentation 类的 newAcitivity 方法,其内部通过 ClassLoader 创建 Activity2 实例。

4.ARM 常用指令集:
java 虚拟机是基于栈架构的,而 Dalvik 虚拟机是基于寄存器架构的。
常见的 ARM 指令有:

(1)MVN(按位取反)、ADC(带进位的加法指令)、MUL(为 32 位乘法指令)、SDIV(有符号数除法指令)、
ASR(算术右移指令)、LDR(加载存储指令)、STR(将数据存储到指定地址的存储单元)、BL(带链接的
跳转指令,首先将当前指令的下一条指令的地址复制到 R14-LR 寄存器中,在子程序的尾部,通过 
MOV PC,LR 指令返回主程序)

(2)BX:带状态切换的跳转指令,如果满足条件 c,处理器会判断 label 指向的 DE 地址的位是否为1,
如果为1,则跳转时自动 将 CPSR 寄存器的标志 T 置位,并将目标地址处的代码解释为 Thumb 代码来执行,
即处理器会切换至 Thumb 状态。BLX (带链接和状态切换的跳转指令)、块数据传输指令(STMDA、LDMDA)、
软中断指令(使用较多的是 SVC 指令,用户态的 ARM 程序通常将系统调用号传入 R7 寄存器,然后使
用 SVC 指令调用 0 号中断来直接执行系统调用)。

注意:Thumb 具用 16 位的指令宽度,第二代 Thumb-2 使用了与 ARM 指令相同的 32 位指令,BX 利用 Rn 寄存器中目的地址值的最后一位来判断跳转后的状态。当最后一位为 0 时,表示转移到 ARM 状态;当最后一位为 1 时,表示转移到 Thumb 状态。无论是 ARM 还是 Thumb,其指令在存储器中都是边界对齐的。(2字节或者4字节对齐,最低位不起作用!)因此,在执行跳转过程中,PC 寄存器中的最低位被舍弃,不起作用。在BX指令的执行过程中,最低位正好被用作状态判断的标志,不会造成存储器访问不对齐的错误。

5.动态代理具体步骤:

通过实现 InvocationHandler 接口创建自己的调用处理器;
通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。

6.内存优化:

稳定(内存溢出、崩溃)
流畅(卡顿)
耗损(耗电、流量、网络)
安装包(APK瘦身)

另外可以:

代码混淆。使用proGuard 代码混淆器工具,它包括压缩、优化、混淆等功能。
资源优化。比如使用 Android Lint 删除冗余资源,资源文件最少化等。
图片优化。比如利用 AAPT 工具对 PNG 格式的图片做压缩处理,降低图片色彩位数等。
避免重复功能的库,使用 WebP图片格式等。
插件化,比如功能模块放在服务器上,按需下载,可以减少安装包大小.

7.网络分层:

OSI七层模型结构体: 物、数、网、传、会、表、应
TCP/IP 四层模型:数、网、传、应
在这里插入图片描述
注意:

传输层的 TCP 是基于网络层的 IP 协议的,而应用层的 HTTP 协议又是基于传输层的 TCP 协议的,
而 Socket 本身不算是协议,就像上面所说,它只是提供了一个针对 TCP 或者 UDP 编程的接口。
socket (传输层)是对端口通信开发的工具,它要更底层一些。

8.TCP通信过程:

三次握手:

 1.主动发起请求端, 发送 SYN 
 2.被动建立连接请求端 , 应答 ACK 同时 发送 SYN
 3.主动发起请求端,发送应答 ACK
      * 标志 TCP 三次握手建立完成。 —— server:Accept() 返回 。— client:Dial() 返回。

四次挥手:

 1.主动关闭连接请求端, 发送 FIN
 2.被动关闭连接请求端 ,应答 ACK
				标志。半关闭完成。 —— close()
 3.被动关闭连接请求端 ,发送 FIN
 4.主动关闭连接请求端,应答 ACK
 标志。四次挥手建立完成。 —— close().

9.GET 和 POST 区别:
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤:

(1)客户使用 https 的 URL 访问 Web 服务器,要求与 Web 服务器建立 SSL 连接。
(2)Web 服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与 Web 服务器开始协商 SSL 连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,
    并传送给网站。
(5)Web 服务器利用自己的私钥解密出会话密钥。
(6)Web 服务器利用会话密钥加密与客户端之间的通信。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值