zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

android 编程规范 check list

AndroidList编程 规范 check
2023-09-14 09:03:12 时间

ViewStub推迟初始化是个方便的技术,可以推迟实例化,提高性能,还可能会节省内存


如果你添加了可利用的庞大图像资源,需要装入和调整大小,就无法有效地使用其他的应用程序资源


从外部获取数据(Dex, Html, Apk)时,一定要校验数据可靠性,防止数据被第三方而已篡改


manifest中activity节点若非必要,不要添加intent-filter(添加就意味着可以被外部其他应用或进程启动)


从安全角度不要使用Broadcast,广播的传播性是不可控的,而且容易被劫持,信息被截取。(应用内广播可以参考supportV4包中的LocalBroadcastManager。)


在代码中小心使用Runtime.exec方法,尤其是运行参数由用户输入产生时,一定要验证参数的合理合法性


谨慎使用service,service无job第一时间关闭service,让service在不必要的情况下运行是内存管理上最大的错误之一


service启动之后,系统会一直保持service的运行,service占用的内存会一直无法释放


只要当前屏幕显示需要时,才将Bitmap放入内存,如果原Bitmap的分辨率偏高,就把它缩写


使用Android优化过的集合,比如: SparseArray, SparseBooleanArray,andLongSparseArray 


Java中的HashMap在内存方面相当低效,每个KV对都需要分配一个Map.Entry来存放,向HashMap中存放一个Entry会分配一个额外的Entry,占用大概32 字节


通常抽象被看做是一种好的编程习惯,但是抽象有很大的开销:需要执行更多的代码、执行更长时间、占用更多内存。


pb是google的平台独立、语言独立、可扩展的序列化工具;相对于XML更小、更快、更简单。


依赖注入框架能简化代码,为测试、修改配置等提供很方便的环境。但是,但这些框架会有很多扫面注解的初始化,这些工作很耗时并且占用大量内存。


大部分第三方类库不是针对移动客户端设计,如果在移动设备上使用并不高效。至少在使用前,你应该对这些类库进行优化。


一个什么都不运行的空进程大概占用1.4MB内存,一个只运行了一个非常非常简单的界面的进程会占用4M内存


Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成


避免Overdraw(过度绘制),避免屏幕上的某个像素在同一帧的时间内被绘制了多次。


会浪费大量的CPU以及GPU资源,可以在开发者选项,打开Show GPU Overdraw的选项,可以观察UI上的Overdraw情况。 


会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,也会触发GC,GC发生的时候,所有的线程都是暂停状态的


某些非必须马上执行的操作,例如上传歌曲,图片处理等,可以等到设备处于充电状态或者电量充足的时候才进行


平均只有30%左右的电量是被程序最核心的方法例如绘制图片,摆放布局等等所使用掉的,剩下的70%左右的电量是被上报数据,检查位置信息,定时检索后台广告信息所使用掉的。


触发闹钟的时间不必过度精确; 尽量使用setInexactRepeating()方法替代setRepeating()方法


使用setInexactRepeating()时,Android系统会集中多个应用的重复闹钟同步请求,并一起触发它们。这可以减少系统将设备唤醒的总次数,以此减少电量消耗


类初始化时若引用了静态final常量不再需要执行clinit()方法,常量已直接使用到dex文件里


C++或者Java和C#中推荐使用方法封装变量的访问,通过内联技术可以优化变量的访问速度。但是Android中方法调用时比较耗费资源的,因此对外部类可以通过方法调用范文属性,但是类的内部可以直接使用属性。
没有JIT(Just in time及时编译)时,直接访问比getter快3X倍,有JIT时快7X倍


系统函数有时可以替代第三方库,并且还有汇编级别的优化,他们通常比带有JIT的Java编译出来的代码更高效


网络操作相对来说是比较耗电的行为,激活瞬间,发送数据的瞬间,接收数据的瞬间都有很大的电量消耗


可以针对Sensor的数据做批量处理,待数据累积一定次数或者某个程度的时候才更新到UI上


为了确保所有的对象能够正确被释放,我们需要保证加入对象池的对象和其他外部对象没有互相引用的关系


PNG能够提供更加清晰无损的图片,JPEG就可以达到视觉效果的,可以考虑采用JPEG即可,Webp,它是由Google推出的一种既保留png格式的优点,又能够减少图片大小的一种新型图片格式


Android提供了现成的bitmap缩放的API,叫做createScaledBitmap(),使用这个方法可以获取到一张经过缩放的图片


新解码的bitmap会尝试去使用之前那张bitmap在heap中所占据的pixel data内存区域,而不是去问内存重新申请一块区域来存放bitmap


Android4.4前的系统使用webview会出现ashmem的内存泄露,另起一个新的进程来启动webview的activity,activity销毁的时候,调用System.exit(0),退出进程,彻底释放内存


本身android在启动过程当中就会解析assert文件放到相应的map里,采用这种方式则会导致对所有class进行搜索并找到相应的类,加上android所有代码是打在一个apk里,则搜索的速度则相当慢


可以通过Package Manager的setComponentEnableSetting启动停止Manifest里的Receiver/activity/service,已减少不必要的开销


如果Handler是个内部类,那 么它也会保持它所在的外部类的引用。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。
private static class MyHandler extends Handler {
        private WeakReference SettingActivity  mActivity;
        public MyHandler(SettingActivity activity){
            mActivity = new WeakReference SettingActivity (activity);
        }
        public void handleMessage(android.os.Message msg) {......}


start方式启动Service导致服务一直存在比较耗费资源,bind方式可以使Service随Activity启动和终止,并提供方便的交互接口


使用Intent.resolveActivity(getPackageManager()) != null判断是否有应用处理intent


避免直接加载超清图片到内存,通过缩放decodeResource技术加载使用平台显示分辨率即可


尽量避免Polling方式轮训,可以使用长链接推送框架替代,即使必须使用考虑用最低的频率


如果你的方法是返回string并且返回值会被append到一个StringBuffer上,请调整设计,避免创建临时存在在对象


通过一个对象同时存储对象A和B不如分别通过两个数组存储A和B性能好,当然如果封装A和B是为了其他地方更好的引用那么可以忽略这部分影响


private的内部类访问外部类的private属性时,通常认为不合法,但VM会自动添加静态方法实现能够访问


Traceview分析时会禁止JIT,容易导致执行时间分析的不准确,多耗费的时间可能因为JIT编译而优化掉


layout嵌套场景使用layout_weight属性会很耗费性能,在使用ListView和GridView时更要注意


Android逆向:resource.arsc文件解析(Config List) resource.arsc是APK打包过程中生成一个重要的文件,主要存储了整个应用哦中的资源索引。但是这个文件是一个二进制文件,并不可读,所以本文就通过解析它的二进制内容来读懂这个文件。
《Android高性能编程》| 每日读本书 广泛覆盖了开发最优App所涉及的各种话题,深度探索本地编码,拒绝性能故障及粗放型资源利用的专业级Android开发人员的必备书目。每日搜罗最具权威专业书籍,更多图书请关注“每日读本书”。
响应式在前端领域已经变得十分流行,很多主流框架都采用响应式来进行页面的展示刷新。本文主要是探索一下响应式在移动端Android上的一些实践,包括对响应式思想的理解,以及目前Android上实现响应式的一些手段,最后聊聊响应式在Android开发上的一些应用。
昨天刚把socket tcp编程简单讲解了,今天趁热打铁把udp编程也讲一下。一个是为了提醒自己,坚持下去,另外还是为了提升技术打下基础。如果讲的有什么不对的还请各位指正。
之前一直对socket编程这块比较陌生,并且在刚开始工作的时候比较抗拒。其实,都是因为当时自己比较菜,这块比较难处理,在舒适区呆的习惯了。所以,还是应该让自己走出舒适区,多接触一些陌生的区域。
android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档 前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xstream 二: 把对象转换成xml android XMl 解析神奇xstream 三:...
Android BottomSheet:List列表或Grid网格展示(3) BottomSheet可以显示多种样式的底部弹出面板风格,比如常见的List列表样式或者Grid网格样式,以一个例子说明。