Abstract:一些客户端技术原理,如APK,传感器,热补丁,系统权限等等。
广告追踪
- pc端追踪:cookie标识下收集用户的个人浏览习惯
- 移动端:GUID标识用户设备;
APK是怎样炼成的
- APK:安卓系统上的应用安装包;androidmanifest:包含软件的基本信息,包括版本号/协议,是程序间互相调用的基础;class.dex装载了所有代码;resource.arsc:设计资源,包括res:所有设计图,xml文件:描述动画效果和页面布局等;META-INF:签名信息(公钥私钥);
xposed
- 安卓系统上的一套hook框架:在不改变原app情况下修改app中函数的行为,使第三方开发者也可以对app做定制化的改动;可拦截并改变一个函数的输入返回值;可hook应用里的每个函数;
安卓掉电快:push
- 各个软件以自己的节奏唤醒cpu来实现其push操作;
apple pay
- NFC技术:短距离高频无线通讯技术,允许电子设备间进行非接触式点对点数据传输;10cm内交换数据;
- 安全单元secure element:独立电子芯片,有自己的微处理器/存储/加密硬件,只有授权的应用才能访问安全单元的数据;
- touch id:指纹识别,指纹传感器将单个指纹转化为一组数学表达式,用于解锁一些机密信息,只对活体指纹识别;
- secure enclave:cpu里集成的安全执行环境,用于处理敏感信息,信息用特殊密钥加密传输;
- 流程:
1 | 绑卡(用户扫描银行卡或输入 |
android 应用的续命大法
- 监听系统事件:利用android系统的广播机制(把系统发生的事件通知给需要知道此事件的应用)唤醒自己;缺点:有的rom会对广播限制;
- 守护进程:应用启动后创建守护进程,在本应用被杀死后复活它;
- 全家桶系列:不同应用相互唤醒;
手机传感器
- 磁场传感器:获得收集在xyz三个方向上的磁场强度,旋转手机直到只有一个方向的值不为0时,手机指向正南方;可根据三方向上的磁场强度不同,计算出手机在三维空间的具体朝向;
- 加速度传感器:返回手机在xyz三方向上的加速度值,若手机水平放置,则z值即当前的重力加速度G,通过判断G值不同推测用户是在南北极or赤道;应用:计步;
- 三轴陀螺仪:可获取手机在xyz三方向上的角加速度,主要用来检测手机的旋转方向;应用:接听电话;
- 近距离传感器:检测收集附近物体距离收集正面的距离(小型雷达),通过发送一些脉冲信号并检测返回事件来计算距离;
- 光线传感器:检测收集正面接收到的光照强度,从而对应改变屏幕亮度;
- 气压传感器:检测大气压强从而推测海拔高度;如计算爬了几层楼梯;
- 温度传感器:获取当前环境的温度;
热补丁技术(android端)
- Q:app版本发布但发现bug,如何补救?
- 1.线上推送一段修补bug的代码代替原代码插在运行队列的前面,由于同名代码段不能同时运行,故bug代码永远无法运行;
- 2.dexposed:直接接管虚拟机的执行代码流程,执行任何我们想要的代码;限制:只能改自己的app,改别人的app需要root权限;且android5.0以上的系统不可用;
- 3.微信Tinker热更新:不修改系统加载程序的顺序,而是直接在客户端生成全新的程序文件加载;
超级APP诞生记
账号登陆
- 注册和登陆后密码会经过哈希变换再发送给服务器;哈希:把一串数字变成谁也不认识的文字,且过程不可逆推;
- 服务器验证成功后不会记住你,但会返回给你一个票据代替密码(类比机票代替身份证)
- 记住密码!=客户端真的记住密码,而是保存票据把票据拿给服务器做验证;
定位
- GPS定位原理:(核心是参照物,已知参照物的位置和自己与参照物间的距离,即可定位自己的位置)卫星不断广播自己的位置,打开GPS信号接收器收集至少4颗卫星发出的信号,用收到信号的事件乘以光速即可算出自己与每颗卫星间的距离,再加上卫星位置已知,即可确定自己的位置;
- 基站定位和Wi-Fi定位:参照物为手机连接的基站(查询基站位置)和路由器(查询路由器位置);
版本更新——增量更新
- 增量更新:只更新发生改变的部分,而非下载完整安装包;
- 实现:将最新安装包与历史发布的所有版本进行差异对比,得到相应差异包(服务器脚本批量完成)——下发差异包(将当前版本信息发送给服务端,服务端判断后选择相应差异包下发)——合成新包(取出历史安装包,合成)——校验完整性(校验当前历史包的hash值/差异包hash值/合成后新包hash值是否都与预期匹配)
- 省流量:25%/100%
黑知识
Google黑科技:instant app
- 从链接打开instant app,在native界面操作,用完即走;app+web;
点九图
- 利用draw9patch,在png图像四周点黑点,黑点平行对应的区域是可拉伸的,不对应的区域不可拉伸;原理:告诉程序这张图片上哪里(不)可拉伸,可拉伸的区域实际不是被拉伸,而是复制粘贴它本身来填充区域以达到拉伸的效果;
- 作用:解决图片拉伸后的失真问题;
应用国际化
- 要中文配置文件——译成英文——查显示效果(文字过长?图片上的文字怎么改?)
android系统的65536
- class.dex文件行数不可超过65536;但可有多个class文件,但apk安装时会对class.dex做优化却不能对其他class文件(只能在程序首次启动时优化)优化,导致应用首次启动耗时长甚至首次启动无响应;
android系统权限
- 权限管理:用户选择是否授予程序权限;
- 网络访问权限,修改或删除外置存储中的内容,读取手机状态和身份(用户标识),查看wlan连接,控制振动,检索正在运行的应用(瞅瞅竞品的活跃程度),防止手机休眠(维持后台运行),大致位置(基于网络),开机启动,相机,在其他应用之上显示内容(覆盖),精确位置,安装快捷方式,录音,卸载快捷方式(悄悄将竞品的快捷方式删掉),读取联系人信息,停用屏幕锁定,发送短信(花用户的钱给自己发短信),读取短信;
app的推送功能
- 实现一个推送系统:需要服务器和终端的配合;
- 方法:1.轮询(定期不断向服务器请求,此法低级),2.push(和后台维系一条通信通道,两端不定期互相通信以维持后台,但通道易被杀死);
ADB(android debug bridge)
- android调试桥接器:
图片缓存系统
- 分两级,一级缓存(内存缓存,存取速度更快,程序退出则数据消失,且多占内存,以空间换时间)+二级缓存(硬盘缓存,缓存容量更大,速度 慢,程序再启动后仍可用);
- 刷图片的流程:先占用一级缓存空间——一级满则将部分图片(不经常被使用的)清理到二级缓存——二级满则删除部分图片;
- 微信与新闻app在列表滑动时图片显示的区别:滑动微信通讯录列表的主要目的是快速查找(若此时读取头像则会导致整个列表的华东掉帧卡顿,故舍弃滑动效果),滑动新闻app列表的目的是浏览新闻(慢速滑动,快速滑动的卡顿感被削弱)【同一操作行为背后的关键路径的不同导致技术方案的差异】
庖丁解牛
安卓平台第三方市场的自动安装功能
- 利用root权限静默安装;
- 利用安卓辅助功能(accessilility,为残障人士/感知受限人士提供的)自动安装;
android accesibility
- 一套接口,为特定人群开发定制的辅助功能,降低操作门槛,优化体验(基于用户对辅助功能的授权);
- 功能:获取用户当前界面的UI元素,界面改变时系统会将ui界面的变化信息传输给辅助软件(信息:当前展示的是哪款应用的UI界面+当前ui的结构和所有控件的信息+所有控件可执行的操作+对制定控件进行模拟操作)
- 应用:自动安装app;微信抢红包神器+朗读控件文本内容(为听觉障碍人设计)+自动设置默认应用
- 抢红包神器的实现:监测微信会话列表,发现列表中出现包含【微信红包】字样的控件时对该控件发送指令+ 进入会话详情,对包含【微信红包】字样的控件发送点击指令+进入红包开启页面找到【开】字样的控件发送点击指令——红包到手;
网易新闻客户端的UI结构
- 检查:系统开启显示布局边界(指UI控件所占区域的大小)
- 主界面构成:标题栏+子导航栏(scrollview控件:外层为父控件,里层为子控件;实现上下左右滚动)+ 内容区域(listview:一批样式相同的题图和简介信息组成的父控件;特点:将用户滑出屏幕的子控件进行复用,绑定新的数据来展示新的内容,因为控件过多占用内存)
- 结构化数据:有强管理需求的(用数据库)
hybrid app
- 通过开发者选项-显示布局边界来分辨UI控件;原生UI:由若干控件构成;H5:实际是webview控件,只有一个大红框;
- 1.何时使用原生UI:流畅性要求高的场景+UI样式相对固定不会频繁变化+交互复杂;2.何时使用h5界面:较强的动态运营需求(highly accesible)+UI样式复杂多变+交互简单+多平台复用
- 用显示布局边界法去分析app;
缓存的使用
- 全屏的loading动画:loading内容来自本地的loading数据,将服务器下发的数据存储到终端的行为即缓存;
- 自动的下拉刷新:数据是从服务器拉回的;当距上次刷新超过30min时,下次打开客户端就会触发这个刷新操作(若启动客户端前断开网络则不会触发);刷新过程:将服务器的数据拉到本地+将新数据对应的内容更新到UI上+将新拉取的数据加入缓存中
- 加快首屏显示速度的方法:优先展示本地缓存,然后拉取网络数据(读缓存比拉服务器要快得多);
app卡顿
- 原因:1.过度绘制(开发者选项下界面蓝绿色多则未过度绘制,若红多则流畅度糟糕);
微信授权登录
- 白先生(用户)授权馆长(第三方应用)使用自己存放在库房(微信服务器)的藏品(用户数据/关系链等),库房给了馆长一个蓝色令牌以在有效期内借还藏品,一个红色令牌以在有效期结束后到库房换新的蓝色令牌;
- 微信授权登录系统:基于OAUth2.0协议标准,让三方应用可在不知道用户登录名和密码的情况下访问用户再授权方服务器上的私密数据和资源;
- 授权流程:用户请求三方应用用微信号登录——三方应用使用appID向微信开放平台(客户端)发送登录请求——客户端加载授权页面并请求用户确认——用户点击确认按钮——微信拉起三方应用并传递临时授权码(code)给三方应用——三方应用使用临时授权码(code)/appID/AppSecret通过https协议向微信开放平台(服务器)请求access_token(有效期2h) + refresh_token(有效期30days)——服务器返回access_token + refresh_token;
- 临时授权码(code)+ appID +appsecret三者兼备才能获取授权;
获取安卓用户的app使用频率
- 目的:分析用户偏好,精准运营push;
- 限制:无法直接获取,需要系统开发者的系统签名;
- 方法:通过activity mananger提供的接口获取辅助信息;
- 接口:1.getRecentTasks接口:获取用户最近使用过的应用程序列表(按使用的先后顺序逆序排列;2.getRunningTasks接口:获取当前正在运行的应用列表;
- 实现的算法:1.每经过较长时间间隔获取一次最近使用列表,并对比相邻两次列表中应用的相对位置的改变/或出现新的应用,则标记新列表中位置前移或新出现的应用各使用过一次;2.每经过一个很短的时间间隔获取一次正在运行列表,对比相邻两次列表中的第一个应用有无变化,标记变化;
适配android屏幕
- 痛点:安卓设备碎片化严重(屏幕大小上万),需要通用度量单位;
- 诉求:在不同分辨率/屏幕密度的手机上,同样dp大小的UI元素看起来是一样大的(即视觉上看到的物理尺寸);
- 像素(px),分辨率(共有像素总和),屏幕密度dpi(每英寸像素数);
- dp(密度无关像素):将px换算成dp;dp=(dpi/160)*px;屏幕密度越大,1dp可表示的px越多;
- (手机按密度分档次)【mdpi】密度为160dpi的屏幕:1dp=1px;【hdpi】320dpi:1dp=1.5px;【xhdpi】320dpi:1dp=2px;【xxhdpi】480dpi:1dp=3px;【xxxhdpi】1dp=4px;
- 设计师出图(适配不同屏幕)的方式:1.再所有目录下各放置一份不同大小(换算)的相同图片,让系统自动去寻找最合适的(设计工作量大;增加安装包体积);2.选一个基准屏幕(一般是xhdpi:720p),把所有图放里面,让系统自己去缩放;(小的占内存,大的会失真);
- 准则:1.尽量用dp;2.尽量用百分比和相对位置;
适配ios屏幕
- 使用点(point)作为与px的换算单位;
- 3GS:1point=1px;iphone4/5/6:1point=2px;iphone6 plus: 1point=3px;
- 图片名加@3x表示是三倍资源;
安卓手机实现计步
- 计步传感器(只支持android4.4以上);加速度传感器(用户携带手机行走,垂直方向上的加速度会有规律性的变化)
系统应用删不掉
- 原因:应用存储在system/app里,可删除的放在data/app里;
- root权限可删;
关于图片失真
- 插值算法:邻近插值 & 双线性插值;在原有像素值基础上插入或修改一些像素值,并尽可能保证原图的特征;
听歌识曲
- 关键:如何判断两个音频间的匹配;
- 以图搜图:对图片进行缩放、灰度处理,提取出64位的哈希值作为特征码,再去匹配;——识曲:找到歌曲的特征(乐纹);
- 获取乐紋:把歌转化为单声道、低采样率的wav格式,即排除其他干扰只留歌曲的整体特征;
- 乐紋比对
- 乐紋获取流程:对数据库里的所有音乐提取乐紋(对每首:算出其频谱图—分成一段段,每段在频谱图上找几个特征点——特征点构成乐紋——乐紋以倒排索引形式存到数据库里)
- 匹配流程:上传录音-检索已有乐紋-检索数据库-考虑乐紋排列/时间等因素;
android视图:view树
- viewgroup——view+view+viewgroup(——view+view+view);(理解为控件?)
安卓与ios的系统响应顺序
- ios:touch-media-service-core
- 安卓:application-framework-library-Kernal架构;
- 影响:安卓手机抢红包慢;
为什么美颜app可以美颜
- 原理:使用图像处理里的几个滤镜算法;
- 灰度处理:把图片的RGB值全部改成150;
- 磨皮:用特殊的高斯模糊(双边滤波),即在保留边缘的前提下进行高斯模糊处理;(+ 肤色检测+人脸识别等技术配合)
- 视频直播美颜:实时对摄像头里采集到的视频画面应用滤镜;
- GPU而非CPU做图像处理;
- 反美颜软件:只是用了丑化照片的滤镜(加工过的信息只会越来越少,是不可逆的);
电池续航长短的原因
- 续航长的关键:开源节流【增大电池容量+节约用电(运行时用最少的电量做最多的事+待机时用最少的电量不做事)】
- 后台任务:安卓——应用持续占领后台;ios——只有指定的几种类型的任务才能后台运行;
- 唤醒:安卓——cpu持续不断被唤醒;
应用市场如何为软件显示更新提示
- 流程:市场软件提取用户手机上所有已安装文件的包名和对应的版本号——通过http等网络协议将数据上报给服务器——服务器通过客户端上报的信息再当前app市场上架的apk里查找比对出相同包名且版本号高的apk——服务器将apk数据通过网络协议返给手机——市场软件获取服务器返回的数据后出现更新提示;
应用的生命周期
- 指应用自身运行的生命周期(创建-运行-消亡)
- oncreat,onstart,onresume,onpause,onstop,ondestroy;
如何优化客户端性能
启动速度优化:
- 启动:用户从【打开】到【可操作】的过程;
- 优化的关键——数据分类:必须的(尽可能压缩),可延时加载的(降低其对UI操作的影响),不需要主动加载的;
操作和动画卡顿的优化
- 影响因素:过度绘制;过深的UI层级(系统传递指令的过程过长)
- 工具hierarchy viewer:检查绘制和应用程序的UI层级;
内存优化
- 内存泄漏:导致app卡顿甚至异常退出;原因是”有人“把内存借走了不还(强占内存);
- 解决的关键:找到谁把内存借走了没还;
网络流量优化
- 问题:(android易出现)异常后台流量
- 解决的关键:抓包——分析抓包数据——找到可优化的点
- 合并请求:把同一时刻相同包头的多个数据包合并成一个发过去,省流量;
做按钮不容易
- 按钮三要素:形状,背景,状态;