一、幾句話
二、詳細
Android SDK
把你的Android SDK放置在你的主目錄里或其他與應用無關的地方。一些IDEs在安裝的時候會把SDK關聯上,並把SDK放在IDE的同一個目錄下。當你需要升級(重裝)IDE或者更換IDE時你就會發現糟糕之處啦。另外,如果你的IDE在一個user賬戶下而不是在root下運行的話,就不要把SDK放在系統級目錄下,否則在使用時需要sudo 權限,
Build System
默認的選擇是Gradle。 Ant限制比較多而且太大。使用Gradle,你可以很輕易的做到:
-編譯不同的flavours 或應用的variants
-創建簡單的類-腳本任務
-管理和下載依賴
-自定義keystores
-等等
Android的Gradle插件同樣被Google指定為新的標準編譯系統,而且Google不斷為其升級。
項目結構
有兩種流行的選擇:舊的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
新結構主要的不同在於拆分了'源代碼集' (main,androidTest),這是來自Gradle的理念。
使用最高級別"app"有利於將你的app和其他你的應用所引用的庫項目(如:library-foobar)做區分。然後settings.gradle保持應用對這些庫的索引,而app/build.gradle可以指向這些庫。
Gradle配置
通用架構請遵循Google's guide on Gradle for Android;
小任務(腳本),你可以使用Gradle來製作小任務而不是Shell、Python或Perl等,具體參考Gradle's documentation;
密碼。在你應用的build.gradle中你需要為發布編譯定義signingConfigs。具體如下:
不要像下面這樣寫,這樣會出現在你的版本控制系統裡:
signingConfigs { release { storeFile file("myapp.keystore") storePassword"password123" keyAlias"thekey" keyPassword"password789" }}相反,你應該創建一個不會被添加到版本控制系統裡的gradle.properties文件
KEYSTORE_PASSWORD=password123KEY_PASSWORD=password789
這個文件會被gradle自動導入,所以你可以在build.gradle這樣使用:
signingConfigs { release { try{ storeFile file("myapp.keystore") storePasswordKEYSTORE_PASSWORD keyAlias"thekey" keyPasswordKEY_PASSWORD } catch(ex) { thrownewInvalidUserDataException("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.") } }}(如果使用Maven可參考原文檔)
庫
Jackson是一個Java庫,它可以實現對象和JSON數據的相互轉換。 Gson 也是一個類似的不錯選擇。不過我們覺得Jsckson更好因為它支持多種方式來處理JSON:流式,內存樹模型和傳動的JSON-POJO數據綁定。但是,記住,Jackson比GSON更加龐大,所以你要酌情考慮,如果你想避免65k methods limit那最好用GSON。其他選擇:Json-smart 和Boon JSON
網絡、緩存和圖片。使用Volley 或者Retrofit。 Volley也可以用來加載和緩存圖片。如果你選擇Retrofit,你可以用Picasso 來加載和緩存圖片。然後使用OkHttp 來執行有效的HTTP請求。這三種:Retrofit、Picasso和OkHttp都來源於同一樣公司,所以它們互相補充。 OkHttp 能用來與Volley 相連接。
RxJava是一個響應式編程庫,換句話說,處理異步事件。 (具體可參考原文檔)
Retrolambda 是一個Java庫,它幫助你的Android或者其他早於JDK8平台上使用Lambda表達式。 (具體可參考原文檔)
最後,記住dex方法限制,不要使用太多庫。 (Android應用,當被打包成dex文件時,有一個最大限制:65535個引用方法[1][2][3]。如果你超過了限制就會發生嚴重錯誤。因此,不要使用剛過多庫,使用dex-method-counts 工具來決定使用哪些類從而保持在限制內,尤其要避免使用Guava庫,因為它包含超過13k方法)
Activities和Fragments
Fragments應該是你在Android部署UI界面的默認選項。 Fragments可以在你的應用裡重用。我們推薦使用Fragements而不是activities 來繪製界面基於以下幾點:
Java包結構
在Android應用程序裡的Java結構接近MVC結構(Model-View-Controller)。在Android裡,Fragment和Activity實際上都是控制器類。而從另一角度來看,他們又是用戶交互的一部分,也就是說屬於視圖View類。
因此,我們很難嚴格區分Fragment(或Activity)是控制器還是視圖。所以從Java包角度來看,我們最好把Fragment放在它們自己的fragments包裡,然後Activity放在最高級的包裡面(遵循上文提出的建議)。當然,如果你想有2個或以上的Activity,那你就創建一個activitys包。
這樣的話,整個結構看起來就是一個典型的MVC結構。一個Models包包含POJOs,用來轉化API接口獲取的Json數據,一個views包包含Views,notifications,action bar views,widgets等。 Adapters是一個中間層,位於數據和視圖之間。但是,它們通常需要通過getView()來輸出View視圖,所以你可以把adapters放在views包的子包位置。
一些應用程序級別、僅屬於Android系統的控制器類,應該放在managers包裡。各種各樣的數據處理類,例如DateUtils可以放在utils包裡。與後台服務器交互的類應該放在network包裡。
總之,從與服務器交互到與用戶交互的整體架構可設計如下:
com.futurice.project├─ network├─ models├─ managers├─ utils├─ fragments├─ views ├─ adapters ├─ actionbar ├─ widgets ├─ notifications
資源文件命名
遵循加前綴的慣例,類似type_foo_bar.xml,如:fragment_contact_details.xml,view_primary_button.xml,activity_main.xml。
組織佈局文件
如果你不知道如何規範化一個佈局XML文件,可參考下面慣例:
<?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>