Android开发中的“要”与“不要”
我们在开发Android应用的过程中,不能只满足于实现功能,应该遵循一些准则,使得我们的代码优雅并且便于维护和扩展,我们应该做到如下几“要”和几“不要”
要
不要
<h3 id="build-system">项目结构</h3>
Google推荐使用Gradle & Android Studio开发Android项目,新的工程结构是这个样子的:
new-structure
├─ library-foobar
├─ app
│ ├─ libs
│ ├─ src
│ │ ├─ androidTest
│ │ │ └─ java
│ │ │ └─ com/futurice/project
│ │ └─ main
│ │ ├─ java
│ │ │ └─ com/futurice/project
│ │ ├─ res
│ │ └─ AndroidManifest.xml
│ ├─ build.gradle
│ └─ proguard-rules.pro
├─ build.gradle
└─ settings.gradle
<h3 id="gradle-config">Gradle配置</h3>
在我们app的builde.gradle文件中,我们需要针对release build定义signingConfigs
, 也许我们会这么写:
signingConfigs {
release {
storeFile file("myapp.keystore")
storePassword "password123"
keyAlias "thekey"
keyPassword "password789"
}
}
这种写法我们是不推荐的,因为密码是敏感信息,我们应该将其放置gradle.properties
中,应该这样:
KEYSTORE_PASSWORD=password123
KEY_PASSWORD=password789
然后我们的build.gradle文件应该这样写:
signingConfigs {
release {
try {
storeFile file("myapp.keystore")
storePassword KEYSTORE_PASSWORD
keyAlias "thekey"
keyPassword KEY_PASSWORD
}
catch (ex) {
throw new InvalidUserDataException("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.")
}
}
}
<h3 id="layout-styles">避免layout重复属性</h3>
几乎每个工程都需要用到styles, 因为它对于一些重复定义的属性来讲,非常地方便。对于应用中的大多数文字内容来说,至少我们应该有一个通用属性,例如:
<style name="ContentText">
<item name="android:textSize">@dimen/font_normal</item>
<item name="android:textColor">@color/basic_black</item>
</style>
对于layout中的TextView, 我们这么引用属性:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/price"
style="@style/ContentText"
/>
不单单对于TextView, 对于其它控件:Button, ImageView等都需要定义通用的属性,在开发过程中,我们还应该持续性地对重复定义的属性进行抽象。
buildTypes {
debug {
minifyEnabled false
}
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Android framework已经包含了默认的混淆配置,在SDK_HOME/tools/proguard/proguard-android.txt
文件中。如果我们需要自定义哪些文件需要混淆,哪些文件不需要混淆,我们需要在my-project/app/pruguard-ruls.pro
文件中做相应配置
避免ProGuard去除掉需要的类或者类成员,使用keep
选项:
-keep class com.xx.project.MyClass { *; }
避免ProGuard混淆某些类或者类成员,使用keepnames
选项
-keepnames class com.xx.project.MyClass { *; }
okhttp与async http
Retrofit 与 Volley
Retrofit和 Volley是属于比较高级点的封装库了
如果是标准的RESTful API,那么用Retrofit会非常爽!网络交互部分代码量可以减少90%。同时支持Gson,契合度很高。
Volley自己的定位是轻量级网络交互,适合大量的,小数据传输,如果你的项目比较大,那么目测还得把volley再次封装才会好用一些。
<h3 id="split-style">拆分style, 不要把单个style文件写得很大</h3>
我们不能只写一个styles.xml
, 把单个文件写得很大,难以维护。
Android SDK支持其他文件,styles
文件只要有XML标记<style>
就可以。因此我们也许会有这些style文件:styles_home.xml
,styles_item_details.xml
,styles_forms.xml
。style文件必须放在res/values
下面
<h3 id="colors">colors.xml不需要写得复杂</h3>
colors.xml
尽量保持简单,不能什么颜色都定义在里面。
Don't do this:
<resources>
<color name="button_foreground">#FFFFFF</color>
<color name="button_background">#2A91BD</color>
<color name="comment_background_inactive">#5F5F5F</color>
<color name="comment_background_active">#939393</color>
<color name="comment_foreground">#FFFFFF</color>
<color name="comment_foreground_important">#FF9D2F</color>
...
<color name="comment_shadow">#323232</color>
我们定义一个调色板就可以了。
Instead, do this:
<resources>
<!-- grayscale -->
<color name="white" >#FFFFFF</color>
<color name="gray_light">#DBDBDB</color>
<color name="gray" >#939393</color>
<color name="gray_dark" >#5F5F5F</color>
<color name="black" >#323232</color>
<!-- basic colors -->
<color name="green">#27D34D</color>
<color name="blue">#2A91BD</color>
<color name="orange">#FF9D2F</color>
<color name="red">#FF432F</color>
</resources>
<h3 id="dimens">dimens不要写得复杂</h3>
我们也应该定义一个典型的间距和字体大小, 一个好的dimens.xml
示例如下:
<resources>
<!-- font sizes -->
<dimen name="font_larger">22sp</dimen>
<dimen name="font_large">18sp</dimen>
<dimen name="font_normal">15sp</dimen>
<dimen name="font_small">12sp</dimen>
<!-- typical spacing between two views -->
<dimen name="spacing_huge">40dp</dimen>
<dimen name="spacing_large">24dp</dimen>
<dimen name="spacing_normal">14dp</dimen>
<dimen name="spacing_small">10dp</dimen>
<dimen name="spacing_tiny">4dp</dimen>
<!-- typical sizes of views -->
<dimen name="button_height_tall">60dp</dimen>
<dimen name="button_height_normal">40dp</dimen>
<dimen name="button_height_short">32dp</dimen>
</resources>
<h3 id="view-hierarchy">不要把View层级写得很深</h3>
我们在写静态布局的时候,往往为了实现布局,不注意就把view嵌套得很深,如下一个反面教材:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<RelativeLayout
...
>
<LinearLayout
...
>
<LinearLayout
...
>
<LinearLayout
...
>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</LinearLayout>