Android项目架构--知识体系简单梳理(二)

通信体系

  • Http:HttpClient、HttpConnection

  • Socket

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端向服务器发送请求

    那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。通过建立socket连接,可为通信双方的数据传输传提供通道。socket的主要特点有数据丢失率低,使用简单且易于移植。

    • 基于TCP协议的Socket

      服务器端首先声明一个ServerSocket对象并且指定端口号,然后调用Serversocket的accept()方法接收客户端的数据。accept()方法在没有数据进行接收的处于堵塞状态。Socketsocket=serversocket.accept(),一旦接收到数据,通过inputstream读取接收的数据。

      客户端创建一个Socket对象,指定服务器端的ip地址和端口号

      Socketsocket=newSocket("172.168.10.108",8080);
      

      通过inputstream读取数据,获取服务器发出的数据

      OutputStreamoutputstream=socket.getOutputStream();
      

      最后将要发送的数据写入到outputstream即可,然后进行TCP协议的socket数据传输。

  • 基于UDP协议的数据传输

    服务器端首先创建一个DatagramSocket对象,并且指点监听的端口。接下来创建一个空的DatagramSocket对象用于接收数据

    bytedata[]=newbyte[1024];
    DatagramSocketpacket=newDatagramSocket(data,data.length);
    

    使用DatagramSocket的receive()方法接收客户端发送的数据,receive()与serversocket的accepet()类似,在没有数据进行接收的处于堵塞状态。

    客户端也创建个DatagramSocket对象,并且指点监听的端口。接下来创建一个InetAddress对象,这个对象类似于一个网络的发送地址

    InetAddressserveraddress=InetAddress.getByName("172.168.1.120";
    

    定义要发送的一个字符串,创建一个DatagramPacket对象,并制定要将这个数据包发送到网络的那个地址以及端口号,最后使用DatagramSocket的对象的send()发送数据。

    String str="hello";
    byte data[]=str.getByte();
    DatagramPacket packet=new DatagramPacket(data,data.length,serveraddress,4567);
    socket.send(packet);
    
  • BlueTooth:BluetoothAdapter、BluetoothDevice、BluetoothSocket、BluetoothServerSocket

    • 设置蓝牙设备
    • 寻找局域网内可能或者匹配的设备
    • 连接设备
    • 设备之间的数据传输
  • NFC

    • Near Field Communication 近场通信,是一种数据传输技术。

    • 与wifi、蓝牙、红外线等数据传输技术的一个主要差异就是有效距离一般不能超过4cm。

    • NFC支持3种工作模式:

      1. 读卡器模式;

      2. 仿真卡模式;

      3. 点对点模式;

  • Headset

  • USB

    android.hardware.usb包下提供了USB开发的相关类。

    我们需要了解UsbManager、UsbDevice、UsbInterface、UsbEndpoint、UsbDeviceConnection、UsbRequest、UsbConstants。

  1. UsbManager:获得Usb的状态,与连接的Usb设备通信。

  2. UsbDevice:Usb设备的抽象,它包含一个或多个UsbInterface,而每个UsbInterface包含多个UsbEndpoint。Host与其通信,先打开UsbDeviceConnection,使用UsbRequest在一个端点(endpoint)发送和接收数据。

  3. UsbInterface:定义了设备的功能集,一个UsbDevice包含多个UsbInterface,每个Interface都是独立的。

  4. UsbEndpoint:endpoint是interface的通信通道。

  5. UsbDeviceConnection:host与device建立的连接,并在endpoint传输数据。

  6. UsbRequest:usb 请求包。可以在UsbDeviceConnection上异步传输数据。注意是只在异步通信时才会用到它。

  7. UsbConstants:usb常量的定义,对应Linux/usb/ch9.h

数据持久化

  • SQLite DB

    • SQLiteOpenHelper
    • ContentProvider
  • File

    • Internal Storage:使用Android设备自带的内存存储数据
    • External Storage:使用外部存储设备存储数据,一般是指Sdcard
  • Shared Preferences:共享参数形式,一种以Key-Value的键值对形式保存数据的方式,Android内置的,一般应用的配置信息,推荐使用此种方式保存。

  • Network Connection:使用基于网络的服务获取数据

性能优化

  • UI优化

    • 布局层次结构

    • 抽象布局使用

    • HierarchyViewer:帮助你识别渲染性能比较低的部分。View节点中带有红色或黄色的点代表速度较慢的View对象。

    • Lint 工具:帮助您轻松地识别并纠正问题与结构质量的代码,而不必执行应用程序或编写任何测试用例。

  • 内存优化

    • OOM

    • ANR

    • 分析(调试)

      • Heap
      • adb shell
      • TraceView
      • Dalvik日志
      • logcat
      • MAT
  • 电量优化

  • 流量优化

适配

  • OS Version:minSDK

  • Screen Size:layout

  • Screen px :drawable

测试

  • Monkey

  • MonkeyRunner

  • Junit

  • Robotium

  • Appium

  • Athrum(TMTS)

  • UIAutomator

安全

  • 服务器安全

  • 通信安全

    • 与服务端通信

    • 组件间通信

  • 数据加密

  • 数据验签

  • 代码混淆

  • WebView/JS安全调用

  • MD5、DES、RSA、https、证书、权限

    常用加密解密算法【RSA、AES、DES、MD5】介绍和使用===

    摘要算法:MD5,SHA1,摘要算法是一个不可逆过程,就是无论多大数据,经过算法运算后都是生成固定长度的数据,一般结果使用16进制进行显示。

    MD5和SHA1的区别:MD5结果是128位摘要,SHa1是160位摘要。那么MD5的速度更快,而SHA1的强度更高。

    摘要算法主要用途有:验证消息完整性,安全访问认证,数据签名。

     - 消息完整性:由于每一份数据生成的MD5值不一样,因此发送数据时可以将数据和其MD5值一起发送,然后就可以用MD5验证数据是否丢失、修改。
    
     - 安全访问认证:这是使用了算法的不可逆性质,(就是无法从MD5值中恢复原数据)对账号登陆的密码进行MD5运算然后保存,这样可以保证除了用户之外,即使数据库管理人员都无法得知用户的密码。
    
     - 数字签名:这是结合非对称加密算法和CA证书的一种使用场景。
    

    一般破解方法:字典法,就是将常用密码生成MD5值字典,然后反向查找达到破解目的,因此建议使用强密码。

    对称加密算法:加密解密使用相同的密钥

    - DES:比较老的算法,一共有三个参数入口(原文,密钥,加密模式)。而3DES只是DES的一种模式,是以DES为基础更安全的变形,对数据进行了三次加密,也是被指定为AES的过渡算法。
    
    - AES:高级加密标准,新一代标准,加密速度更快,安全性更高(不用说优先选择)
    

    AES密钥长度可以选择128位【16字节】,192位【24字节】和256位【32字节】密钥(其他不行,因此别乱设密码哦)。

    DES的使用和AES类似,指定为DES就行。3DES指定为”DESede”,DES密钥长度是56位,3DES加长了密钥长度,可以为112位或168位,所以安全性提高,速度降低。工作模式和填充模式标准和AES一样。

    非对称加密(RSA)

    RSA加密是有长度限制的,1024位密钥可以加密128字节(1024位),不满128字节的使用随机数填充,但是RSA实现中必须要加随机数(11字节以上),所以明文长度最大为117字节,然后剩下的加入随机数。这也产生了每次加密结果每一次都不一样的特点。

    如果明文长度超过限制怎么办?

    1. 可以与对称加密混合使用,一次一密产生对称加密的密钥,然后使用此密钥进行数据对称加密,再使用RSA私钥对对称密钥加密,一起保存。解密时使用公钥解密出密钥,然后进行数据解密。

    2. 可以分段加密。将明文按117字节分成多段,加密后再拼接起来。由于每一段密文长度都是128字节,所以解密时按照128字节分段解密。

    RSA密钥使用Base64编码

    常见的编码有Base64,HEX和对URL的编码。HEX是编码成16进制字符,MD5一般就是以HEX进行编码。

    Base64一开始是为了解决邮件中不能传文件和图片问题而使用的,将无法阅读的二进制码转化成字符形式,字符为(A-Za-z0-9+/)。它的原理是将3个8位字节(24位)转化为4个6位字节(24位),之后在6位的前面补两个0,形成8位一个字节形式,如果剩下的不足3字节,则用0填充,输出字符使用”=”,所以编码后文本可能出现1个或2个’=’.这样就将原本3个字节变成了4个字节,那就是64种编码了。当然,除了对二进制数据编码,还可以对字符串编码来隐藏明文,让别人不那么容易看懂。

    url一般使用的都是英文、数字和某些符号,而对于特殊符号,中文等这些是不允许使用的。因此我们要在url请求中加入特殊符号,中文等就需要对它们进行编码。http请求时,url部分是必须编码的,get的请求字段可以不进行url编码。

    在16进制前面加上‘%’表示。对于一些字符使用的是”%xx”,而对于中文,就是多个”%xx%xx%xx”,xx的数字有编码的16进制决定(没有指定字符编码(utf8),则使用默认编码),然后每一字节前面加”%”。

    Android 中提供的URL编码解码方法。

    String d = URLEncoder.encode('中文'"utf8");
    String f = URLDecoder.decode("%20");
    

NDK

  • JNI

  • C语言

  • C++

手机功能

  • 电话

    • 联系人
    • 通话记录
  • 短信/彩信

  • Camera

  • Audio

  • SD卡

  • 感应器

    • 加速
    • 方向
    • 重力
    • 光线
    • 陀螺仪
    • 磁场
    • 接近
    • 温度
    • 压力
    • 线性加速度
    • 旋转

第三方扩展

  • 地图
  • 语音识别
  • 支付
  • 统计分析
  • 广告

你可能感兴趣的:(Android,面试)