Android 项目优化(七):阿里巴巴Android开发手册整理总结

本来之前觉得Android项目优化系列的文章基本整理完毕了,但是近期又看了一下阿里Android开发手册有了很多收货,想再整理一篇,下面就开工吧。

先在这里列一下之前整理的文章及链接:

Android 项目优化(一):项目代码规范优化

Android 项目优化(二):启动页面优化

Android 项目优化(三):MultiDex 优化

Android 项目优化(四):内存优化

Android 项目优化(五):应用启动优化

Android 项目优化(六):项目开发时优化技巧总结

下面是《阿里巴巴Android开发手册》为我们提供的开发建议。

一、Android 基本组件开发规范

1. Activity 开发

必须要遵守的开发规范如下:

a). Activity 间数据通信,对于数据量比较大的,避免使用Intent + Parcelable的方式,可以考虑使用EventBus等替代方案,以免造成TransactionTooLargeException异常。

b). Activity 间通过隐式的Intent跳转,在Intent发出去之前必须使用resolveActivity检查,避免找不到合适的调用组件,造成ActivityNotFoundException异常。

c). Activity 动态注册BroadCastReceiver时,registerReceiver和unregisterReceiver方法要成对出现,且生命周期对应。(否则会导致内存泄漏,部分华为机型对receiver进行资源管控,单个应用注册过多receiver会触发管控模块抛出异常,可能会导致应用崩溃。)

建议的遵守的开发规范如下:

a). 不要在Activity的onDestroy()内执行释放资源的工作,例如一些工作线程的销毁和停止。因为onDestroy执行的时机可能较晚了,可以根据时机需要在Activity的onPause或onStop方法中结合isFinishing来判断执行相应的逻辑。

b). 当前Activity的onPause方法执行结束后才会创建(onCreate)或恢复(onRestart)别的Activity,所以在onPause方法中不适合做耗时较长的操作,耗时较长的操作会影响页面之间的跳转效率。

c). Activity的onSaveInstanceState方法不是Activity生命周期方法,也不保证一定会被调用。它是用来在Activity被意外销毁时保存UI状态的,只能用于保存临时数据,例如UI控件的属性,不能用于数据持久化的存储控制。持久化存储应该在Activity的onPause/onStop中实行。

2. Service 开发

必须要遵守的开发规范如下:

a). 避免在Service的onStartCommand/onBind方法中执行耗时操作,如果确实有需求,应改为IntentService或者采用其他异步机制完成。

建议的遵守的开发规范如下:

a). Service需要以多线程并发处理多个启动请求,建议使用IntentService,可避免各种复杂的配置。

b). 建议总是使用显式的Intent启动或者绑定Service,且不要为Service声明Intent Filter,保证应用的安全性。如需要隐式调用,建议设置Intent的指定包名,这样可以充分消除目标Service的不确定性。

3. BroadCastReceiver开发

必须要遵守的开发规范如下:

a). 避免在BroadCastReceiver的onReceive方法中执行耗时操作,如果有耗时工作,应该创建IntentService完成,而不应该在BroadCastReceiver内创建子线程去做。

b). 避免使用隐式的Intent广播敏感信息,信息可能被其他注册了对应的BroadCastReceiver的App接收。如果广播仅限于应用内,可使用LocalBroadcastManager的sendBroadcast实现,避免敏感信息外泄和Intent拦截的风险。

建议的遵守的开发规范如下:

a). 对于只用于应用内的广播,优先使用LocalBroadcastManager来注册和发送,LocalBroadcastManager安全性更好,能避免敏感信息外泄和Intent拦截的风险,同时拥有更高的运行效率。

二、UI 与 布局开发规范

必须要遵守的开发规范如下:

a). 布局中不得不使用ViewGroup多重嵌套时,不要使用LinearLayout嵌套,改用RelativeLayout,可以降低嵌套层数。

说明:Android 应用页面的任何一个View都需要经过measure、layout、draw三个步骤才能被正确的渲染。嵌套层级越多,带来的measure次数越多,计算就会越费时。

b). 不要在非UI线程进行View相关的操作。

c). 不能用ScrollView包裹ListView/GridView/ExpandableListView,因为这样会把ListView的所有Item都加载到内存中,需要消耗巨大的内存和CPU去绘制画面。这里推荐使用NestedScrollView。

d). 在使用Adapter的时候,如果你使用了ViewHolder做缓存,在getView()的方法中,无论这项convertView的每个子控件是否需要设置属性,都要显式的设置属性(包括文本内容、背景色及其他属性),否则在滑动中,因为adapter item复用的原因,会出现内容的显示错乱。

建议的遵守的开发规范如下:

a). 在Activity中显示对话框或弹出浮层时,尽量使用DialogFragment,而非Dialog/AlertDialog,这样便于随Activity生命周期管理对话框/弹出浮层的生命周期。

b). 推荐文本大小使用:dp单位。推荐View大小使用:dp单位。因为:sp是Android早期推荐使用的,但sp即受屏幕密度影响又受到系统字体设置影响,dp相对能保证UI的一致性。

c). 尽量避免在Activity没有完全显示时显示PopupWindow和Dialog。

d). 尽量不要用AnimationDrawable实现帧动画(尤其图片多的时候),它在初始化时会将所有图片加载到内存,非常消耗资源(低端机可能直接OOM),且不能释放,释放后下次加载会报错。

三、进程、线程与消息通信开发规范

必须要遵守的开发规范如下:

a). 不要通过Intent在Android基础组件之间传递大数据,否则可能会导致OOM。

b). 在Application的业务初始化代码加入进程判断,确保只在自己需要的进程初始化。特别是后台进程减少不必要的业务初始化。

c). 新建线程时,必须通过线程池提供(AsyncTask或者ThreadPoolExecutor或者其他形式的线程池),不允许在应用中自行创建线程。

说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致内存消耗完或者过度切换的问题。另外,创建匿名线程不便于后续的资源使用的分析,对性能分析会造成困扰。

d). 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的方式能够让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

e). 子线程中不能更新界面,更新界面必须在主线程中进行,网络操作不能在主线程中调用。

建议的遵守的开发规范如下:

a). 尽量减少不同App之间的进程通信及拉起行为。拉起会导致占用系统资源,影响用户体验。

b). 新建线程时,定义能识别自己业务的线程名称,便于性能优化和问题排查。

c). 使用线程池是,在业务满足的情况下尽量设置线程的存活时间(setKeepAliveTime),确保线程空闲时能够被释放。

d). 尽量避免在多进程之间用SharePreferences共享数据,虽然可以通过设置MODE_MULTI_PROCESS来实现,但是这种方式官方已经不推荐使用了。

e). 谨慎使用Android的多进程,虽然多进程能降低主进程的压力,但是需要注意以下问题:

  • 首次进入新启动进程的页面会有延迟现象(可能黑屏or白屏几秒)。
  • 应用内多进程时,Application实例化多次,需要考虑各个模块是否需要在所有进程中初始化。

四、文件与数据库开发规范

必须要遵守的开发规范如下:

a). 任何时候都不要硬编码文件路径,请使用Android文件系统API访问(硬编码存在机型兼容问题)。

b). 当使用外部存储时,必须检查外部存储的可用性。

c). 应用间共享文件时,不要通过放宽文件系统的权限去实现,而是应该使用FileProvier。

d). 数据库Cursor必须确保使用完后关闭,以避免内存泄漏。

e). 多线程写入数据库时,需要使用事务,以免出现同步问题。

f). 执行SQL时,应该使用SQLiteDataBase的insert、update、delete方法,不要使用execSQL方法,以免SQL注入风险。

g). 如果ContentProvider管理的数据存储在SQL数据库中,应该避免将不受信任的外部数据直接拼接在原始SQL语句中。

建议的遵守的开发规范如下:

a). SharePreference中只能存储简单数据类型(int、boolean、String等),复杂数据类型建议使用文件、数据库等其他存储方式。

b). SharePreference提交数据时,尽量使用apply方法。除非需要确定提交结果,并据此执行后续操作时,才使用commit方法。

c). 将大数据写入数据库时,请使用事务或者其他能提高I/O效率的机制,保证执行速度。

五、Bitmap、Drawable与动画

必须要遵守的开发规范如下:

a). 加载大图或者一次性加载多张图的时候,应该在异步线程中进行。图片的加载,涉及IO操作,以及CPU密集操作,很可能引起卡顿。

b). 在ListView、ViewPager、RecyclerView、GridView等组件中使用图片时,应做好图片的缓存,避免使用持有图片导致内存溢出,也要避免重复创建图片,引起性能问题。推荐使用Fresco、Glide等图片加载库。

c). 在Activity的onPause方法或onStop方法中,关闭当前Activity正在执行的动画。

建议的遵守的开发规范如下:

a). 推荐根据展示实际需要,压缩图片,而不是直接展示原图,这样能提高App的性能。

b). 使用完毕的图片,应及时回收,释放宝贵的内存。(2.3.3及以下版本需要调用recycle方法,2.3.3以上GC会自动管理不需要调用recycle方法)

c). 在动画或者其他异步任务结束时,应考虑回调时刻的环境是否还支持业务处理,并增加相关的空指针等判断逻辑。

d). 谨慎使用Gif,注意限制每个页面同时允许播放的gif图片数量,以及单个gif图片的大小。

e). 根据设备性能,选择性的开启复杂动画,以实现一个整体较优的性能和体验。

六、安全

必须要遵守的开发规范如下:

a). 将android:allowbackup属性必须设置为false,防止应用数据被导出。

说明:android:allowbackup 是Android提供的adb调试功能,如果设置为true,可以导出应用数据并在任意设备上恢复。这会对应用安全性和用户数据隐私构成极大的威胁,所以必须设置为false,防止数据泄漏。

b). 在SDK支持的情况下,Android必须使用v2签名,这将对APK文件的修改做更多的保护。

c). 所有的Android基本组件(Activity、Service、BroadcastReceiver、ContentProvider等)都不应在没有严格权限控制的情况下,将android:exported设置为true。

d). 确保应用发布的版本的android:debuggable属性设置为true。

建议的遵守的开发规范如下:

a). 在Android 4.2以上,对安全性较高的应用可在Activity中,对Activity所关联的Window应用WindowManager.LayoutParams.FLAG_SECURE,防止被截屏、录屏。对于其他的Window的窗口,如Dialog、DialogFragment等,根据需要也进行相应的保护。

原文地址:https://www.cnblogs.com/renhui/p/11977754.html

时间: 2024-08-28 19:03:18

Android 项目优化(七):阿里巴巴Android开发手册整理总结的相关文章

Android 项目优化(五):应用启动优化

介绍了前面的优化的方案后,这里我们在针对应用的启动优化做一下讲解和说明. 一.App启动概述 一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意图下降,或者卸载放弃该应用程序. 应用程序启动有主要分为两种状态,每种状态都会影响应用程序对用户可见所需的时间:冷启动,热启动. 冷启动:冷启动表示用户首次打开应用,这时进程还没创建,包含了Application创建的过程.冷启动时间指从第一次用户点击Launcher中的应用图标开始,到首页内容全部

阿里巴巴Java开发手册———个人追加的见解和补充(一)

先上干货,<阿里巴巴Java开发手册>的下载地址 https://yq.aliyun.com/articles/69327?spm=5176.100239.blogcont69327.158.xUUgiz 下面分几个部分对这个手册进行说明,都是个人的见解,本人技术一般,如果有错误或者不妥,请评论指出,虚心接受,提前感谢了. 建议边看手册,边食用以下说明,效果比较好. 前言 首先当我第一次看见这个的手册的时候或许和和你们是一样激动的,因为在java行业内我还没有看见有中文的规范,也可能是我读书少

阿里巴巴Java开发手册1.4.0

转自官网 前言 <阿里巴巴Java开发手册>是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,系统化地整理成册,回馈给广大开发者.现代软件行业的高速发展对开发者的综合素质要求越来越高,因为不仅是编程知识点,其它维度的知识点也会影响到软件的最终交付质量.比如:数据库的表结构和索引设计缺陷可能带来软件上的架构缺陷或性能风险:工程结构混乱导致后续维护艰难:没有鉴权的漏洞代码易被黑客攻击等等.所以本手册以Java开发者为中心视角,划分为编程规约.异常日志.单元测

阿里巴巴 Java 开发手册 1.4.0

一.编程规约(一) 命名风格1. [强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束.反例: _name / __name / $name / name_ / name$ / name__2. [强制]代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式.说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义.注意,即使纯拼音命名方式也要避免采用.正例: alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同

《阿里巴巴Java开发手册(正式版》读记

前几天,阿里巴巴发布了<阿里巴巴Java开发手册(正式版>,第一时间下载阅读了一番. 不同于一般大厂内部的代码规范,阿里巴巴的这本Java开发手册,可谓包罗万象,几乎日常Java开发中方方面面都有所涉及. 在知乎上,也有关于这本开发手册的讨论十分热烈的帖子. 由于里面涉及的内容比较多,下面重点罗列下一些我读过之后十分赞同与持保留意见的条目: (一)编码规范 (一)命名规约 8. [强制]POJO 类中布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误. 反例:定义为基本数据类型b

读阿里巴巴Java开发手册v1.2.0之编程规约有感【架构篇】

 不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么随意写,好没问题,但是等你离开这个公司了或者是去开发别的项目了,再等别人过来接手维护你一手写出来的这段个性十足的代码时,那么你的右眼皮时不时地就会跳,因果我就不说了~~ 所以我建议看到这篇博文的朋友们,或许你稍微改变一下你的编码风格,遵从一套好的编码规约对己对人都是有好处的.可能朋友的公司也有专门的

阿里巴巴java开发手册pdf

下载地址:网盘下载 编辑推荐 规范了Java开发准则与代码编写习惯 将直接影响Java从业者.求职者和在校相关专业大学生等逾百万的计算机相关人群 以阿里的技术底蕴,以一个独特的视角地成为影响到世界的经典计算机图书 对Java教育教学产生深远影响 对社会贡献及深远影响不可估量 内容提要 <阿里巴巴Java开发手册>的愿景是码出高效,码出质量.它结合作者的开发经验和架构历程,提炼阿里巴巴集团技术团队的集体编程经验和软件设计智慧,浓缩成为立体的编程规范和最佳实践.众所周知,现代软件行业的高速发展对开

阿里巴巴 Java 开发手册评述

2016年底,阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,笔者当时看到的版本为v1.0.2版.下载地址可以在其官方社区--云栖社区找到. 笔者作为一名有数年工作经验的Java程序员,仔细研读了这份手册,觉得是一份不可多得的好材料.正如阿里巴巴在发布时所说,"阿里巴巴集团推出的<阿里巴巴Java开发手册(正式版)>是公司近万名开发同学集体智慧的结晶,以开发视角为中心,详细列举了如何开发更加高效.更加容错.更加有协作性,力求知其然,更知其不然.结合正反例,让Ja

《阿里巴巴Java开发手册》杨冠宝 著 高清pdf

<阿里巴巴Java开发手册> 来自于阿里集团的智慧与经验,用血淋淋的故障换来的总结 阿里经济体全球技术开发准则:阿里经济体全球技术开发准则: 帮助工程师脱离烦琐,重燃技术激情: 降低企业技术沟通成本,提高团队协同研发效能 百度网盘链接: https://pan.baidu.com/s/1ux2diFmIfzFHJxCWF7N_IA 提取码: p3rg ? 内容简介  · · · · · · <阿里巴巴Java开发手册>的愿景是码出高效,码出质量.它结合作者的开发经验和架构历程,提炼