类/复杂或者不能从方法名字看出意图的方法必须添加注释java
/**
* @Author: LiuJinYang
* @CreateDate: 2020/5/16 9:32
* 网络请求工具类
*/
public class RetrofitUtil {
/**
* 添加公参basic
*
* @param key 公参字段名
* @param value 公参值
*/
public void addBasic(String key, String value) {
basicMap.put(key, value);
}
}
复制代码
参数名,能够和成员变量名相同,但要注意引用成员变量时,须要加上 this 字段android
正确的英文拼写和语法可让阅读者易于理解, 避免歧义。纯拼音命名方式也不要使用。算法
Activity 的 layout 以 module_activity 开头
Fragment 的 layout 以 module_fragment 开头
Dialog 的 layout 以 module_dialog 开头
include 的 layout 以 module_include 开头
ListView 的行 layout 以 module_list_item 开头
RecyclerView 的 item layout 以 module_recycle_item 开头
GridView 的 item layout 以 module_grid_item 开头
复制代码
模块名_业务功能描述_控件描述_控件状态限定词, 如:module_login_btn_pressed,module_tabs_icon_home_normal数据库
模块名_逻辑名称_[方向|序号],如 module_fade_in , module_fade_out , module_push_down_in缓存
模块名_逻辑名称_颜色,如: #33b5e5e5安全
模块名_描述信息,如:1dp性能优化
模块名_逻辑名称,如:moudule_login_tips,module_homepage_notice_descmarkdown
推荐使用小写字母并用下划线进行分割,View 组件的资源 id 建议以 View 的缩写做为前缀。经常使用缩写表以下:网络
LinearLayout ll
RelativeLayout rl
ConstraintLayout cl
ListView lv
ScollView sv
TextView tv
Button btn
ImageView iv
CheckBox cb
RadioButton rb
EditText et
复制代码
Android 基 本 组 件 指 Activity 、 Fragment 、 Service 、 BroadcastReceiver 、ContentProvider 等等。session
Activity 间的数据通讯, 对于数据量比较大的,避免使用 Intent + Parcelable的方式,能够考虑 EventBus/RxBus 等替代方案,以避免形成 TransactionTooLargeException。
Activity 间经过隐式 Intent 的跳转,在发出 Intent 以前必须经过 resolveActivity检查,避免找不到合适的调用组件,形成 ActivityNotFoundException 的异常。
避免在 Service#onStartCommand()/onBind()方法中执行耗时操做,若是确
实有需求,应改用 IntentService 或采用其余异步机制完成。
应该建立 IntentService 完成,而不该该在 BroadcastReceiver 内建立子线程去作。
BroadcastReceiver 的 App 接收。
和发送,LocalBroadcastManager 安全性更好,同时拥有更高的运行效率。
和 unregisterReceiver()要成对出现。
销毁和中止,由于 onDestroy()执行的时机可能较晚。可根据实际须要,在Activity的onPause()/onStop()中结合 isFinishing()的判断来执行。
(onRestart)别的 Activity,因此在 onPause方法中不适合作耗时较长的工做,这会影响到页面之间的跳转效率。
可避免各类复杂的设置。
改用 RelativeLayout,能够有效下降嵌套数。
Dialog/AlertDialog,这样便于随Activity生命周期管理对话框/弹出浮层的生命周期。
禁止在非 UI 线程进行 View 相关操做。
禁止在设计布局时屡次为子 View 和父 View 设置一样背景进而形成页面过
度绘制,推荐将不须要显示的布局进行及时隐藏。
样会把 ListView 的全部 Item 都加载到内存中,要消耗巨大的内存和 cpu 去绘制图面。
请使用 Intent 等机制,也可以使用 SharedPreferences 等数据持久化机制。
方法中不管这项 convertView 的每一个子控件是否须要设置属性(好比某个 TextView 设置的文本可能为 null,某个按钮的背景色为透明,某控件的颜色为透明等),都需 要为其显式设置属性(Textview 的文本为空也须要设置 setText(""),背景透明也须要 设置),不然在滑动的过程当中,由于 adapter item 复用的缘由,会出现内容的显示错 乱。
缓存为 1MB),可能致使 OOM。
初始化。特别是后台进程减小没必要要的业务初始化。
public class MyApplication extends Application {
@Override
public void onCreate() {
//在全部进程中初始化
....
//仅在主进程中初始化
if (mainProcess) {
...
}
//仅在后台进程中初始化
if (bgProcess) {
...
}
}
}
复制代码
或者其余形式自定义的线程池),不容许在应用中自行显式建立线程。
式,这样的处理方式让写的同窗更加明确线程池的运行规则,规避资源耗尽的风险。
主线程中调用。
public class MyThread extends Thread {
public MyThread(){
super.setName("ThreadName");
…
}
}
复制代码
线程能被释放。
禁 止 在 多 进 程 之 间 用 SharedPreferences 共 享 数 据 , 虽 然 可 以(MODE_MULTI_PROCESS,已过期),但官方已不推荐。
谨慎使用 Android 的多进程,多进程虽然可以下降主进程的内存压力,但
会遇到以下问题: 1) 首次进入新启动进程的页面时会有延时的现象(有可能黑屏、白屏几秒,是白屏仍是黑屏和新 Activity 的主题有关); 2) 应用内多进程时,Application实例化屡次,须要考虑各个模块是否都须要在全部进程中初始化。
任什么时候候不要硬编码文件路径,请使用 Android 文件系统 API 访问。
当使用外部存储时,必须检查外部存储的可用性。
应用间共享文件时,不要经过放宽文件系统权限的方式去实现,而应使用
FileProvider。
复杂数据类型建议使用文件、数据库等其余方式存储。
数据库 Cursor 必须确保使用完后关闭,以避免内存泄漏。
多线程操做写入数据库时,须要使用事务,以避免出现同步问题。
执行 SQL 语句时,应使用 SQLiteDatabase#insert()、update()、delete(),
不要使用 SQLiteDatabase#execSQL(),以避免 SQL 注入风险。
信任的外部数据直接拼接在原始 SQL 语句中。
png 图片使用 TinyPNG 或者相似工具压缩处理,减小包体积。
使用完毕的图片,应该及时回收,释放宝贵的内存。
Bitmap bitmap = null;
loadBitmapAsync(new OnResult(result){
bitmap = result;
});
...使用该 bitmap...
// 使用结束,在 2.3.3 及如下须要调用 recycle()函数,在 2.3.3 以上 GC 会自动管理,除非你明确不须要再用。
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
bitmap.recycle();
}
bitmap = null;
复制代码
public void onPause() {
//页面退出,及时清理动画资源
mImageView.clearAnimation()
}
复制代码
务处理。例如 Activity 的onStop() 函数已经执行, 且在该函数中主动释放了资源, 此时回调中若是不作判断就会空指针崩溃。
存占用。
体积。
将 android:allowbackup 属性必须设置为 false,阻止应用数据被导出。
若是使用自定义 HostnameVerifier 实现类,必须在 verify()方法中校验服务
器主机名的合法性,不然可能受到中间人攻击;若是使用自定义X509TrustManager 实现类,必须在 checkServerTrusted()方法中校验服务端证书的合法性,不然可能受到中间人攻击。
HostnameVerifier hnv = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
if("yourhostname".equals(hostname)){
return true;
} else {
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
return hv.verify(hostname, session);
}
}
};
复制代码
件的修改作更多的保护。
ContentProvider 等)都不该在没有严格权限控制的状况下,将android:exported 设置为 true。
WebView#getSettings()#setAllowFileAccessFromFileURLs(false) 、 WebView#getSettings()#setAllowUniversalAccessFromFileURLs(false),阻止 file scheme URL 的访问。
不要把敏感信息打印到 log 中。
确保应用发布版本的 android:debuggable 属性设置为 false。
本地加密秘钥不能硬编码在代码中,更不能使用 SharedPreferences 等本
地持久化机制存储。应选择 Android自身的秘钥库(KeyStore)机制或者其余安全 性更高的安全解决方案保存。
会致使恶意代码的攻击。在 Android 4.2(API Level 17)如下, 不该再使用这样的调用方式。在 Android 4.2 及以上, 须要对本地被远程调用的方法显式添加@JavascriptInterface annotation。
应使用 CBC 或 CFB 加密模式; MD5 和 SHA-一、SHA-256 等经常使用算法是 Hash 算法,有必定的安全性,但不能代替加密算法。敏感信息的存储和传输,须要使用专业的加密机制。
加密模式有 ECB、CBC、CFB、OFB 等,其中 ECB 的安全性较弱,若是使用固
定的密钥,相同的明文将会生成相同的密文,容易受到字典攻击,建议使用 CBC、
CFB 或 OFB 等模式。
1) ECB:Electronic codebook,电子密码本模式
2) CBC:Cipher-block chaining,密码分组连接模式
3) CFB:Cipher feedback,密文反馈模式
4) OFB:Output feedback,输出反馈模式
复制代码
Android APP 在 HTTPS 通讯中,验证策略须要改为严格模式。
在 Android 4.2(API Level 17)及以上,对安全性要求较高的应用可在 Activity中,对 Activity 所关联的 Window 应用 WindowManager.LayoutParams.FLAG_SECURE, 防止被截屏、录屏。但要注意的是,一个 Activity 关联的 Window 可能不止一个,若是使用了 Dialog / DialogFragment 等控件弹出对话框,它们自己也会建立一个新的 Window,也同样须要保护。
不容许出现两段相同的逻辑块, 必须抽出为公共方法, 差别性使用参数控制, 避免修改时多处修改致使遗漏;
不容许出现两段相同的处于同一逻辑组的复杂布局, 必须抽为单独的include/merge;
不容许Activity内多Fragment之间的直接沟通, 必须经过Activity中转;
采用模块分类方式替代文件类别方式, 方便快速查找模块相关内容, 例: LoginActivity/LoginPreenter/LoginHttpRequest/LoginBean/LoginAdapter等所属同一登陆模块的文件放入一个文件夹, 而不是全部activity放入一个文件夹, 全部adapter放入一个文件夹。
全部新定义的类/方法, 默认写成private, 只有在其余类须要引用时再看状况标为public, protected, package-private;
java定义的父类中定义的方法若是子类重写会致使问题时, 添加final关键字;
不能使用 System.out.println 打印 log。
Log 的 tag 不能是" "。
项目创建REWADME.md文件,书写版本迭代中较重要的修改,包括需求修改,代码修改,三方库引用等;
阿里巴巴 Android 开发手册