我们在开发Android应用的过程中,不能只满足于实现功能,应该遵循一些准则,使得我们的代码优雅并且便于维护和扩展,我们应该做到如下几“要”和几“不要” 要
不要
项目结构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 Gradle配置在我们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.") } } } 当心dex方法超出65536限制,避免使用过多,过大的第三方库Android应用,当打包成dex文件的时候,方法数不能超过65536个。如果超过这个限制,打包的时候就会报错,尽量少使用第三方库。当我们要引入一个第三方库,同时有多种库选择的时候,我们要尽量选择放法数少的那个库,尽量保持轻量,我们可以使用 dex-method-count来检测方法数 Json解析如果我们项目中需要用到Json数据解析,我们不要重复造轮子,尽量使用第三方库。优秀的Json解析库有 Jackson 、 Gson 、 Json-smart 、 Boon JSON,个人推荐Gson, 因为Gson库更轻量,更好地避免放法数过大 避免layout重复属性几乎每个工程都需要用到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等都需要定义通用的属性,在开发过程中,我们还应该持续性地对重复定义的属性进行抽象。 使用Genymotion模拟器工欲善其事必先利器,Android自带的模拟器一直被吐槽,速度太慢,太卡,开发效率降低地不是一星半点。 Genymotion成功解决了我们的苦恼。除了速度快之外,Genymotion还能模拟GPS点,模拟网络链接等等。 使用ProGuard混淆代码ProGuard 是用来压缩和混淆Android项目代码的工具,从安全和隐私角度考虑,我们是必须要混淆我们的代码的 通常我们通过配置Gradle文件,当发布Release Apk的时候使用ProGurad压缩: 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 { *; } 不要自己写Http Client, 使用Volley或者OkHttp库Http Client开源解决方案有好几个, okhttp , Retrofit , android-async-http 和Volley, 在平时项目的开发中,我们应该选择哪种解决方案呢? okhttp与async httpokhttp 和 async http是一个基础的通信库,都很强大,但需要自己封装使用才更方便。另外okhttp已经被谷歌官方用在android源码中了。 Retrofit 与 VolleyRetrofit和 Volley是属于比较高级点的封装库了 如果是标准的RESTful API,那么用Retrofit会非常爽!网络交互部分代码量可以减少90%。同时支持Gson,契合度很高。 另外,Retrofit和okhttp是亲兄弟,建议一起用,okhttp是底层库,能够支持一些非标准的HTTP方法,比如PATCH方法。 Volley自己的定位是轻量级网络交互,适合大量的,小数据传输,如果你的项目比较大,那么目测还得把volley再次封装才会好用一些。 拆分style, 不要把单个style文件写得很大我们不能只写一个 styles.xml , 把单个文件写得很大,难以维护。 Android SDK支持其他文件, styles 文件只要有XML标记 <style> 就可以。因此我们也许会有这些style文件: styles_home.xml ,styles_item_details.xml , styles_forms.xml 。style文件必须放在res/values下面 colors.xml不需要写得复杂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> dimens不要写得复杂我们也应该定义一个典型的间距和字体大小, 一个好的 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> 不要把View层级写得很深我们在写静态布局的时候,往往为了实现布局,不注意就把view嵌套得很深,如下一个反面教材: <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <RelativeLayout ... > <LinearLayout ... > <LinearLayout ... > <LinearLayout ... > </LinearLayout> </LinearLayout> </LinearLayout> </RelativeLayout> </LinearLayout> 这样写,会带来很多问题,首先是性能问题,体验效果会不好。另外一个问题详见StackOverflowError 因此,尽量保持我们的view层级扁平:学习如何使用 RelativeLayout , 如何 优化我们的layouts 以及如何使用 <merge> 标签 (责任编辑:好模板) |