android 性能优化
Posted 一朵红杏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 性能优化相关的知识,希望对你有一定的参考价值。
android 性能优化
java 代码优化 主要优化java 代码 对象,
(等待kotlin)
jvm 内存分三块,常量区(静态代码,指向的),堆,栈,static 变量的利用 ,一些全局变量的引用 如?
如 :
context 拿了 activuty 的引用
context 使用不当
a=b; // 相当于 a 保留 b 的引用
b=a;
a.finisg();
b.finish(); // 会造成内存泄露 ,ab 都不能回收 ,因为回收a 时 , b 还在引用它 ,则都不能回收
便会造成内存泄露
正常情况下 ?
a=b;
b.finish();
a.finish(); //先将引用的对象的释放掉,之后再释放自己 就ok 了
复杂的 , static 变量,单例模式
单例模式 , (不会写,可见很多面试都是无意义的)
对象等于空,等待jvm 回收
static{
Class A{
private static A a;
private A{}
public static A instanceA(){
if(a==null){
return new A();
}
}
}
以上写法 if(a!=null)return a;
else return new a;
2:14 ; 全局只有这一个 持久化 , 存在方法区? 整个进程new 出来之后 只有这一个实例
jvm 内存结构 , 三部分 ,分别存取什么值 ,
如果 ,情景限定,286 cpu ,遇到了高并发 ,new 的时候 cpu 切时间频率 ,
2:16??
jvm new 一个对象的过程是啥 ? ① 先创建一个对象的实例 在堆中 ,new 这个对象的线程 去做别的事了
② 在static 创建对象的实例映射 class 字节码的映射
③ 建立索引 (引用) 就是 = 号 //如果想深入研究的话 推荐一本书 摘录 自: jvm 性能优化 和高并发 能能答出差不多通读一遍了 —2:19
1 android 代码如何执行的 , java字节码文件—-> dex 编译器—> dalvik字节码—> dalvik 虚拟机(字节码看不懂)
对算法一段的效率做判断 时间复杂度 空间复杂度 之间比例
空间复杂度 2:21 ?? 从1 K 到 10 k ??
new 一个对象是有 时间开销了 就是 jvm 那三步
bigItager 实现快速递归,
android.util.LruCache 基于此实现三级缓存 (优先算法,使用率高的,后被)
——三级缓存
2:23 —–25
———————————————–与图片相关的地方不是很清晰—————————————–
一张bitmap 2m 画在屏幕上多大,2m 如果是展示在高分屏,显示可以变大,2m,bitmapFactory —>可以进行压缩,–> 200k ,跟图像大小没关系,bmp 质量最大的
SparseArray (k-v) //存数据
new 对象 ();
obj.append();// 添加对象
clear();
append 效率 高于 put
——> 使用效率 高于 数组,集合
java 数据结构 堆栈 , 数组(数据结构 ) ,链表 , map 也是数据结构
map k-v 结构,不一定分叉 但是肯定有节点
集合 链表 linkedlist arraylist
hashmap 与 hashtable(效率高的不安全) // hashmap 安全
对代码和线程,基本都是封装到 c android 只是做了个调用
new hashmap 和 hashtable 所用内存 时间不一样, hashtable 更多时间 更慢,因为有同步代码块
代码的相应能力 :
activity (7种生命周期) service(单开一个进程的) 前两个基础组件 contentProvider(操作数据库) broadcasstReceiver(后两个通讯组件,) 三年以上必须会用
activity 生命周期 除了这七种 还有 ?
onCreateView(){}
onPostCreate(); // 推迟初始化 , new 之前给初值? 2:40
用户刚看到界面,这里做一些延迟加载,在onCreate() 方法之后,onStart() 方法之前
onPostResume();// 在resume() 方法之后告诉你调用了 , 框架中基本都已经封装了 做框架的时候会用
不建议超水平操作 , 容易犯 a= b b=a 释放不了的错误
① 都先注册,② 生命
onSaveInstance()??
如何看一个类,
捕获性能缺陷, StricMode os 里的
sqlLite 性能调优, 比如 ,select 字段 from 整个表 , 还是一张表 某一个字段 就是sql 优化
推荐框架 :
轻量级 android orm ORM activieAndroid 框架
2:46
事物 和 查询 (事物回滚)
银行取款 三个终端, 取款机取款成功,银行那边失败,没有减钱,需回滚回去
高效能存
StrickMode 类检查可能的隐患: anctivity的泄露 , 其他对象的泄露,对象未关闭 泄露
16位 i386
2 :48
jvm 性能优化指南,开辟的内存
新生带 分分钟被释放 ,
老年带 ,常驻
------- 内存够但是 抛出内存 不够 ,因为内存不连续了
2:53
所以对象 标注类型 , 强弱,,,
没有被释放的内存引用 容易发生内存泄露
--------2:53
容易发生的 横竖屏切换的时候
利用 strickMode 可进行检测
jc 是基于引用的, 四种引用 强软弱虚
标记回收的优先级是不一样的
多线程同步--优化
不建议 thread a = new thread(); 很容易造成内存泄露,一般使用系统封装的 Timer/Handler
内部封装的比较好,里边一些对象 不好把握生命周期和回收
界面(UI-android 1 尽量减少视图节点--->())
ddms 节点 线性布局 相对布局 frameLayout —》从view 到viewGroup 节点
3:00
正常写代码 不控制节点的话 视图层次多深,控制节点??????
不控制父容器 对象多少个的话 会占 很多内存 2-3m 只是背景 ,等加入图片 得很多了
所以能用 相对布局写的 不要用线性布局 会浪费许多节点 如均分
界面中 (尽量多使用 include 标签 (在内存中加载过一遍的 视图没必要再加载第二遍了,只让cpu重复一下就好了))
③ 界面上堆bitmap做处理,用到动画,游戏开发,用到双缓存技术,surfaceView video?标签
surfaceView 看不了 以前内部有一个runable 的实现 反编译看就行了 没有反编译看不了的
新版api 拿c 去写了 做了一部分优化 , 经常读读 api 讲完他都懵逼,理解重于记忆
续航(性能消耗-cpu ,内存 电池电量消耗)//
gps android 中定位 基站 3g ? wifi —-> 不断开一个线程 进行定位
广播---> 尤其是? 全局广播(就像在教室喊,与楼都听到,要查询软件,用到cpu) 静态注册()
3:11
http 请求 是一个 ? 协议 无状态协议 b c 端都不保存数据,下次再拿变了 无连接 每次只走一次i再次请求 新开一个
底层基于 tcp ① b + c 前三次握手 , 握手要消耗一定的性能 ,c –>b 发10次 可以变成一次
那个 常连接 心跳连接 ? 以及老徐 的 一次握手多次回话?
本来需要 请求10 次的 ,可以进行打包发送 , 一次两次 这样就减少了 握手次数了
握完之后 解除关系也要浪费时间
手机上常用的 传感器, 如屏幕, 光感(上边小灯), 蓝牙(带着adapter ? 基本调硬件?),wifi
,
绘画 一直重绘 开着线程 耗电
AlarmManager 跟时间相关的东西
3:21
屏幕唤醒 调用硬件驱动 一般 systemService systemManager有关
黑着只能跑 service , 只有唤醒屏幕 才可以进行一些操作
代码:
WakeLock —-> 讲了之后 ??
openGL 多数都是用c 写的 ,
性能测评 ——————————————————————–ddms
内部可以看很多东西 ① 时间测评 ② debug 跟踪 看是否泄露状态
③ ddms 利用 ④ log 日志跟踪 ,android 中的
3:27——————findBugs ——————!!
内部类中用了个 外部东西 外部东西 未释放的话 内部类也释放不了
FindBugs —> 插件 静态不编译代码并检查出代码中的一些问题 如内存泄露 ,,
深度优化 性能优化 ,给个百度的标题吧
j 高多界续
——–》
《android 应用性能优化》
《android 内核设计思想》 //看完这本书 ,需要的时候 看看代码就 o 了 看完剩下的就是一些基础知识了
仔细看完
感觉到一般程序员 看不到的东西
那个博客怎么用的????
视频支付 面试题
视频教程 又是一个 大 demo 支付流程 40–30 api 调用每个业务场景不一样 业务逻辑都是一样的
面试题 为什么这么问 怎么答
与内存相关的东西 很多都是引用导致
做一个接口 达到解耦 无引用 ? 传递的是 接口对象 ? 指向接口 ??????????????
static 加载速度更快 ??
与内存很多相关的东西 很多都是引用导致的
——–.net php databinding mvvm 在 ,net 中 都有很好的体现 写服务器 .net
怎么完成一次支付 逻辑的
时序图 支付逻辑的
支付宝支付时序图 !
① 调取认证权限
② 做业务逻辑
③ 等待请求回调处理 一种 即时 异步
商户 —-> 开发者—–> 口碑
那张图 看明白 ?
业务处理过程中 支付宝 再 异步 返回 一个结果给你
发起请求 传递一个回调的地址 –服务器
支付宝处理完 给服务器反馈 服务器 再给 应用反馈
aes 加密
加密 通过一些手段 把一些不想让第三方知道的一些东西 让它在传输过中不可见
文件存储 网络通讯 ,内存中调用的时候
常见加密技术 : 银行账户,身份证信息,
加密 分几种
两种 可逆 不可逆 对称 非对称 ,对称 可逆
公钥 加密
百度 https 加密 谁都可以有 这个证书 加密 只有百度
对称 aes des
rsa 非对称 还原不回去 ,md5hash? 32 位的内存地址 64 位系统中是否是32 位的地址 输出下 hash ??
java 中 hash值
md5 加密 但是 md5 (用密文 试明文 ) 撞密攻击
服务器端 压力测试 , 肉机 测试 ,爬虫测试,,1000 个肉机 ,一秒钟请求 1000次 ,
小公司服务器分布式 想想水管怎么分流的就是了
具体加密 算法 怎么实现的 知道了哦
sh11 不可逆
从入口处 debug 到出口处 应该就很清楚 是做什么的了
—–app 支付 更详细更好 更容易理解
相关联 —> 生成 token 值
涉及到钱 让用户自己去操作
认证东西 不能在开发者 ,调 微信客户端 , 或者掉 h5 页面 ,不可能在 你的页面
没有客户端才用 h5
——————————————————4 : 14
——最终确认本人 手势验证码 ,
银行要给支付宝 这个结果是否受理成功,异步的
支付宝 推荐 先从服务端查询一下 操作结果 再区做具体的逻辑 ,最后再去处理 订单的最终结果
① 用户下单 给 服务端 服务端给支付包
② 支付宝 用自己的东西处理 订单 并通知处理请求
③ 调用支付应用 用户验证
④ 返回用户验证结果 给支付宝系统 支付宝系统再处理验证结果
⑤ 客户端处理
——-2 个 服务端 与 2个客户端 进行通讯 理解成 4个进程就好——-(线程会抢cpu)
—–微信扫码支付—–
硬盘里有 ——- ??? 扫码支付 代码 , 商户支付的东西 肯定会碰到这个的————————————–
条形嘛 二维码 先照下来 变成流 —》解析成我们需要的数据
微信 搞的是 android 源代码 改编过来的
decoding 中 剩下是调相机
出入口在 View
bitmap — 解读二维码信息 ---通过黑白块 矩阵 二进制数据(就是流)--解读成 字符串去处理即可
----> 支付就这么简单 -----
数据库事物回滚 安全性 加密 解密
数据安全 应用安全 支付模块 去写的话 怎么能保证不被人 破解 代码混淆(起不到太大作用)
把dex 加固 , 加壳的 加密
手机要加一个 post 刷单的话 , post 刷单是个怎么流程 业务流程很麻烦 ---
签名就是 支付宝 服务器上 放的是 私钥 私钥 解密的操作才用到 私钥
哪里调用 哪里用就加密一下
-------视频------
来一个 小demo
视频 媒体播放格式的处理 mp4 avi 3gp 协议格式
每一个视频文件都有自己的编码格式 找到编码格式 进行解码才能进行播放 码其实就是二进制的文件, 会用到一些 解码的工具,
android 中如何实现一个播放器,组件 videoView //组件可能会调用硬件
MediaPlayer
WindowPlayer window 系统自带播放器 audio 音频
MediaController 视频的控制器 来控制播放
使用 mediaPlayer surfaceView 高清视频 几个g 肯定处理
淘宝调用 支付宝 , 通过 uri 进行调用 ,
//通过uri 用路径拿
Uri.parseEnvironment(Environment.getExternalStoreageDirectory().getPath,”Test_Movie_m4v”)
用 intent 调用即可
file 文件操作类 直接拿自己的东西 就ok 呢
写代码匿名内部类
videoVIew.setMediaController();
videoView.start();
viedeoView.requestFocus();
继成 surfaceView 重写一部分功能就行了
常量的话 就看注释就行了
mediaPlayer 与 surfaceView 进行定制 ui 视频播放
surfaceView 做的其实 就是展示画面
对于一个未知的类
知道哪个包了
① 先看构造!!!根据参数 猜什么意思
②
android holder 看到holder 第一想到 viewholder 就是提高啊加载速度
surfaceView 的使用 -----》
File file = new File(String path);// 获得 file 可以变成 二进制..
输入输出的操作 因为跟流相关的肯定要 try catch 一下
player.setDataSource(datapath);
与 surfaceView 相关的, 视频 手势放大 手势缩小java 代码 上不一定 优化的来
通过 handleCallback 进行回调
异步准备调用 的 c native 调用的
最后要重新创建 重新来一边
手机像素 880 × 775 看视频哪个更小用哪个
拿到当前 surfaceView 的画面
mah,max( , ) ;// surface 就这么高 一点调代码
要是重新播放, 就做一个缓存点
搞全站 80 多个后端 --
lint studio 掉 lint
每天3点
emlog 快速建站 服务器 后台 前端
自己博客
android 程序员全栈之路
刚开始上班的时候 都觉得很慌
不会写代码 面小米 8000
android link
analyge
code Clearup 代码审查 会强制删些东西
findBugs 很多不如 android 自带的
哪些可以变成 私有 loacl 都有详细的结果
applay fix 可以 将所有的给你改变
酷派手机 调用 h5 视频 报错 tiff—-最后看下 webkit 不支持这样调js 服务端改 js 代码
魅族 小米 是程序员 杀手 只要 带js 就打不开,,,
客户端做兼容,小米的webkit 不能兼容 else if 调用
直接写
hbuid 可以直接打包 打包成 android 包个壳外边包个webView
weex5 拖控件生成 因为项目拖控件 以后怎么维护
handle 的优化 handle 机制
跟 loop messageequeue
销毁的那个 若在
基类 是什么
留代码的话 自动在清单中补全了
Timer t = new TimerTask();
t.shuddle(new TimerTask(){
@override
public void run(){
//sds~~
}
})
// 两种处理方法
// 调回主线程方法
//
runOnUi(new Runnable(){
@override
public void run(){
}
})
2.3 之前 可以在activity 中直接网络请求
一般不记api
View
crash掉
基于 mvp
在加载图片的本身文件 1g 内存操作可以 但是不能这么操作
1谁给客户端发的这个图片的给他开了
2 我可以加载 从服务上传
谁往服务器上放
3 下载起码是一个文件 , 再去处理
超过 128 就内存报紧了
有损压缩 极限 1/3
先存本地文件中 service 的话 , 这么大 也很容易被回收的
这么不合理的东西 解决啥
存到文件 效率会很低 只能靠线程 进程 真有这么大图片 就可以离职了
他觉得很吊 , 问个问题 不考虑解决方案
烧绳子 你去烧吧
为什么listView 的baseAdapter 使用 viewholder 因为baseAdapter hold不住啊
矩阵 二维数组 三维还是 矩阵 数组 链表 红黑树
两个 很大数据 1000万g 在服务器上 要把这两个数据 在内存中进行对比
找出中间一个 或 两个不同的数据来 ,设计个什么样的算法 能快速查出来
----> 淘宝买单
面365 出现的这个问题
sh11
对查找查询 必须先进行排序
看成 两个 java类 compareable 比较hashcode
视频播放 技能播放 又不超 。。
分多个文件 打包
与断点续传一个逻辑
正常面试 三年一下 java 基础 肯定是数据结构
逮着数据结构往死里问 问了三个小时
硬盘的存储结构 磁盘 内部链表
二叉树 java 基础类型的操作 基于 8种类型 在 java中的扩展
api太没意思 百度一下全出来了
区分
biginteger
做浏览器的 问 xml
有些公司,还问
一个 ac 源码 6000多行
基于mvp 设计模式 你该去写哪些东西
view 控制器 接口隔离原则 一个控制器 只控制一个 联动的控制器只控制联动的
这样不会因为一方出问题 影响另一方 怎么优化 抽象封装
写xml 同时 把ui 都写完了 databinding
想绕过 360 的机制 不让被杀死 ① 进程权限高 ,linux 沙箱管理 权限
基于android 先root 通过脚本root 正常安装不上去
快速构建某个 项目 开发中 应该注意哪些问题
① 界面 ui 组件
② 手势相关
③ 看不到影响看得到的 网络 缓存
④ 服务 更新的组件 ,dialog 对源码的扣能力 aidl c 里边的管道实现的
⑤ 普通基础的东西
handle 有消息队列的时候 阻塞 没有的时候 不阻塞
三种通知 notification 2 toast 3 dialog
webview 如何增加 cookie cookie 的规范是什么 kv
git 主线 分线的关系
一旦合并后 就没有分支这个概念了
当前时间点 到 合并之前分支内容是不一样的
订单系统 账务系统 账单系统
80个人 后端 17 个系统
小公司一年 几千个亿 按照 3% 来算 。。
主线程不要进行 耗时 文件等操作
为什么视频有那么多回调,卡的时候给你提示 让你感觉它不会卡其实他已经卡的不要不要的了
域名映射 apache
vhly.mobi
自己搞一个服务器
以上是关于android 性能优化的主要内容,如果未能解决你的问题,请参考以下文章