Android 优化目录 ---- App 启动方式 冷启动 App 没有启动过或 App 进程被杀,系统中不存在该 App 进程,此时启动即为冷启动。 优化 布局优化 逻辑优化 必要且耗时的逻辑,考虑单独开线程执行 必要不耗时,按优先级高低依次执行 非必要的延迟初始化,等用到再初始化 针对冷启动的欺骗效果 使用 placeholder UI :name=".ui.module.main.LogoSplashActivity" android:screenOrientation="portrait" android:theme ="@style/SplashTheme"> <intent-filter> <action android:name="android.intent.action.MAIN"/ > <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity
Android 优化目录 ---- 交换数据格式 Google 推出的 Protocal Buffers 是一种更轻便高效的存储结构,但消耗内存较大。 因此,最好的优化方法就是避免频繁地读写 SharedPreferences,减少无谓的调用。 异步线程 Android 中数据不多时表查询可能耗时不多,不会导致 ANR,不过大于 100ms 时同样会让用户感觉到延时和卡顿,可以放在线程中运行,但 sqlite 在并发方面存在局限,多线程控制较麻烦 SQLiteStatement 使用 Android 系统提供的 SQLiteStatement 来插入数据,在性能上有一定的提高,并且也解决了 SQL 注入的问题。 分类 直接创建索引和间接创建索引 直接创建: 使用 sql 语句创建,Android 中可以在 SQLiteOpenHelper 的 onCreate 或是 onUpgrade 中直接 excuSql
代码传递思想,技术创造回响!Techo Day热忱欢迎每一位开发者的参与!
Android 优化目录 ---- 利用 Network Profiler 检查网络流量 接口设计 API设计 App 与 Server 之间的 API 设计要考虑网络请求的频次,资源的状态等 故而也是需要优化的一个点。可以在获取图片时告知服务器需要的图片的宽高,以便服务器给出合适的图片,避免浪费。 弱网优化 除了正常的网络优化,还需考虑到弱网情况下 App 的表现。 一般来说,网络延迟在 60ms 内是 OK 的,超过 200ms 就比较糟糕了。 弱网优化,本质上是在弱网的情况下能让用户流畅的使用。 压缩/减少数据传输量 利用缓存减少网络传输 针对弱网(移动网络),不自动加载图片 界面先反馈,请求延迟提交。
Android 优化目录 ---- 理想情况下,60 FPS 以上就不会卡顿,就是 1 秒内要有 60 帧,所以每一帧要在 16ms 内绘制完成。 刷新机制可以看Android Project Butter分析或《Android应用性能优化最佳实践》2.1.2 刷新机制一节。 CPU Profiler TraceView 在 Android Studio 3.0 以上已被弃用,被 CPU Profiler 替代,可参见 https://developer.android.com 严重影响性能,需要优化,避免深红色区域。 自定义 View 本身被认为一层,但是 onDraw 里可绘制时可能产生过度绘制,通过 canvas.clipRect 来解决,具体参见 《Android应用性能优化最佳实践》2.4.3 一节。
Android 优化目录 ---- 优化的意义 减少 OOM,提高应用稳定性。 减少卡顿,提高应用流畅度。 减少内存占用,提高应用后台运行时的存活率。 减少异常发生,减少代码逻辑隐患。 leakcanary-android-no-op 中没有的 API。 @IntDef,@StringDef 代替枚举 zipalign 优化 apk 节制使用 Service 如果需要使用 Service 来执行后台任务,一定要任务正在执行的时候才启动 Service switch (level) { case TRIM_MEMORY_UI_HIDDEN: // 释放资源 break; } } 图片优化 新申请 Bitmap 与旧的 Bitmap 必须有相同的解码格式,并且在 Android 4.4 之前,只能重用相同大小的 Bitmap 的内存区域,Android 4.4 后可以重用任何 bitmap
Android 优化目录 ---- Android 5.0 后用 Battery Historian 工具分析电量。 WakeLock Android 系统本身为了优化电量的使用,会在没有操作时进入休眠状态,来节省电量。 优化建议 优化网络请求 在蜂窝移动网络下,最好做到批量执行网络请求,尽量避免频繁的间隔网络请求,尽量多地保持在 Radio Standby 状态。 可以在代码中调起电量优化的设计页面,让用户选择是否将应用加入白名单,以在 Doze 模式下能够做一些事情。 // Remove the listener you previously added locationManager.removeUpdates(locationListener); 计算优化
Android 优化目录 ---- Android 系统每隔 16ms 会发出 VSYNC 信号重绘界面(Activity)。 之所以是 16ms,是因为 Android 设定的刷新率是 60FPS(Frame Per Second),也就是每秒 60 帧的刷新率,约合 16ms 刷新一次。 频繁的 GC 优化方法 减少刷新次数 比如进度更新,要进度有变化再去刷新,且保证频率不得高于系统的刷新频率。 避免非必要的刷新 若控件不可见,则无需刷新。 开启硬件加速 原理可见 Android硬件加速原理与实现简介,理解Android硬件加速原理的小白文 Application 级别 <application android:hardwareAccelerated 监控 《Android 应用性能优化最佳实践》2.8 章,主要利用 MainLooper 里的 Printer。
布局优化的思路很简单,尽量减少布局文件的层级,看过系统源码的都知道,Android view绘制都是逐层绘制的,所以布局的层级少了,decodeview的时候绘制工作自然就少了。 那么如何进行布局的优化呢? 2、减少视图层级<merge /> <merge/>标签在UI的结构优化中起着非常重要的作用,它可以删减多余的层级,优化UI。 这时可以使用<merge/>标签优化。 另一个方面,onDraw不要做耗时操作,在google的优化典范中,view的绘制保证在60fps为最佳,这就要求每一帧的时间不超过16ms.
解析慢,并非 LocalDNS 最大的问题,它还存在一些更为严重的问题,例如:DNS 劫持、DNS 调度不许确(缓存、转发、NAT)致使性能退化等等,这些才是网络优化最应该解决的问题。 想要优化 DNS,如今最简单成熟的方案,就是使用 HTTPDNS(也可以叫IP直连)。 今天就来聊聊,DNS、HTTPDNS,以及在 Android 下,如何使用 OKHttp 来集成 HTTPDNS。 OkHttp 是一个处理网络请求的开源项目,是 Android 端最火热的轻量级网络框架。在 OkHttp 中,默认是使用系统的 DNS 服务 InetAddress 进行域名解析。
对已上线的项目能够进行优化分析,打造精品。 接下来我们将介绍渲染的底层机制,并针对性地进行优化分析。 渲染机制 视觉感官 我们都可能听过Android的屏幕刷新频率是60fps 也就是16ms需要完成一帧的刷新。 首先我们理解一下帧的概念。 这是一个很费时的操作,GPU的引入就是为了加快栅格化的操作 Android在性能优化已经做了很多工作。在CPU将Ploygons和Texture传递到GPU是一个很耗时的过程。 那么怎么来分析我们的计算优化呢? 首先一个很简单,可以看看是否在执行某个操作的时候,过分的压榨了CPU的使用率,我们通过Android Monitor可以看到瞬时的CPU的使用率。 1)通过AS的Tools-Android-Android Device Monitor调起 ?
Bitmap优化 一个进程的内存可以由2个部分组成:native和dalvik dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的。 在Android应用里,最耗费内存的就是图片资源。 在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。 public void click(View view) { Intent intent = new Intent(); intent.setAction("android.intent.action.PICK "); intent.addCategory("android.intent.category.DEFAULT"); intent.setType("image/*");
Android系统中GC内存泄漏的原因 主动回收内存System.gc();、getruntime.runtime.gc 导致内存泄漏主要的原因是,申请了内存空间而忘记了释放。 (解决方法) 内存缓存的时候可能内存溢出,因为Android默认给每个app只分配16M的内存,,每个手机不一样,我的手机是3G内存,分配的内存是29m,通过这样可以获得 int maxMemory 生成APK的时候,aapt工具本身会对png做优化,但是在此之前还可以使用其他工具如tinypng对图片进行进一步的压缩预处理。 布局的优化 尽量重用一个布局文件,使用include标签,多个相同的布局可以复用 减少一个布局的不必要节点 尽量使用view自身的参数,例如:Button,有一个可以把图绘制在左边的参数:android 代码优化 这部分就是是细微的优化,但是细微多了也就内存节约了 任何一个Java类,包括内部类、匿名类,都要占用大概500字节的内存空间。
Android的应用被限制为最多占用16m的内存,至少在T-Mobile G1上是这样的(当然现在已经有几百兆的内存可以用了——译者注)。它包括电话本身占用的和开发者可以使用的两部分。 Android能在内存中保持的应用越多,用户在切换应用的时候就越快。 作为我的一项工作,我仔细研究了Android应用的内存泄露问题,大多数情况下它们是由同一个错误引起的,那就是对一个上下文(Context)保持了长时间的引用。 在一个合格的Android应用中,你通常能够用到两种上下文(Context):活动(Activity)和应用(Application)。 这样的结果就是Android会从资源中重新载入应用的UI。现在想象一下,你写了一个应用,有一个非常大的位图,并且你并不想在每次旋转时都重新载入。
对象的内存在分配之后无法通过程序的执行逻辑释放对该对象的引用,不能被回收该对象所占内存 内存泄漏的危害 1、 引起OutOfMemoryError 2、 内存占用高时JVM虚拟机会频繁触发GC, 影响程序响应速度 3、内存占用大的程序容易被各种清理优化程序中止 ,用户也更倾向于卸载这些程序 Android应用的开发语言为Java,每个应用最大可使用的堆内存受到Android系统的限制 Android每一个应用的堆内存大小有限 1、 通常的情况为16M 没有的可以去http://www.eclipse.org/mat/downloads.php安装一下MAT 在Android 的调试环境DDMS下,找到Heap dump ? ? 例如View#setTag(int, Object)的内存泄漏https://code.google.com/p/android/issues/detail? 其他内存泄漏 1、Android DigitalClock引起的内存泄漏http://code.google.com/p/android/issues/detail?
,我这是主要是针对于Android平台来说的。 二是通用的Android性能优化,如同步改异步,各种缓存的使用等 三是应用程序内部的性能优化,如内部逻辑、数据插入及查找、数据结构的安排与组织等 以下部分针对于上述3种类型,分别进行简要说明: 基本优化策略 原文参考:Performance Tips 译文参考:Android应用开发者指南:性能优化(1) 其它参考:Android开发性能优化简介 总体上来说,想要写出高效代码,我们要遵循两条基本的原则: 不作没有必要的工作 性能优化 布局优化 (原文参考:ImprovingLayout Performance) 尽量减少Android程序布局中View的层次,View层次越多,效率就越低 使用<include/>复用布局 使用ViewStub懒加载布局 (TODO:Android布局技巧:使用ViewStub提高UI性能) 使用ViewHolder、Thread使ListView滚动更加流畅 其它优化点 合理使用异步操作
讲到Android开发,就不得不谈一下Android的优化,不管是平时开发中我们需要注意的一些Android对Java的一些类的优化,还是实际开发中对性能的优化,其实早在15年的google全球大会上google 就Android的性能优化就给我们做了很好的介绍:点击打开链接。 接下来本文从几个方面入手讲一讲Android 的优化,主要从以下几点:布局优化,绘制优化,内存优化,响应速度优化,bitmap优化(主要结合listview),线程优化,其他常用性能优化;内存检测工具mat Android Lint 可以通过扫描和检查对Android工程可能存在的问题进行审查。通过AS的Analyze->Inspect Code可以打开该工具。 说完了Android的渲染,我们再来看看Android的OverDraw是什么鬼玩意。 我们可以通过打开手机的过渡绘制调试来看我们的布局是否有过渡绘制。
Android系统中GC内存泄漏的原因 主动回收内存System.gc();、getruntime.runtime.gc 导致内存泄漏主要的原因是,申请了内存空间而忘记了释放。 (解决方法) 内存缓存的时候可能内存溢出,因为Android默认给每个app只分配16M的内存,,每个手机不一样,我的手机是3G内存,分配的内存是29m,通过这样可以获得 int maxMemory = 生成APK的时候,aapt工具本身会对png做优化,但是在此之前还可以使用其他工具如tinypng对图片进行进一步的压缩预处理。 布局的优化 尽量重用一个布局文件,使用include标签,多个相同的布局可以复用 减少一个布局的不必要节点 尽量使用view自身的参数,例如:Button,有一个可以把图绘制在左边的参数:android 代码优化 这部分就是是细微的优化,但是细微多了也就内存节约了 任何一个Java类,包括内部类、匿名类,都要占用大概500字节的内存空间。
腾讯云顾问从安全、可靠、服务限制几个维度帮助您优化云基础设施,以提升系统安全性以及服务可靠性。结合腾讯云多年服务客户沉淀的最佳实践,一键完成云资源的巡检操作,根据业务实际使用情况,在线提供资源优化建议,高效提升业务连续性。
扫码关注云+社区
领取腾讯云代金券