项目地址:https://github.com/futurice/android-best-practices#build-system
- 使用Android Studio和Gradle
- 将签名放在
gradle.properties
里面 -
使用静态版本的依赖
以求得运行稳定 即在gradle-denpencies 依赖的版本号后不加上"+" - 构建多个版本
- 在gradle中的buildTypes中增加不同的构建类型,使用
applicationSuffix
和versionNameSuffix
可以生成多个版本在同一设备上运行 - 创建src/[buildType]/res/设置不同的ic_launcher以区别不同版本
- 第三方库
- Json:Jackson
- 网络,缓存和图片加载
- 网络和图片:volley 或者 Retrofit(网络API)+Picasso(图片)+OKhttp(网络请求)
- RxJava
RxJava is a library for Reactive Programming, in other words, handling asynchronous events(处理异步事件)
-
Retrolambda采用Lambda语法(特别适合当我们使用RxJava的时候,需要JDK8之前次啊能使用)
-
考虑dex的方法限制
Android apps, when packaged as a dex file, have a hard limitation of 65536 referenced methods
-
Activities和Fragment
现在关于Activity和Fragment是控制器还是UI之争还没有公认的定论。有以下三点建议
- 不要使用内部Fragment
- 不要放过多的代码在Activity
- 不要滥用Android操作系统级别的API
- Java包架构
├─ network
├─ models
├─ managers
├─ utils
├─ fragments
└─ views
├─ adapters
├─ actionbar
├─ widgets
└─ notifications```
- 资源文件
- 命名
- 构建layout xml文件
* `android:id` 放在第一位
* `android:layout_****`放在前面
* `style`放在底部
-
使用**style **
针对style文件越来越大,可以将其分离如styles.xml
,styles_home.xml
,styles_item_details.xml
,styles_forms.xml
不同的资源目录在res/values
中是任意的 -
colors.xml就是一个调色板
基本颜色以该颜色命名(个人理解:特殊颜色可以以十六进制数表示,因为不好命名了) -
dimens.xml与colors.xml类似。
以spacing_****
命名dp,以font_***
命名sp -
strings.xml
使用key类似命名空间来命名strings 且string值不能全是大写(针对英文) -
避免深层次的视图 用
<merge>
减少视图深度 -
意识到WebView的问题:
- 加载网页时不要处理HTML文件
- WebView与ApplicationContext绑定避免内存溢出。
- 避免使用WebView显示简单的Text和Button
-
测试框架
- Android Gradle发布了connectedAndroidTest
,是JUnit的一个扩展,可以测试程序员创建的JUnit Test - 使用** Robolectric**进行单元测试,而非UI测试
- Android Gradle发布了connectedAndroidTest
-
使用Robotium进行UI测试
-
模拟器使用genymotion
-
混淆参数
- 构建类型
buildTypes { debug { minifyEnabled false } release { signingConfig signingConfigs.release minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
- 构建类型
-
默认混淆设置
SDK_HOME/tools/proguard/proguard-android.txt
,自定义混淆参数my-project/app/proguard-rules.pro
-
当出现这两个错误
ClassNotFoundException
或者NoSuchFieldException
要不就是被移除要不就是被混淆了。检查
app/build/outputs/proguard/release/usage.txt
和app/build/outputs/proguard/release/mapping.txt
看是否被移除和混淆 -
在每次添加库的时候,需要及时进行make a release build
-
DexGuard时Proguard同一个团队开发的软件, 优化代码,分离dex文件从而解决65k方法限制的文件
-
数据存储
-
当数据繁多且复杂或者同步数据时不要使用SharePreference
-
ContentProviders
Schematic可以提高效率,避免创建重复性的代码。 -
Using an ORM(必须保证进行安全的前提下使用)
-
使用Stetho(由FaceBook开发的chrome桌面应用程序,监视App特别好用特别是在网络阻塞的时候,还有监视和编辑Sqlite和SharePreference),不过在发布版本中要剔除掉
网友评论