欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
【譯】[干貨](méi) Android 開(kāi)發(fā)規范與應用

Futurice公司Android開(kāi)發(fā)者中學(xué)到的經(jīng)驗。
遵循以下準則,避免重復發(fā)明輪子。若您對開(kāi)發(fā)iOS或Windows Phone 有興趣,
請看iOS Good PracticesWindows client Good Practices 這兩篇文章。

摘要

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

Android SDK

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

構建系統

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

  • 構建APP不同版本的變種
  • 制作簡(jiǎn)單類(lèi)似腳本的任務(wù)
  • 管理和下載依賴(lài)
  • 自定義秘鑰
  • 更多

同時(shí),Android Gradle插件作為新標準的構建系統正在被Google積極的開(kāi)發(fā)。

工程結構

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

老的結構:

old-structure├─ assets├─ libs├─ res├─ src│  └─ com/futurice/project├─ AndroidManifest.xml├─ build.gradle├─ project.properties└─ proguard-rules.pro

新的結構

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

主要的區別在于,新的結構明確的分開(kāi)了'source sets' (main,androidTest),Gradle的一個(gè)理念。
你可以做到,例如,添加源組‘paid’和‘free’在src中,這將成為您的應用程序的付費和免費的兩種模式的源代碼。

你的項目引用第三方項目庫時(shí)(例如,library-foobar),擁有一個(gè)頂級包名app從第三方庫項目區分你的應用程序是非常有用的。
然后settings.gradle不斷引用這些庫項目,其中app/build.gradle可以引用。

Gradle 配置

常用結構 參考Google's guide on Gradle for Android

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

密碼 在做版本release時(shí)你app的 build.gradle你需要定義 signingConfigs.此時(shí)你應該避免以下內容:

不要做這個(gè) . 這會(huì )出現在版本控制中。

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

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

KEYSTORE_PASSWORD=password123KEY_PASSWORD=password789

那個(gè)文件是gradle自動(dòng)引入的,你可以在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 依賴(lài)方案代替使用導入jar包方案 如果在你的項目中你明確使用率
jar文件,那么它們可能成為永久的版本,如2.1.1.下載jar包更新他們是很繁瑣的,
這個(gè)問(wèn)題Maven很好的解決了,這在A(yíng)ndroid Gradle構建中也是推薦的方法。你可
以指定版本的一個(gè)范圍,如2.1.+,然后Maven會(huì )自動(dòng)升級到制定的最新版本,例如:

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.+'}

IDEs and text editors

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

無(wú)論使用什么編輯器,一定要構建一個(gè)良好的工程結構 編輯器每個(gè)人都有自己的
選擇,讓你的編輯器根據工程結構和構建系統運作,那是你自己的責任。

當下首推Android Studio,因為他是由谷歌開(kāi)發(fā),最接近Gradle,默認使用最新的工程結構,已經(jīng)到beta階段
(目前已經(jīng)有release 1.0了),它就是為Android開(kāi)發(fā)定制的。

你也可以使用Eclipse ADT ,但是你需要對它進(jìn)行配置,因為它使用了舊的工程結構
和Ant作為構建系統。你甚至可以使用純文版編輯器如Vim,Sublime Text,或者Emacs。如果那樣的話(huà),你需要使用Gardle和adb命令行。如果使用Eclipse集成Gradle
不適合你,你只是使用命令行構建工程,或遷移到Android Studio中來(lái)吧。

無(wú)論你使用何種開(kāi)發(fā)工具,只要確保Gradle和新的項目結構保持官方的方式構建應用程序,避免你的編輯器配置文件加入到版本控制。例如,避免加入Ant build.xml文件。
特別如果你改變Ant的配置,不要忘記保持build.gradle是最新和起作用的。同時(shí),善待其他開(kāi)發(fā)者,不要強制改變他們的開(kāi)發(fā)工具和偏好。

類(lèi)庫

Jackson 是一個(gè)將java對象轉換成JSON與JSON轉化java類(lèi)的類(lèi)庫。Gson
是解決這個(gè)問(wèn)題的流行方案,然而我們發(fā)現Jackson更高效,因為它支持替代的方法處理JSON:流、內存樹(shù)模型,和傳統JSON-POJO數據綁定。不過(guò),請記住,
Jsonkson庫比起GSON更大,所以根據你的情況選擇,你可能選擇GSON來(lái)避免APP 65k個(gè)方法限制。其它選擇: Json-smart and Boon JSON

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

RxJava 是函數式反應性的一個(gè)類(lèi)庫,換句話(huà)說(shuō),能處理異步的事件。
這是一個(gè)強大的和有前途的模式,同時(shí)也可能會(huì )造成混淆,因為它是如此的不同。
我們建議在使用這個(gè)庫架構整個(gè)應用程序之前要謹慎考慮。
有一些項目是使用RxJava完成的,如果你需要幫助可以跟這些人取得聯(lián)系:
Timo Tuominen, Olli Salonen, Andre Medeiros, Mark Voit, Antti Lammi, Vera Izrailit, Juha Ristolainen.
我們也寫(xiě)了一些博客:
[1], [2],
[3],
[4].

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

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

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

同時(shí)在每個(gè)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不熟悉,只需參照以下開(kāi)始學(xué)習吧:

  • 任何只包含一個(gè)接口的方法都是"lambda friendly"同時(shí)代碼可以被折疊成更緊湊的語(yǔ)法
  • 如果對參數或類(lèi)似有疑問(wèn),就寫(xiě)一個(gè)普通的匿名內部類(lèi),然后讓Android Status為你生成一個(gè)lambda。

當心dex方法數限制,同時(shí)避免使用過(guò)多的類(lèi)庫 Android apps,當打包成一個(gè)dex文件時(shí),有一個(gè)65535個(gè)應用方法強硬限制[1] [2] [3]。
當你突破65k限制之后你會(huì )看到一個(gè)致命錯誤。因此,使用一個(gè)正常范圍的類(lèi)庫文件,同時(shí)使用dex-method-counts
工具來(lái)決定哪些類(lèi)庫可以再65k限制之下使用,特別的避免使用Guava類(lèi)庫,因為它包含超過(guò)13k個(gè)方法。

Activities and Fragments

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

  • 提供多窗格布局解決方案 Fragments 的引入主要將手機應用延伸到平板電腦,所以在平板電腦上你可能有A、B兩個(gè)窗格,但是在手機應用上A、B可能分別充滿(mǎn)
    整個(gè)屏幕。如果你的應用在最初就使用了fragments,那么以后將你的應用適配到其他不同尺寸屏幕就會(huì )非常簡(jiǎn)單。

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

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

  • 甚至ActionBar 都可以使用內部fragment來(lái)管理 你可以選擇使用一個(gè)沒(méi)有UI界面的fragment來(lái)專(zhuān)門(mén)管理ActionBar,或者你可以選擇使用在每個(gè)Fragment中
    添加它自己的action 來(lái)作為父Activity的ActionBar.參考.

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

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

Java 包結構

Android 應用程序在架構上大致是Java中的Model-View-Controller結構。
在A(yíng)ndroid 中 Fragment和Activity通常上是控制器類(lèi)(http://www.informit.com/articles/article.aspx?p=2126865).
換句話(huà)說(shuō),他們是用戶(hù)接口的部分,同樣也是Views視圖的部分。

正是因為如此,才很難嚴格的將fragments (或者 activities) 嚴格的劃分成 控制器controlloers還是視圖 views。
最還是將它們放在自己?jiǎn)为毜?fragments 包中。只要你遵循之前提到的建議,Activities 則可以放在頂級目錄下。
若果你規劃有2到3個(gè)以上的activity,那么還是同樣新建一個(gè)activities包吧。

然而,這種架構可以看做是另一種形式的MVC,
包含要被解析API響應的JSON數據,來(lái)填充的POJO的models包中。
和一個(gè)views包來(lái)包含你的自定義視圖、通知、導航視圖,widgets等等。
適配器Adapter是在數據和視圖之間。然而他們通常需要通過(guò)getView()方法來(lái)導出一些視圖,
所以你可以將adapters包放在views包里面。

一些控制器角色的類(lèi)是應用程序級別的,同時(shí)是接近系統的。
這些類(lèi)放在managers包下面。
一些繁雜的數據處理類(lèi),比如說(shuō)"DateUtils",放在utils包下面。
與后端交互負責網(wǎng)絡(luò )處理類(lèi),放在network包下面。

總而言之,以最接近用戶(hù)而不是最接近后端去安排他們。

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

資源文件 Resources

  • 命名 遵循前綴表明類(lèi)型的習慣,形如type_foo_bar.xml。例如:fragment_contact_details.xml,
    view_primary_button.xml,
    activity_main.xml.

組織布局文件 若果你不確定如何排版一個(gè)布局文件,遵循一下規則可能會(huì )有幫助。

  • 每一個(gè)屬性一行,縮進(jìn)4個(gè)空格
  • android:id 總是作為第一個(gè)屬性
  • android:layout_**** 屬性在上邊
  • style 屬性在底部
  • 關(guān)閉標簽/>單獨起一行,有助于調整和添加新的屬性
  • 考慮使用Designtime attributes 設計時(shí)布局屬性,Android Studio已經(jīng)提供支持,而不是硬編碼android:text
    (譯者注:墻內也可以參考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>

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

例外有以下這些:

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

使用styles 幾乎每個(gè)項目都需要適當的使用style文件,因為對于一個(gè)視圖來(lái)說(shuō)有一個(gè)重復的外觀(guān)是很常見(jiàn)的。
在應用中對于大多數文本內容,最起碼你應該有一個(gè)通用的style文件,例如:

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

應用到TextView 中:

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

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

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

colors.xml是一個(gè)調色板 在你的colors.xml文件中應該只是映射顏色的名稱(chēng)一個(gè)RGBA值,而沒(méi)有其它的。不要使用它為不同的按鈕來(lái)定義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>

使用這種格式,你會(huì )非常容易的開(kāi)始重復定義RGBA值,這使如果需要改變基本色變的很復雜。同時(shí),這些定義是跟一些環(huán)境關(guān)聯(lián)起來(lái)的,如button或者comment,
應該放到一個(gè)按鈕風(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>

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

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

<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í)在寫(xiě) margins 和 paddings 時(shí),你應該使用spacing_****尺寸格式來(lái)布局,而不是像對待String字符串一樣直接寫(xiě)值。
這樣寫(xiě)會(huì )非常有感覺(jué),會(huì )使組織和改變風(fēng)格或布局是非常容易。

避免深層次的視圖結構 有時(shí)候為了擺放一個(gè)視圖,你可能?chē)L試添加另一個(gè)LinearLayout。你可能使用這種方法解決:

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

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

可能會(huì )導致一系列的問(wèn)題。你可能會(huì )遇到性能問(wèn)題,因為處理起需要處理一個(gè)復雜的UI樹(shù)結構。
還可能會(huì )導致以下更嚴重的問(wèn)題StackOverflowError.

因此盡量保持你的視圖tree:學(xué)習如何使用RelativeLayout,
如何 optimize 你的布局 和如何使用
<merge> 標簽.

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

測試框架

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

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

Robotium 使寫(xiě)UI測試非常簡(jiǎn)單。 對于UI測試你不需 Robotium 跑與設備連接的測試。
但它可能會(huì )對你有益,是因為它有許多來(lái)幫助類(lèi)的獲得和分析視圖,控制屏幕。
測試用例看起來(lái)像這樣簡(jiǎn)單:

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"));

模擬器

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

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

混淆配置

ProGuard 是一個(gè)在A(yíng)ndroid項目中廣泛使用的壓縮和混淆打包的源碼的工具。

你是否使用ProGuard取決你項目的配置,當你構建一個(gè)release版本的apk時(shí),通常你應該配置gradle文件。

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

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

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

  1. ProGuard 已經(jīng)移除了類(lèi),枚舉,方法,成員變量或注解,考慮是否是必要的。
  2. ProGuard 混淆了類(lèi),枚舉,成員變量的名稱(chēng),但是這些名字又被拿原始名稱(chēng)使用了,比如通過(guò)Java的反射。

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

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

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

防止 ProGuard 混淆 一些類(lèi)和成員,添加 keepnames:

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

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

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

Tips每次發(fā)布新版本都要寫(xiě) mapping.txt。每發(fā)布一個(gè)版本,如果用戶(hù)遇到一個(gè)bug,同時(shí)提交了一個(gè)混淆過(guò)的堆棧跟蹤。
通過(guò)保留mapping.txt文件,來(lái)確定你可以調試的問(wèn)題。

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

致謝

感謝Antti Lammi, Joni Karppinen, Peter Tackage, Timo Tuominen, Vera Izrailit, Vihtori M?ntyl?, Mark Voit, Andre Medeiros, Paul Houghton 這些人和Futurice 開(kāi)發(fā)者分享他們的Android開(kāi)發(fā)經(jīng)驗。

License

Futurice Oy
Creative Commons Attribution 4.0 International (CC BY 4.0)

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Android Studio常用Gradle操作
Android Studio 常用功能介紹
Android Gradle 使用教程
老項目遷移AndroidStudio3.0帶你踩完所有坑~
1.3.6 詳解build.gradle文件——Android第一行代碼(第二版)筆記
Ant,Maven與Gradle的概念的理解
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久