Android性能优化常见Q(1),android面试宝典2019

2、内存中如果加载一张500*500的png高清图片.应该是占用多少的内存?

  • 参考回答:
*   **不考虑屏幕比的话**:占用内存=500 \* 500 \* 4 = 1000000B ≈ 0.95MB
*   **考虑屏幕比的的话**:占用内存= 宽度像素 x (inTargetDensity / inDensity) x 高度像素 x (inTargetDensity / inDensity)x 一个像素所占的内存字节大小

inDensity表示目标图片的dpi(放在哪个资源文件夹下),inTargetDensity表示目标屏幕的dpi

密度dpi范围
ldpi120dpi
mdpi160dpi
hdpi240dpi
xhdpi320dpi
xxhdpi480dpi
xxxhdpi640dpi

3、WebView的性能优化 ?

  • 参考回答:
*   一个加载网页的过程中,native、网络、后端处理、CPU都会参与,各自都有必要的工作和依赖关系;让他们相互并行处理而不是相互阻塞才可以让网页加载更快:
    *   **WebView初始化慢,可以在初始化同时先请求数据,让后端和网络不要闲着。**
    *   **常用 JS 本地化及延迟加载,使用第三方浏览内核**
    *   **后端处理慢,可以让服务器分trunk输出,在后端计算的同时前端也加载网络静态资源。**
    *   **脚本执行慢,就让脚本在最后运行,不阻塞页面解析。**
    *   **同时,合理的预加载、预缓存可以让加载速度的瓶颈更小。**
    *   **WebView初始化慢,就随时初始化好一个WebView待用。**
    *   **DNS和链接慢,想办法复用客户端使用的域名和链接。**

4、Bitmap如何处理大图,如一张30M的大图,如何预防OOM?

  • 参考回答:避免OOM的问题就需要对大图片的加载进行管理,主要通过缩放来减小图片的内存占用。
*   BitmapFactory提供的加载图片的四类方法(**decodeFile、decodeResource、decodeStream、decodeByteArray**)都支持BitmapFactory.Options参数,通过inSampleSize参数就可以很方便地对一个图片进行采样缩放
*   比如一张1024_1024的高清图片来说。那么它占有的内存为1024_1024_4,即4MB,如果inSampleSize为2,那么采样后的图片占用内存只有512_512_4,即1MB(__注意:根据最新的官方文档指出,inSampleSize的取值应该总是为2的指数,即1、2、4、8等等,如果外界输入不足为2的指数,系统也会默认选择最接近2的指数代替,比如2_\*)
*   综合考虑。通过采样率即可有效加载图片,流程如下
    *   **将BitmapFactory.Options的inJustDecodeBounds参数设为true并加载图片**
    *   **从BitmapFactory.Options中取出图片的原始宽高信息,它们对应outWidth和outHeight参数**
    *   **根据采样率的规则并结合目标View的所需大小计算出采样率inSampleSize**
    *   **将BitmapFactory.Options的inJustDecodeBounds参数设为false,重新加载图片**

5、内存回收机制与GC算法(各种算法的优缺点以及应用场景);GC原理时机以及GC对象

  • 参考回答:
*   内存判定对象可回收有两种机制:
    *   **引用计数算法**:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。然而在主流的Java虚拟机里未选用引用计数算法来管理内存,主要原因是它难以解决对象之间**相互循环引用**的问题,所以出现了另一种对象存活判定算法。
    *   **可达性分析法**:通过一系列被称为『GCRoots』的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为_**引用链**,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。其中可作为GC Roots的对象:虚拟机栈中引用的对象,主要是指栈帧中的__本地变量__、本地方法栈中__Native__方法引用的对象、方法区中__类静态__属性引用的对象、方法区中__常量_\*引用的对象
*   GC回收算法有以下四种:
    *   **分代收集算法**:是当前商业虚拟机都采用的一种算法,根据对象存活周期的不同,将Java堆划分为新生代和老年代,并根据各个年代的特点采用最适当的收集算法。
    *   新生代:大批对象死去,只有少量存活。使用『复制算法』,只需复制少量存活对象即可。
        *   **复制算法**:把可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用尽后,把还存活着的对象『复制』到另外一块上面,再将这一块内存空间一次清理掉。**实现简单,运行高效。在对象存活率较高时就要进行较多的复制操作,效率将会变低**
    *   老年代:对象存活率高。使用『标记—清理算法』或者『标记—整理算法』,只需标记较少的回收对象即可。
        *   **标记-清除算法**:首先『标记』出所有需要回收的对象,然后统一『清除』所有被标记的对象。**标记和清除两个过程的效率都不高,清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。**
        *   **标记-整理算法**:首先『标记』出所有需要回收的对象,然后进行『整理』,使得存活的对象都向一端移动,最后直接清理掉端边界以外的内存。**标记整理算法会将所有的存活对象移动到一端,并对不存活对象进行处理,因此其不会产生内存碎片**

6、内存泄露和内存溢出的区别 ?AS有什么工具可以检测内存泄露

  • 参考回答:
*   **内存溢出(out of memory)**:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
*   **内存泄露(memory leak)**:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。**memory leak会最终会导致out of memory!**
*   查找内存泄漏可以使用Android Studio 自带的**AndroidProfiler**工具或**MAT**

7、性能优化,怎么保证应用启动不卡顿? 黑白屏怎么处理?

  • 参考回答:
*   **应用启动速度**,取决于你在application里面时候做了什么事情,比如你集成了很多sdk,并且sdk的init操作都需要在主线程里实现所以会有卡顿的感觉。在非必要的情况下可以把加载延后或则开启子线程处理
*   另外,影响**界面卡顿**的两大因素,分别是**界面绘制和数据处理。**
    *   布局优化(使用include,merge标签,复杂布局推荐使用ConstraintLayout等)
    *   onCreate() 中不执行耗时操作 把页面显示的 View 细分一下,放在 AsyncTask 里逐步显示,用 Handler 更好。这样用户的看到的就是有层次有步骤的一个个的 View 的展示,不会是先看到一个黑屏,然后一下显示所有 View。最好做成动画,效果更自然。
    *   利用多线程的目的就是尽可能的减少 onCreate() 和 onReume() 的时间,使得用户能尽快看到页面,操作页面。
    *   减少主线程阻塞时间。
    *   提高 Adapter 和 AdapterView 的效率。
*   **黑白屏产生原因**:当我们在启动一个应用时,系统会去检查是否已经存在这样一个进程,如果不存在,系统的服务会先检查startActivity中的intent的信息,然后在去创建进程,最后启动Acitivy,即冷启动。而启动出现白黑屏的问题,就是在这段时间内产生的。系统在绘制页面加载布局之前,首先会初始化窗口(Window),而在进行这一步操作时,系统会根据我们设置的Theme来指定它的Theme 主题颜色,我们在Style中的设置就决定了显示的是白屏还是黑屏。
    *   windowIsTranslucent和windowNoTitle,将这两个属性都设置成true (会有明显的卡顿体验,不推荐)
    *   如果启动页只是是一张图片,那么为启动页专一设置一个新的主题,设置主题的android:windowBackground属性为启动页背景图即可
    *   使用layer-list制作一张图片launcher\_layer.xml,将其设置为启动页专一主题的背景,并将其设置为启动页布局的背景。

8、强引用置为null,会不会被回收?

  • 参考回答:
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

写在最后

由于本文罗列的知识点是根据我自身总结出来的,并且由于本人水平有限,无法全部提及,欢迎大神们能补充~

将来我会对上面的知识点一个一个深入学习,也希望有童鞋跟我一起学习,一起进阶。

提升架构认知不是一蹴而就的,它离不开刻意学习和思考。

**这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家,**梳理了多年的架构经验,筹备近1个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

最近还在整理并复习一些Android基础知识点,有问题希望大家够指出,谢谢。

希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!

转发+点赞+关注,第一时间获取最新知识点

Android架构师之路很漫长,一起共勉吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

一下我,以后还会更新技术干货,谢谢您的支持!

转发+点赞+关注,第一时间获取最新知识点

Android架构师之路很漫长,一起共勉吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值