Loading...
墨滴

TonyCanon

2021/05/11  阅读:62  主题:默认主题

2021.05.11 客户端RD分享

2021.05.11 客户端RD分享

内存泄漏:

  • 申请内存没有释放,持续增长,被系统杀掉
    • iOS: ARC 机制
      • 申请内存过大
      • 循环引用
    • Android
      • 对象生命周期: 短生命周期对象被长生命周期对象 引用,导致不能自动回收
  • 问题:
    • 内存泄漏问题一定会崩溃么:
    • 不一定,取决于泄漏的内存积累的量, 超过
  • 排查工具:
    • ios: instrument、IDE
    • Android: leakCanary
  • 直观数据判断方法:
    • 前后差值判断:
      • 页面创建: 增长n
      • 页面销毁: 减少不到n, 差值
  • 内存找不到了,不能回收

页面/App 生命周期

页面生命周期:

  • 举例:A 页面->B 页面:
    • B 页面初始化:
      • iOS :
      • view load(视图加载)
      • willAppear(将要出现)
      • appear (出现)
      • DidAppear(已经出现)
      • disappear (销毁)
      • willAppear(将销毁)
      • DidAppear(已经销毁)
      • dealloc
        • Android : 多了两个状态
      • 退后台:pause(暂停)
      • 后台唤醒:resume(恢复)
  • 是多个页面 并行的,不是串行的,穿插进行

App 生命周期:

iOS:
  • not running(未启动)
  • 点击icon (dorgroud [inactive - active])
  • background(切后台)- 挂起状态(saspeater, 根据App类型决定能否长时间挂起, 这个时候代码是不能执行,不能进行信跳请求后台)
    • 挂起时被系统杀掉, kill 回到 not running
    • 挂起时后台唤起:
      • 管理器页面 inactive 不活跃
      • 彻底唤起 active 活跃状态, 数据恢复
Android:
  • 后台机制原因,对App生命周期关注不多,要么从页面生命周期恢复,要么就只有刚启动、重新启动做初始化
问题:
  • 定位会不会保证App后台常驻
    • iOS: 应用定位权限控制:只一次、App启动时、始终允许
    • 转转:冷启动时,瞬时定位,只定位一次,存到内存数据库中

远程推送 - 本地推送

iOS:

  • 角色:
    • 手机端: device
    • 转转服务器: server
    • APNS : 推送服务器
  • devicetoken : 设备凭据 唯一
    • App启动时 和APNS请求获取 devicetoken (inhose包不支持推送 获取不到token,push)
      • 和转转server: uid + devicetoken 建立关联
    • 场景:
      • 猜你喜欢活动,根据用户画像推荐商品
      • 喜欢游泳的用户列表 -> payload(消息体) -> APNS -> 推送给设备 -> Aoo -> push 带落地页 ->

Android:

  • 没有 APNS
  • 国外:
    • 有google 的 ,国内不能用
  • 国内
    • 三方:极光、友盟 (需要每一个App,存活时保持和通道的连接, 是和App交互)
      • 多个App 互推, 只要有一个活着,其他App推送都能通道
    • 厂商通道: 小米、华为、OPPO (系统级服务,时和系统交互)
    • 都没有命中通道的时候, Server 通过直连发给手机

问题:

  • 每次发版的时候都需要人工测试,能不能自动监控、测试
    • 立旗 后端自动监听,发送后可以得到发送成功的反馈

图片、按钮怎么渲染、App卡顿、同步&异步:

渲染:

  • 图形:
    • 图形编程,都有API去绘图,只有几个简单的图形API,
    • 屏幕是有坐标点的,
    • 在某个坐标点绘制一个 长多少、宽多少、什么颜色
  • 文字:
    • 图形拼接出的文字
  • 事件:
    • 操作屏幕会有系统事件(坐标、大小)
    • 按下、抬起
    • 按钮监控到按下瞬间,每个事件,按钮会擦除、重新绘制
  • 栅格化:每个单元是像素
    • 需要显卡处理栅格化、提交给GPU绘制,提交给屏幕显示

卡顿

  • 图形引起卡顿:

    • 按下重画, 抬起重画, 60HZ屏幕 每 16ms渲染一遍,在同一个16ms 内执行的重新熏染事件比较多,执行不完,导致16ms间隔扩大,导致一秒内少了一帧
  • 系统程序层面卡顿:

    • Android:
      • 主线程:
        • 执行绘图、
        • 刚启动时代码都执行在主线程
        • 主线程没有切换线程干了很多事导致卡顿

同步异步:

  • 一个线程做事是同步的, 串行
  • 做完A ,同时启动很多线程 ,就是异步,并行 (耗时操作都会创建多个线程)

问题:

  • 同一个场景在不同厂商设备 运行效果不一样,怎么判断
    • 手机区别:
      • CPU性能,同一个时间做更多的事情
      • 如果App做的比较好,所有手机都一样
      • 如果达到某个手机的临界值,就导致一个手机卡一个不卡
      • 磁盘iO极限
      • 手机内存小,不能申请足够的内存,系统要先回收,回收过程计算量比较大、耗时,回收应用优先级,计算过程消耗CPU性能
    • 擦除、重回
      • 恢复空白画板
    • 重复绘制
      • 同一个位置需要绘制多个对象

组件化

  • Android 工程结构;
    • src
      • a
      • b
      • c
  • 代码量增加,结构比较乱
    • 拆多个src, 好管理
    • 每个src 作为单独的工程
    • 需要一个壳工程,把所有组件工程编制起来,配置文件控制需要哪些组件
  • 组件化:
    • 把不好管理的代码工程,拆分多个组件工程,以壳工程编译成一个包
  • 组件化好处:
    • 好维护、管理
    • 多个App工程 共享 功能组件,实现相同功能,通用性
    • 其他App使用需要有相同的组件化框架支持、建立通信、交互
  • 问题:
    • 组件依赖一个组件,壳也依赖这个组件,怎么处理
      • Android、iOS: 人工处理,修改统一版本

MVC

  • 代码越来越多,查问题找不到东西
    • 把代码拆分
  • 原则:
    • 单一职责
  • 层级关系:
    • View 显示
    • Model 数据
    • Controller控制
  • Controller会比较大:
    • 事件处理、数据处理、存储都是集中在这
    • 以前Android 都会在 Activity处理
  • MVP:
    • view 可以直接和model通信,view既依赖crontroller 又依赖model,高耦合
    • 于是要用presenter 断了 view和model的联系,由presenter负责Model操作
  • mvvm
    • m: model
    • v: view
    • vm: viewModel: 数据绑定,双向绑定机制
    • 和MVP的差别:
      • 把数据处理简化,请求数据直接给View赋值,省了很多流程,更快、代码量减少很多
    • 双向绑定怎么实现:
      • 一个对象 有 set、get ,
      • set时候做手脚 保留的引用(有个中间人),中间人直接更新

怎么根据UI设计稿开发界面

  • 手机屏幕属性
    • 分辨率
    • 尺寸
  • 尺寸不同 分辨率相同
    • 像素点物理大小不同,视觉感受不一样
  • 画图要多大 , 引入dpi (每平方英寸像素数, 屏幕像素密度)
    • dpi 越高 看的越细腻
      • Android dpi : 160 240 320 480 640
      • iOS : 1x(160) 2x(320) 3x
  • UI 图
    • 以 2x(320) 图 为基准
    • 在页面绘制的时候,根据dpi 计算 基准比例,进行图像的绘制

Flutter 在App架构体系中是什么

  • 对于App:

    • 是一个容器, 就像Web浏览器
    • App内置容器,用另一个语言实现
  • 渲染机制:

    • Android 、iOS 有自己的渲染机制
    • Web/H5 是另外一套渲染
    • flutter 从底层入手, 有一个独立的跨平台渲染引擎
    • 基于渲染引擎做了组件、新的语言支持
  • 问题:

    • flutter 是不是有纯flutter的壳工程,可以用来自动化测试
      • 有,可以单独测,但是和App交互的功能,现在不能测试,以后冀航实现 flutter单独App 可以和 App 互相交互

客户端 和服务端区别

  • 技术侧重点:
    • 客户端:
      • 在有限的机器上如何花费更多的图形
      • 有兼容
      • 同一个实现 单一用户, 单请求 单处理
    • 服务端:
      • 没兼容
      • 同一个实现 多用户,多请求,并发
      • 更关心 CPU、磁盘
  • 客户端:
    • 关心图形、动画、交互
    • 经常显示效果、布局、绘画、控制点、完美还原设计
    • 动画怎样更平滑、进入到结束动画的节奏,精细控制
    • 跟服务端交互后,数据更新,刷新、联动逻辑
  • 服务端:
    • 关注高可用、稳定性、高并发、分布式

TonyCanon

2021/05/11  阅读:62  主题:默认主题

作者介绍

TonyCanon