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

http://123/206.88.221/

http://123/206.88.221/

vhly.mobi

自己搞一个服务器

以上是关于android 性能优化的主要内容,如果未能解决你的问题,请参考以下文章

Android性能优化总提纲

Android性能优化总提纲

Android性能优化(八)--Android图片内存优化

性能优化之Java(Android)代码优化

性能优化之Java(Android)代码优化

(七) 中篇 Android 性能优化 Perfetto 文件分析