中文字幕 日本 在线 高清,久久精品国产99精品国,超碰人人香蕉,一区二区三区无码高清视频

Android開發(fā)最佳實(shí)踐手冊全網(wǎng)獨(dú)一份,知名大企都在用,建議收藏(安卓開發(fā)實(shí)踐)

目錄

  • 前言
  • 摘要
  • Androids SDK
  • 構(gòu)建系統(tǒng)
  • 工程總結(jié)
  • Gradle 配置
  • IDE集成開發(fā)環(huán)境和文本編輯器
  • 類庫
  • Activities and Fragments
  • Java 包結(jié)構(gòu)
  • 測試框架
  • 模擬器
  • 混淆配置

前言

本文是Futurice公司的Android開發(fā)人員總結(jié)的最佳實(shí)踐,遵循這些準(zhǔn)則可以避免重復(fù)制造輪子。如果你對iOS或者Windows Phone開發(fā)感興趣,那么也請看看iOS最佳實(shí)踐和Windows客戶端開發(fā)最佳實(shí)踐。

摘要

  • 使用 Gradle 和它推薦的工程結(jié)構(gòu)
  • 把密碼和敏感數(shù)據(jù)放在gradle.properties
  • 不要自己寫 HTTP 客戶端,使用Volley或OkHttp庫
  • 使用Jackson庫解析JSON數(shù)據(jù)
  • 避免使用Guava同時(shí)使用一些類庫來避免65k method limit(一個Android程序中最多能執(zhí)行65536個方法)
  • 使用 Fragments來呈現(xiàn)UI視圖
  • 使用 Activities 只是為了管理 Fragments
  • Layout 布局是 XMLs代碼,組織好它們
  • 在layoutout XMLs布局時(shí),使用styles文件來避免使用重復(fù)的屬性
  • 使用多個style文件來避免單一的一個大style文件
  • 保持你的colors.xml 簡短DRY(不要重復(fù)自己),只是定義調(diào)色板
  • 總是使用dimens.xml DRY(不要重復(fù)自己),定義通用常數(shù)
  • 不要做一個深層次的ViewGroup
  • 在使用WebViews時(shí)避免在客戶端做處理,當(dāng)心內(nèi)存泄露
  • 使用Robolectric單元測試,Robotium 做UI測試
  • 使用Genymotion 作為你的模擬器
  • 總是使用ProGuard 和 DexGuard混淆來項(xiàng)目

Androids SDK

將你的Android SDK放在你的home目錄或其他應(yīng)用程序無關(guān)的位置。 當(dāng)安裝有些包含SDK的IDE的時(shí)候,可能會將SDK放在IDE同一目錄下,當(dāng)你需要升級(或重新安裝)IDE或更換的IDE時(shí),會非常麻煩。 此外,若果你的IDE是在普通用戶,不是在root下運(yùn)行,還要避免吧SDK放到一下需要sudo權(quán)限的系統(tǒng)級別目錄下。

構(gòu)建系統(tǒng)

你的默認(rèn)編譯環(huán)境應(yīng)該是Gradle. Ant 有很多限制,也很冗余。使用Gradle,完成以下工作很方便:

  • 構(gòu)建APP不同版本的變種
  • 制作簡單類似腳本的任務(wù)
  • 管理和下載依賴
  • 自定義秘鑰
  • 更多

同時(shí),Android Gradle插件作為新標(biāo)準(zhǔn)的構(gòu)建系統(tǒng)正在被Google積極的開發(fā)。

工程總結(jié)

有兩種流行的結(jié)構(gòu):老的Ant & Eclipse ADT 工程結(jié)構(gòu),和新的Gradle & Android Studio 工程結(jié)構(gòu), 你應(yīng)該選擇新的工程結(jié)構(gòu),如果你的工程還在使用老的結(jié)構(gòu),考慮放棄吧,將工程移植到新的結(jié)構(gòu)。

老的結(jié)構(gòu)

Android開發(fā)最佳實(shí)踐手冊全網(wǎng)獨(dú)一份,知名大企都在用,建議收藏(安卓開發(fā)實(shí)踐)

新的結(jié)構(gòu)

Android開發(fā)最佳實(shí)踐手冊全網(wǎng)獨(dú)一份,知名大企都在用,建議收藏(安卓開發(fā)實(shí)踐)

主要的區(qū)別在于:

  • 新的結(jié)構(gòu)明確的分開了'source sets' (main,androidTest),Gradle的一個理念。 你可以做到,例如,添加源組‘paid’和‘free’在src中,這將成為您的應(yīng)用程序的付費(fèi)和免費(fèi)的兩種模式的源代碼。
  • 你的項(xiàng)目引用第三方項(xiàng)目庫時(shí)(例如,library-foobar),擁有一個頂級包名app從第三方庫項(xiàng)目區(qū)分你的應(yīng)用程序是非常有用的。 然后settings.gradle不斷引用這些庫項(xiàng)目,其中app/build.gradle可以引用。

Gradle 配置

常用結(jié)構(gòu) 參考

Google's guide on Gradle for Android

小任務(wù) 除了(shell, Python, Perl, etc)這些腳本語言,你也可以使用Gradle 制作任務(wù)。 更多信息請參考Gradle's documentation。

密碼 在做版本release時(shí)你app的

build.gradle你需要定義 signingConfigs.此時(shí)你應(yīng)該避免以下內(nèi)容:

不要做這個 . 這會出現(xiàn)在版本控制中。

signingConfigs { release { storeFile file("myapp.keystore") storePassword "password123" keyAlias "thekey" keyPassword "password789" }}

而是,建立一個不加入版本控制系統(tǒng)的gradle.properties文件。

KEYSTORE_PASSWORD=password123KEY_PASSWORD=password789

那個文件是gradle自動引入的,你可以在buld.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.") } }}

使用 Maven 依賴方案代替使用導(dǎo)入jar包方案 如果在你的項(xiàng)目中你明確使用率 jar文件,那么它們可能成為永久的版本,如2.1.1.下載jar包更新他們是很繁瑣的, 這個問題Maven很好的解決了,這在Android Gradle構(gòu)建中也是推薦的方法。你可 以指定版本的一個范圍,如2.1. ,然后Maven會自動升級到制定的最新版本,例如:

dependencies { compile 'com.netflix.rxjava:rxjava-core:0.19. ' compile 'com.netflix.rxjava:rxjava-android:0.19. ' compile 'com.fasterxml.jackson.core:jackson-databind:2.4. ' compile 'com.fasterxml.jackson.core:jackson-core:2.4. ' compile 'com.fasterxml.jackson.core:jackson-annotations:2.4. ' compile 'com.squareup.okhttp:okhttp:2.0. ' compile 'com.squareup.okhttp:okhttp-urlconnection:2.0. '}

IDE集成開發(fā)環(huán)境和文本編輯器

  • 無論使用什么編輯器,一定要構(gòu)建一個良好的工程結(jié)構(gòu) 編輯器每個人都有自己的 選擇,讓你的編輯器根據(jù)工程結(jié)構(gòu)和構(gòu)建系統(tǒng)運(yùn)作,那是你自己的責(zé)任。
  • 當(dāng)下首推Android Studio,因?yàn)樗怯晒雀栝_發(fā),最接近Gradle,默認(rèn)使用最新的工程結(jié)構(gòu),已經(jīng)到beta階段 (目前已經(jīng)有release 1.0了),它就是為Android開發(fā)定制的。
  • 你也可以使用Eclipse ADT ,但是你需要對它進(jìn)行配置,因?yàn)樗褂昧伺f的工程結(jié)構(gòu) 和Ant作為構(gòu)建系統(tǒng)。你甚至可以使用純文版編輯器如Vim,Sublime Text,或者Emacs。如果那樣的話,你需要使用Gardle和adb命令行。
  • 如果使用Eclipse集成Gradle 不適合你,你只是使用命令行構(gòu)建工程,或遷移到Android Studio中來吧。
  • 無論你使用何種開發(fā)工具,只要確保Gradle和新的項(xiàng)目結(jié)構(gòu)保持官方的方式構(gòu)建應(yīng)用程序,避免你的編輯器配置文件加入到版本控制。
  • 例如,避免加入Ant build.xml文件。 特別如果你改變Ant的配置,不要忘記保持build.gradle是最新和起作用的。同時(shí),善待其他開發(fā)者,不要強(qiáng)制改變他們的開發(fā)工具和偏好。

類庫

Jackson 是一個將java對象轉(zhuǎn)換成JSON與JSON轉(zhuǎn)化java類的類庫。Gson 是解決這個問題的流行方案,然而我們發(fā)現(xiàn)Jackson更高效,因?yàn)樗С痔娲姆椒ㄌ幚鞪SON:流、內(nèi)存樹模型,和傳統(tǒng)JSON-POJO數(shù)據(jù)綁定。不過,請記住, Jsonkson庫比起GSON更大,所以根據(jù)你的情況選擇,你可能選擇GSON來避免APP 65k個方法限制。其它選擇: Json-smart and Boon JSON

網(wǎng)絡(luò)請求,緩存,圖片 執(zhí)行請求后端服務(wù)器,有幾種交互的解決方案,你應(yīng)該考慮實(shí)現(xiàn)你自己的網(wǎng)絡(luò)客戶端。使用Volley 或Retrofit。Volley 同時(shí)提供圖片緩存類。若果你選擇使用Retrofit,那么考慮使用Picasso 來加載圖片和緩存,同時(shí)使用OkHttp作為高效的網(wǎng)絡(luò)請求。Retrofit,Picasso和OkHttp都是有同一家公司開發(fā)(注: 是由Square 公司開發(fā)),所以它們能很好的在一起運(yùn)行。OkHttp 同樣可以和Volley在一起使用 Volley.

RxJava 是函數(shù)式反應(yīng)性的一個類庫,換句話說,能處理異步的事件。 這是一個強(qiáng)大的和有前途的模式,同時(shí)也可能會造成混淆,因?yàn)樗侨绱说牟煌?我們建議在使用這個庫架構(gòu)整個應(yīng)用程序之前要謹(jǐn)慎考慮。 有一些項(xiàng)目是使用RxJava完成的,如果你需要幫助可以跟這些人取得聯(lián)系: Timo Tuominen, Olli Salonen, Andre Medeiros, Mark Voit, Antti Lammi, Vera Izrailit, Juha Ristolainen. 我們也寫了一些博客: [1], [2], [3], [4].

如若你之前有使用過Rx的經(jīng)歷,開始從API響應(yīng)應(yīng)用它。 另外,從簡單的UI事件處理開始運(yùn)用,如單擊事件或在搜索欄輸入事件。 若對你的Rx技術(shù)有信心,同時(shí)想要將它應(yīng)用到你的整體架構(gòu)中,那么請?jiān)趶?fù)雜的部分寫好Javadocs文檔。 請記住其他不熟悉RxJava的開發(fā)人員,可能會非常難理解整個項(xiàng)目。 盡你的的全力幫助他們理解你的代碼和Rx。

Retrolambda 是一個在Android和預(yù)JDK8平臺上的使用Lambda表達(dá)式語法的Java類庫。 它有助于保持你代碼的緊湊性和可讀性,特別當(dāng)你使用如RxJava函數(shù)風(fēng)格編程時(shí)。 使用它時(shí)先安裝JDK8,在Android Studio工程結(jié)構(gòu)對話框中把它設(shè)置成為SDK路徑,同時(shí)設(shè)置JAVA8_HOME和JAVA7_HOME環(huán)境變量, 然后在工程根目錄下配置 build.gradle:

dependencies { classpath 'me.tatarka:gradle-retrolambda:2.4. '}

同時(shí)在每個module 的build.gradle中添加

apply plugin: 'retrolambda'android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}retrolambda { jdk System.getenv("JAVA8_HOME") oldJdk System.getenv("JAVA7_HOME") javaVersion JavaVersion.VERSION_1_7}

Android Studio 提供Java8 lambdas表帶是代碼提示支持。如果你對lambdas不熟悉,只需參照以下開始學(xué)習(xí)吧:

  • 任何只包含一個接口的方法都是"lambda friendly"同時(shí)代碼可以被折疊成更緊湊的語法
  • 如果對參數(shù)或類似有疑問,就寫一個普通的匿名內(nèi)部類,然后讓Android Status為你生成一個lambda。
  • 當(dāng)心dex方法數(shù)限制,同時(shí)避免使用過多的類庫 Android apps,當(dāng)打包成一個dex文件時(shí),有一個65535個應(yīng)用方法強(qiáng)硬限制[1] [2] [3]。 當(dāng)你突破65k限制之后你會看到一個致命錯誤。因此,使用一個正常范圍的類庫文件,同時(shí)使用dex-method-counts 工具來決定哪些類庫可以再65k限制之下使用,特別的避免使用Guava類庫,因?yàn)樗^13k個方法。

Activities and Fragments

Fragments應(yīng)該作為你實(shí)現(xiàn)UI界面默認(rèn)選擇。你可以重復(fù)使用Fragments用戶接口來 組合成你的應(yīng)用。我們強(qiáng)烈推薦使用Fragments而不是activity來呈現(xiàn)UI界面,理由如下:

  • 提供多窗格布局解決方案

Fragments 的引入主要將手機(jī)應(yīng)用延伸到平板電腦,所以在平板電腦上你可能有A、B兩個窗格,但是在手機(jī)應(yīng)用上A、B可能分別充滿 整個屏幕。如果你的應(yīng)用在最初就使用了fragments,那么以后將你的應(yīng)用適配到其他不同尺寸屏幕就會非常簡單。

  • 屏幕間數(shù)據(jù)通信

從一個Activity發(fā)送復(fù)雜數(shù)據(jù)(例如Java對象)到另外一個Activity,Android的API并沒有提供合適的方法。不過使用Fragment,你可以使用 一個activity實(shí)例作為這個activity子fragments的通信通道。即使這樣比Activity與Activity間的通信好,你也想考慮使用Event Bus架構(gòu),使用如 Otto 或者 greenrobot EventBus作為更簡潔的實(shí)現(xiàn)。 如果你希望避免添加另外一個類庫,RxJava同樣可以實(shí)現(xiàn)一個Event Bus。

  • Fragments 一般通用的不只有UI

你可以有一個沒有界面的fragment作為Activity提供后臺工作。 進(jìn)一步你可以使用這個特性來創(chuàng)建一個fragment 包含改變其它fragment的邏輯 而不是把這個邏輯放在activity中。

  • 甚至ActionBar 都可以使用內(nèi)部fragment來管理

你可以選擇使用一個沒有UI界面的fragment來專門管理ActionBar,或者你可以選擇使用在每個Fragment中 添加它自己的action 來作為父Activity的ActionBar.參考.

很不幸,我們不建議廣泛的使用嵌套的fragments,因?yàn)?有時(shí)會引起matryoshka bugs。我們只有當(dāng)它有意義(例如,在水平滑動的ViewPager在 像屏幕一樣fragment中)或者他的確是一個明智的選擇的時(shí)候才廣泛的使用fragment。

在一個架構(gòu)級別,你的APP應(yīng)該有一個頂級的activity來包含絕大部分業(yè)務(wù)相關(guān)的fragment。你也可能還有一些輔助的activity ,這些輔助的activity與主activity 通信很簡單限制在這兩種方法 Intent.setData() 或 Intent.setAction()或類似的方法。

Java 包結(jié)構(gòu)

  • Android 應(yīng)用程序在架構(gòu)上大致是Java中的Model-View-Controller結(jié)構(gòu)。 在Android 中 Fragment和Activity通常上是控制器類(http://www.informit.com/articles/article.aspx?p=2126865). 換句話說,他們是用戶接口的部分,同樣也是Views視圖的部分。
  • 正是因?yàn)槿绱?,才很難嚴(yán)格的將fragments (或者 activities) 嚴(yán)格的劃分成 控制器controlloers還是視圖 views。 最好還是將它們放在自己單獨(dú)的 fragments 包中。只要你遵循之前提到的建議,Activities 則可以放在頂級目錄下。 若果你規(guī)劃有2到3個以上的activity,那么還是同樣新建一個activities包吧。
  • 然而,這種架構(gòu)可以看做是另一種形式的MVC, 包含要被解析API響應(yīng)的JSON數(shù)據(jù),來填充的POJO的models包中。 和一個views包來包含你的自定義視圖、通知、導(dǎo)航視圖,widgets等等。 適配器Adapter是在數(shù)據(jù)和視圖之間。然而他們通常需要通過getView()方法來導(dǎo)出一些視圖, 所以你可以將adapters包放在views包里面。
  • 一些控制器角色的類是應(yīng)用程序級別的,同時(shí)是接近系統(tǒng)的。 這些類放在managers包下面。 一些繁雜的數(shù)據(jù)處理類,比如說"DateUtils",放在utils包下面。 與后端交互負(fù)責(zé)網(wǎng)絡(luò)處理類,放在network包下面。
  • 總而言之,以最接近用戶而不是最接近后端去安排他們。

com.futurice.project├─ network├─ models├─ managers├─ utils├─ fragments└─ views ├─ adapters ├─ actionbar ├─ widgets └─ notifications

資源文件 Resources

  • 命名 遵循前綴表明類型的習(xí)慣,形如type_foo_bar.xml。例如:fragment_contact_details.xml,view_primary_button.xml,activity_main.xml.
  • 組織布局文件 若果你不確定如何排版一個布局文件,遵循一下規(guī)則可能會有幫助。
  • 每一個屬性一行,縮進(jìn)4個空格
  • android:id 總是作為第一個屬性
  • android:layout_**** 屬性在上邊
  • style 屬性在底部
  • 關(guān)閉標(biāo)簽/>單獨(dú)起一行,有助于調(diào)整和添加新的屬性
  • 考慮使用

Designtime attributes 設(shè)計(jì)時(shí)布局屬性,Android Studio已經(jīng)提供支持,而不是硬編碼android:text (譯者注:墻內(nèi)也可以參考stormzhang的這篇博客鏈接)。

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@ id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="@string/name" style="@style/FancyText" /> <include layout="@layout/reusable_part" /> </LinearLayout>

作為一個經(jīng)驗(yàn)法則,android:layout_****屬性應(yīng)該在 layout XML 中定義,同時(shí)其它屬性android:**** 應(yīng)放在 styler XML中。此規(guī)則也有例外,不過大體工作 的很好。這個思想整體是保持layout屬性(positioning, margin, sizing) 和content屬性在布局文件中,同時(shí)將所有的外觀細(xì)節(jié)屬性(colors, padding, font)放 在style文件中。

例外有以下這些:

  • android:id 明顯應(yīng)該在layout文件中
  • layout文件中android:orientation對于一個LinearLayout布局通常更有意義
  • android:text 由于是定義內(nèi)容,應(yīng)該放在layout文件中
  • 有時(shí)候?qū)ndroid:layout_width 和 android:layout_height屬性放到一個style中作為一個通用的風(fēng)格中更有意義,但是默認(rèn)情況下這些應(yīng)該放到layout文件中。

使用styles 幾乎每個項(xiàng)目都需要適當(dāng)?shù)氖褂胹tyle文件,因?yàn)閷τ谝粋€視圖來說有一個重復(fù)的外觀是很常見的。 在應(yīng)用中對于大多數(shù)文本內(nèi)容,最起碼你應(yīng)該有一個通用的style文件,例如:

<style name="ContentText"> <item name="android:textSize">@dimen/font_normal</item> <item name="android:textColor">@color/basic_black</item> </style>

應(yīng)用到TextView 中:

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/price" style="@style/ContentText" />

你或許需要為按鈕控件做同樣的事情,不要停止在那里。將一組相關(guān)的和重復(fù)android:****的屬性放到一個通用的style中。

將一個大的style文件分割成多個文件 你可以有多個styles.xml 文件。Android SDK支持其它文件,styles這個文件名稱并沒有作用,起作用的是在文件 里xml的`標(biāo)簽。因此你可以有多個style文件styles.xml,style_home.xml,style_item_details.xml,styles_forms.xml。 不用于資源文件路徑需要為系統(tǒng)構(gòu)建起的有意義,在res/values`目錄下的文件可以任意命名。

colors.xml是一個調(diào)色板 在你的colors.xml文件中應(yīng)該只是映射顏色的名稱一個RGBA值,而沒有其它的。不要使用它為不同的按鈕來定義RGBA值。

不要這樣做

<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>

使用這種格式,你會非常容易的開始重復(fù)定義RGBA值,這使如果需要改變基本色變的很復(fù)雜。同時(shí),這些定義是跟一些環(huán)境關(guān)聯(lián)起來的,如button或者comment, 應(yīng)該放到一個按鈕風(fēng)格中,而不是在color.xml文件中。

相反,這樣做:

<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>

向應(yīng)用設(shè)計(jì)者那里要這個調(diào)色板,名稱不需要跟"green", "blue", 等等相同。 "brand_primary", "brand_secondary", "brand_negative" 這樣的名字也是完全可以接受的。 像這樣規(guī)范的顏色很容易修改或重構(gòu),會使應(yīng)用一共使用了多少種不同的顏色變得非常清晰。 通常一個具有審美價(jià)值的UI來說,減少使用顏色的種類是非常重要的。

像對待colors.xml一樣對待dimens.xml文件 與定義顏色調(diào)色板一樣,你同時(shí)也應(yīng)該定義一個空隙間隔和字體大小的“調(diào)色板”。 一個好的例子,如下所示:

<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>

布局時(shí)在寫 margins 和 paddings 時(shí),你應(yīng)該使用spacing_****尺寸格式來布局,而不是像對待String字符串一樣直接寫值。 這樣寫會非常有感覺,會使組織和改變風(fēng)格或布局是非常容易。

避免深層次的視圖結(jié)構(gòu) 有時(shí)候?yàn)榱藬[放一個視圖,你可能嘗試添加另一個LinearLayout。你可能使用這種方法解決:

<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <RelativeLayout … > <LinearLayout … > <LinearLayout … > <LinearLayout … > </LinearLayout> </LinearLayout> </LinearLayout> </RelativeLayout> </LinearLayout>

即使你沒有非常明確的在一個layout布局文件中這樣使用,如果你在Java文件中從一個view inflate(這個inflate翻譯不過去,大家理解就行) 到其他views當(dāng)中,也是可能會發(fā)生的。

可能會導(dǎo)致一系列的問題。你可能會遇到性能問題,因?yàn)樘幚砥鹦枰幚硪粋€復(fù)雜的UI樹結(jié)構(gòu)。 還可能會導(dǎo)致以下更嚴(yán)重的問題StackOverflowError.

因此盡量保持你的視圖tree:學(xué)習(xí)如何使用RelativeLayout, 如何 optimize 你的布局 和如何使用 “ 標(biāo)簽.

小心關(guān)于WebViews的問題. 如果你必須顯示一個web視圖, 比如說對于一個新聞文章,避免做客戶端處理HTML的工作, 最好讓后端工程師協(xié)助,讓他返回一個 "純" HTML。 WebViews 也能導(dǎo)致內(nèi)存泄露 當(dāng)保持引他們的Activity,而不是被綁定到ApplicationContext中的時(shí)候。 當(dāng)使用簡單的文字或按鈕時(shí),避免使用WebView,這時(shí)使用TextView或Buttons更好。

測試框架

Android SDK的測試框架還處于初級階段,特別是關(guān)于UI測試方面。Android Gradle 目前實(shí)現(xiàn)了一個叫connectedAndroidTest的測試, 它使用一個JUnit 為Android提供的擴(kuò)展插件 extension of JUnit with helpers for Android.可以跑你生成的JUnit測試,

只當(dāng)做單元測試時(shí)使用 Robolectric ,views 不用 它是一個最求提供"不連接設(shè)備的"為了加速開發(fā)的測試, 非常時(shí)候做 models 和 view models 的單元測試。 然而,使用Robolectric測試時(shí)不精確的,也不完全對UI測試。 當(dāng)你對有關(guān)動畫的UI元素、對話框等,測試時(shí)會有問題, 這主要是因?yàn)槟闶窃?“在黑暗中工作”(在沒有可控的界面情況下測試)

_Robotium 使寫UI測試非常簡單。 _ 對于UI測試你不需 Robotium 跑與設(shè)備連接的測試。 但它可能會對你有益,是因?yàn)樗性S多來幫助類的獲得和分析視圖,控制屏幕。 測試用例看起來像這樣簡單:

solo.sendKey(Solo.MENU);solo.clickOnText("More"); // searches for the first occurence of "More" and clicks on itsolo.clickOnText("Preferences");solo.clickOnText("Edit File Extensions");Assert.assertTrue(solo.searchText("rtf"));

模擬器

如果你全職開發(fā)Android App,那么買一個Genymotion emulatorlicense吧。 Genymotion 模擬器運(yùn)行更快的秒幀的速度,比起典型的AVD模擬器。他有演示你APP的工具,高質(zhì)量的模擬網(wǎng)絡(luò)連接,GPS位置,等等。它同時(shí)還有理想的連接測試。 你若涉及適配使用很多不同的設(shè)備,買一個Genymotion 版權(quán)是比你買很多真設(shè)備便宜多的。

注意:Genymotion模擬器沒有裝載所有的Google服務(wù),如Google Play Store和Maps。你也可能需 要測試Samsung指定的API,若這樣的話你還是需要購買一個真實(shí)的Samsung設(shè)備。

混淆配置

ProGuard 是一個在Android項(xiàng)目中廣泛使用的壓縮和混淆打包的源碼的工具。

你是否使用ProGuard取決你項(xiàng)目的配置,當(dāng)你構(gòu)建一個release版本的apk時(shí),通常你應(yīng)該配置gradle文件。

buildTypes { debug { minifyEnabled false } release { signingConfig signingConfigs.release minifyEnabled true proguardFiles 'proguard-rules.pro' }}

為了決定哪些代碼應(yīng)該被保留,哪些代碼應(yīng)該被混淆,你不得不指定一個或多個實(shí)體類在你的代碼中。 這些實(shí)體應(yīng)該是指定的類包含main方法,applets,midlets,activities,等等。 Android framework 使用一個默認(rèn)的配置文件,可以在SDK_HOME/tools/proguard/proguard-android.txt 目錄下找到。自定義的工程指定的 project-specific 混淆規(guī)則,如在my-project/app/proguard-rules.pro中定義, 會被添加到默認(rèn)的配置中。

關(guān)于 ProGuard 一個普遍的問題,是看應(yīng)用程序是否崩潰并報(bào)ClassNotFoundException 或者 NoSuchFieldException 或類似的異常, 即使編譯是沒有警告并運(yùn)行成功。 這意味著以下兩種可能:

ProGuard 已經(jīng)移除了類,枚舉,方法,成員變量或注解,考慮是否是必要的。

ProGuard 混淆了類,枚舉,成員變量的名稱,但是這些名字又被拿原始名稱使用了,比如通過Java的反射。

檢查app/build/outputs/proguard/release/usage.txt文件看有問題的對象是否被移除了。 檢查app/build/outputs/proguard/release/mapping.txt 文件看有問題的對象是否被混淆了。

In order to prevent ProGuard from stripping away needed classes or class members, add a keep options to your proguard config: 以防 ProGuard 剝離 需要的類和類成員,添加一個 keep選項(xiàng)在你的 proguard 配置文件中:

-keep class com.futurice.project.MyClass { *; }

防止 ProGuard 混淆 一些類和成員,添加 keepnames:

-keepnames class com.futurice.project.MyClass { *; }

查看this template's ProGuard config 中的一些例子。 更多例子請參考Proguard。

在構(gòu)建項(xiàng)目之初,發(fā)布一個版本 來檢查ProGuard規(guī)則是否正確的保持了重要的部分。 同時(shí)無論何時(shí)你添加了新的類庫,做一個發(fā)布版本,同時(shí)apk在設(shè)備上跑起來測試一下。 不要等到你的app要發(fā)布 "1.0"版本了才做版本發(fā)布,那時(shí)候你可能會碰到好多意想不到的異常,需要一些時(shí)間去修復(fù)他們。

Tips每次發(fā)布新版本都要寫 mapping.txt。每發(fā)布一個版本,如果用戶遇到一個bug,同時(shí)提交了一個混淆過的堆棧跟蹤。 通過保留mapping.txt文件,來確定你可以調(diào)試的問題。

DexGuard 若果你需要核心工具來優(yōu)化,和專門混淆的發(fā)布代碼,考慮使用DexGuard, 一個商業(yè)軟件,ProGuard 也是有他們團(tuán)隊(duì)開發(fā)的。 它會很容易將Dex文件分割,來解決65K個方法限制問題。

文章不易,如果大家喜歡這篇文章,或者對你有幫助希望大家多多點(diǎn)贊轉(zhuǎn)發(fā)關(guān)注哦。文章會持續(xù)更新的。絕對干貨!??!

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。

(0)
上一篇 2024年9月14日 下午2:58
下一篇 2024年9月14日 下午3:10

相關(guān)推薦