android 提升性能相关

1.尽量少的声明全局变量

2.声明全局静态变量,一定要加final声明

3.声明非静态的全局变量,最好不要初始化任何值,在使用到的地方,在进行初始化

4.函数中若干次使用全局变量,应该将全局变量赋值给本地变量,然后直接使用本地变量

5.能用Int,不要使用浮点数

6.能用乘法不用除法

7.尽量避免使用geter和setter方法

8.在Activity的onCreate函数中,尽量做少的事。

9.在Activity中声明的静态数组或者静态代码块,重构到单独的一个类里。

10.布局文件要尽可能的优化,减少布局的解析时间 。 尽量减少布局的嵌套层次

11.Activity启动后开始进行异步线程的加载,最好delay一下。再开启线程

12.对于存在于集合中的Bean对象,尽可能少的声明变量。能用int 就不要用long.声明的string等复杂变量,最好不要进行初始化。

13.使用线程,一定要给它传一个名字,然后需要定义线程的优先级

14.在使用集合的时候,优先选择SparseArray。

Java中每个类(包括匿名内部类)都占用至少 500字节左右的代码;

每个类的实例会在 RAM中占用大约 12 ~ 16 字节的内存;

每向 HashMap中添加一个 Entry 时,新生成的 Entry 占用大约 32 个字节。

15.尽量避免使用枚举

枚举类型 Enum会比静态常量占用更多的内存;

16.工具方法尽量写成是静态方法

17.线程间同步尽量使用开销小的同步锁

18.在使用集合类的时候,如果已知数据的规模,在初始化的时候,就设定好默认大小。

19.私有内部类访问外部类的私有变量,要将变量修改为包继承权限

20.对于开销大的算法,且不止是执行一次的,要使用缓存策略

21.避免在绘制或者解析布局的时候,分配对象。例如onDraw方法

22.不要给布局写无用的参数,例如RelativeLayout,写layout_weight属性

23.尽量减少布局的嵌套层数。例如包含一个ImageView和TextView的线性布局,可以用CompoundDrawable的TextView来代替

24.尽量用Android提供的SparseArray来代替HashMap

25.如果LinearLayout用于嵌套的layout空间计算,它的android:baselineAligned设置为false,可以加速layout计算

26.用FloatMath代替Math

27.尽量避免嵌套的使用layout_weight,那样会影响执行效率

28.如果为rootView设置了背景,那么会先用Theme指定的背景绘制一遍,然后才用指定的背景绘制,这叫做"overdraw",可以通过theme的background为null来避免

29.不要有无用的任何资源或者文件

官网文章

如何控制应用程序使用的内存?

1.记得关闭启动的服务

当服务中的任务完成后,要记得停止该服务。可以考虑使用 IntentService,因为IntentService 在完成任务后会自动停止。

2. UI不可见时释放资源

在 onStop中关闭网络连接、注销广播接收器、释放传感器等资源;

在 onTrimMemory()回调方法中监听TRIM_MEMORY_UI_HIDDEN 级别的信号,此时可在 Activity 中释放 UI 使用的资源,大符减少应用占用的内存,从而避免被系统清除出内存。

3.内存紧张时释放资源

运行中的程序,如果内存紧张,会在 onTrimMemory(int level)回调方法中接收到以下级别的信号:

TRIM_MEMORY_RUNNING_MODERATE:系统可用内存较低,正在杀掉 LRU缓存中的进程。你的进程正在运行,没有被杀掉的危险。

TRIM_MEMORY_RUNNING_LOW:系统可用内存更加紧张,程序虽然暂没有被杀死的危险,但是应该尽量释放一些资源,以提升系统的性能(这也会直接影响你程序的性能)。

TRIM_MEMORY_RUNNING_CRITICAL:系统内存极度紧张,而LRU缓存中的大部分进程已被杀死,如果仍然无法获得足够的资源的话,接下来会清理掉 LRU 中的所有进程,并且开始杀死一些系统通常会保留的进程,比如后台运行的服务等。

当程序未在运行,保留在 LRU缓存中时, onTrimMemory(int level) 中会返回以下级别的信号:

TRIM_MEMORY_BACKGROUND:系统可用内存低,而你的程序处在 LRU的顶端,因此暂时不会被杀死,但是此时应释放一些程序再次打开时比较容易恢复的 UI 资源。

TRIM_MEMORY_MODERATE:系统可用内存低,程序处于 LRU的中部位置,如果内存状态得不到缓解,程序会有被杀死的可能。

TRIM_MEMORY_COMPLETE:系统可用内存低,你的程序处于 LRU尾部,如果系统仍然无法回收足够的内存资源,你的程序将首先被杀死。此时应释放无助于恢复程序状态的所有资源。

注:该 API在版本 14 中加入。旧版本的onLowMemory() 方法,大致相当于 onTrimMemory(int level) 中接收到 TRIM_MEMORY_COMPLETE 级别的信号。

另:尽管系统主要按照 LRU中顺序来杀进程,不过系统也会考虑程序占用的内存多少,那些占用内存高的进程有更高的可能性会被首先杀死。

4.确定你的程序应该占用多少内存

可以通过 getMemoryClass()来获取你的程序被分配的可用内存,以 M 为单位。

你可以通过在 标签下将 largeHeap 属性设为 true 来要求更多的内存,这时通过 getLargeMemoryClass() 方法来获取可用内存。

大部分应用程序不需要使用此功能,因此使用该标签前,确认你的程序是否真的需要更多内存。使用更多内存会对整个系统的性能产生影响,而且当程序进入 LRU时会更容易首先被系统清理掉。

5.正确使用 Bipmap,避免浪费内存

如果你的 ImageViwe的尺寸只有 100 * 100,那么没有必要将一张 2560 * 1600 的图片整个加载入内存。

6.使用 Android提供的优化过的数据结构

如 SparseArray, SparseBooleanArray, LongSparseArray 等,相比 Java 提供的 HashMap,这些结构更节省内存。

7.始终对内存使用情况保持关注

枚举类型 Enum会比静态常量占用更多的内存;

Java中每个类(包括匿名内部类)都占用至少 500字节左右的代码;

每个类的实例会在 RAM中占用大约 12 ~ 16 字节的内存;

每向 HashMap中添加一个 Entry 时,新生成的 Entry 占用大约 32 个字节。

8.谨慎使用第三方类库

这些外部类库可能原先并非针对移动平台,因此未进行过优化,在使用前应注意。另外尽量不要因为一两个特性而使用一个体积很大的类库。

9.使用 ProGuard

使用 ProGuard移除无用的代码并重命名一些类、字段、方法等,使你的代码更紧凑,节省内存空间。

10.使用 zipalign

zipaligned对最终打包的 apk进行字节对齐。

注:Google Play不接受未对齐过的 apk。

11.分析内存使用情况

如果已经获得一个相对稳定的版本,应对程序整个生命周期的内存使用状况进行分析。

12.使用多个进程

如果程序需要执行大量的后台工作,可考虑将程序分为两个进程,一个进程负责 UI,另一个进程负责后台任务。比如音乐播放器。

代码示例:

android:process属性的值以“:”开头,名称可任意选取。

在决定是否使用多进程前,应注意,一个不执行任何任务的空进程至少也要占用 1.4 MB内存。

另外要注意进程的相互依赖性,比如如果将 ContentProvider放在 UI 进程中,而后台任务进程也需要调用 ContentProvider,就会导致 UI 进程一直保留在 RAM 中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,158评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,600评论 1 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,785评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,655评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,075评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,002评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,146评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,918评论 0 211
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,671评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,838评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,318评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,636评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,343评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,187评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,982评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,126评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,934评论 2 279

推荐阅读更多精彩内容