程序猿
“先生不知何许人也,亦不详其姓字。时年二十有二,英俊朗逸,秀发蓬勃。始入IT大厂,朝九晚五,日食三餐。好读书,曰《X语言入门》、《X语言应用实践》、《X语言高阶编程》。
次年,二十有三,英俊尚可,然寡言少语,身影飄忽,秀发日疏。一人一烟一Computer,长坐不起,日复一日。所观者,《编程语言的科学与艺术》、《编程之美》、《编程之道》、《编程之禅》。
而今年约三十,不复俊逸。其目,炯炯然有所虑,其背,日益佝偻,其发,隐约可见地中海。常持杯,与沸水枸杞为伴,嗜书,然所读者与众不同,唤作《颈椎病康复指南》。
观其状,时人不解。或曰,必为程序猿也!”
android采用ChromeIntent方式实现从浏览器启动应用
在很多应用中需要我们从浏览器中直接启动应用,而网上大多数采用的是scheme的方式,即在启动activity的mainfest文件中配置如下字段:
1 | <activity android:name="com.example.MainActivity"> |
然后在网页的连接设置为example://test/… 来启动应用,但是如果手机中没有应用,该url会跳转到一个错误的界面。
google官方在chrome中推出了一种Android Intents的方式来实现应用启动,通过在iframe中设置src为的方式,具体示例如下。
1 | intent:HOST/URI-path // Optional host |
Android渐变色xml文件
在drawable目录下新建drawable resource file,修改xml代码
1 | <?xml version="1.0" encoding="utf-8"?> |
日常代码写作规范及优化建议
批量数据处理
每次读取数据时,批量读取,然后在应用中进行分组、分发,例如:
订单列表页涉及到用户、订单、商品等表,批量把当前页的订单、用户、商品一次性读取回来,然后在应用中进行数据的组装,以减少sql请求量,降低数据库压力,加快操作响应速度。
线程池的使用
建议尽量避免使用
1 | @Async |
注解,因为这个是共享了Spring提供的线程池,大量使用的时候,容易造成线程池溢出,建议使用自定义的线程池,并且估算好以下参数:
- 核心线程数、最大线程数
- 存活时长
- 任务队列及长度
- 自定义ThreadFactory,指定线程名称
- 根据业务指定拒绝策略
HashMap不要在多线程环境下使用
应用默认都是多线程环境的,所以在定义HashMap对象的时候一定要清楚的知道当前有没有多线程的问题
控制数据量大小
每次操作数据的时候,一定要清楚的知道当前操作的数据可能的量,并清楚的知道最大的量是多少、未来的增长数据和空间,以防止引起内存不足,我们的系统的内存大部分是4-8个G;
除非能确定数据量有限且不增长,否则都应该分批操作,保证每批数据的有限性,以防随着数据量大后造成系统风险。
对于需要较长时间的业务,比如导入数据、调用第三方接口之类,最好做成任务类型
Android混淆使用手册
首先,这里说的的混淆其实是包括了代码压缩、代码混淆以及资源压缩等的优化过程。依靠 ProGuard,混淆流程将主项目以及依赖库中未被使用的类、类成员、方法、属性移除,这有助于规避64K方法数的瓶颈;同时,将类、类成员、方法重命名为无意义的简短名称,增加了逆向工程的难度。而依靠 Gradle 的 Android 插件,我们将移除未被使用的资源,可以有效减小 apk 安装包大小。
本文由两部分构成:
- 第一部分给出混淆的最佳实践,力求让零基础的新手都可以直接使用混淆;
- 第二部分会介绍一下混淆的整体、自定义混淆规则的语法与实践、自定义资源保持的规则等。
一、Android混淆最佳实践
1. 混淆配置
一般情况下,app module 的 build.gradle
文件默认会有如下结构:
1 | android { |
因为开启混淆会使编译时间变长,所以debug
模式下不应该开启。我们需要做的是:
- 将
release
下minifyEnabled
的值改为true
,打开混淆; - 加上
shrinkResources true
,打开资源压缩。
修改后文件内容如下:
1 | android { |
Android Activity标签属性
Activity 是 Android 系统四大应用组件之一,用户可与 Activity 提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件等操作
开发者必须在清单文件中声明要使用的 Activity,这样系统才能访问它。声明方式是在 < application > 元素中添加 < activity > 子元素
1 | <application |
可以为< activity >元素设置多个属性值以定义 UI 风格或者运行属性。 android:name 属性是唯一必需的属性,用于指定 Activity 的类名
< activity >包含的属性如下所示
1 | <activity android:allowEmbedded=["true" | "false"] |