Android开发中的“要”与“不要”

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="light-library">当心dex方法超出65536限制,避免使用过多,过大的第三方库</h3>
Android应用,当打包成dex文件的时候,方法数不能超过65536个。如果超过这个限制,打包的时候就会报错,尽量少使用第三方库。当我们要引入一个第三方库,同时有多种库选择的时候,我们要尽量选择放法数少的那个库,尽量保持轻量,我们可以使用dex-method-count来检测方法数

<h3 id="json解析">Json解析</h3>
如果我们项目中需要用到Json数据解析,我们不要重复造轮子,尽量使用第三方库。优秀的Json解析库有JacksonGsonJson-smartBoon JSON,个人推荐Gson, 因为Gson库更轻量,更好地避免放法数过大

<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等都需要定义通用的属性,在开发过程中,我们还应该持续性地对重复定义的属性进行抽象。

<h3 id="genymotion">使用Genymotion模拟器</h3>
工欲善其事必先利器,Android自带的模拟器一直被吐槽,速度太慢,太卡,开发效率降低地不是一星半点。Genymotion成功解决了我们的苦恼。除了速度快之外,Genymotion还能模拟GPS点,模拟网络链接等等。

<h3 id="proguard">使用ProGuard混淆代码</h3>
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 { *; }

<h3 id="httpclient">不要自己写Http Client, 使用Volley或者OkHttp库</h3>
Http Client开源解决方案有好几个,okhttp, Retrofit, android-async-httpVolley, 在平时项目的开发中,我们应该选择哪种解决方案呢?

okhttp与async http

okhttp 和 async http是一个基础的通信库,都很强大,但需要自己封装使用才更方便。另外okhttp已经被谷歌官方用在android源码中了。

Retrofit 与 Volley

Retrofit和 Volley是属于比较高级点的封装库了

如果是标准的RESTful API,那么用Retrofit会非常爽!网络交互部分代码量可以减少90%。同时支持Gson,契合度很高。

另外,Retrofit和okhttp是亲兄弟,建议一起用,okhttp是底层库,能够支持一些非标准的HTTP方法,比如PATCH方法。

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>

这样写,会带来很多问题,首先是性能问题,体验效果会不好。另外一个问题详见StackOverflowError

因此,尽量保持我们的view层级扁平:学习如何使用RelativeLayout, 如何优化我们的layouts以及如何使用<merge>标签

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,426评论 25 707
  • 摘要 使用 Gradle 和它推荐的工程结构 把密码和敏感数据放在gradle.properties 不要自己写 ...
    小池laucherish阅读 18,539评论 16 349
  • 对于人生,我们应该朝前看,已发生的无可挽回的事情哪怕是我们所不期望的,也应该慢慢试着接受。在这里,我所说的向后看值...
    蒲公英的渴望阅读 149评论 0 0
  • 在一间安谧的屋子里,一个少女趴在窗户上仰望天空。即使她只能看见被楼房挡住的一小片蔚蓝的天空。 “别发呆了...
    苏羙人阅读 262评论 0 1
  • ――遇见“躁狂”,你该怎么办? 放假第一天,闹铃叮铃铃响起。不敢偷懒,即刻开启早有盘算的假期模式:广场晨练、持...
    箫音声声阅读 147评论 0 0