Android學習系列(18)–App工程結構搭建

來源:互聯網
上載者:User

      本文算是一篇漫談,談一談關於android開發中工程初始化的時候如何在初期我們就能搭建一個好的架構。
      關於android架構,因為手機的限制,目前我覺得也確實沒什麼大談特談的,但是從開發的角度,看到整齊的代碼,優美的分層總是一種舒服的享受的。
      從藝術的角度看,其實我們是在追求一種美。

      本文先分析幾個當今比較流行的android軟體包,最後我們汲取其中覺得優秀的部分,搭建我們自己的通用android工程模板。
      1. 微盤
      2. 久憶日記
      3.網易新聞
      4.小米應用

1.微盤
      微盤的架構比較簡單,我把最基本,最主乾的畫了出來:

      第一層:com.sina.VDisk:com.sina(公司網域名稱)+app(應用程式名稱) 。
      第二層:各模組名稱(主模組VDiskClient和實體模組entities)
      第三層:各模組下具體子包,實作類別。
      我們能得出上述分析中一個最簡單最經典的結構,一般在應用程式套件組合下放一些全域的包或者類,如果有多個大的模組,可以分成多個包,其中包括一個主模組。
      在主模組中定義基類,比如BaseActivity等,如果主模組下還有子模組,可以在主模組下建立子模組相應的包。說明一點,有的時候如果只有一個主模組,我們完全可以省略掉模組這一層,就是BaseActivity.java及其子模組直接提至第二層。
      在實體模組中,本應該定義且只定義相應的實體類,供全域調用(然而實際情況可能不是這樣,後面會說到)。在微盤應用中,幾乎所有的實體類是以xxx+info命名的,這種命名也是我贊成的一種命名,從語義上我覺得xxxModel.java這種命名更生動更真實,xxxModel給我一種太機械太死板的感覺,這點完全是個人觀點,具體操作中以個人習慣為主。還有一點,在具體的xxxInfo,java中有很多實體類中是沒有get/set的方法,而是直接使用public的欄位名。這一點,我是推薦這種方式的,特別是在移動開發中,get/set方法很多時候是完全沒有必要的,而且是有效能消耗的。當然如果需要對欄位設定一定的控制,get/set方法也是可以酌情使用的。

2. 久憶日記
      相比於微盤的工程結構,久憶日記的結構稍微複雜了一些。如:
 
      1).第一層和前面微盤一樣的.
      2).第二層則沒有模組分類,直接把需要的具體實作類別都放在下面,主要日記的一些日記相關的Activity。
      3).第二層的實體包命令為model包,裡面不僅存放了實體類xxx.java,而且存放了更高一級的實體類的相關類,比如xxxManager.java,xxxFactory.java.關於這一點,我們可以參考一下android.jar中結構,我們發現,Activity.java和ActivityManager.java,View.java和ViewManager.java,Bitmap.java和BitmapFactory.java等等N多類似的一對類都在同一個包下,我個人覺得實體包下存放實體類相應的Manager和Factoty類也是正確的,是我們應該採納的一種結構。這裡就打破了前面微盤中說的實體包下存放且只存放實體類的說法了。在現實中,從靈活和合理的角度,久憶日記的這種實體包中存放對象內容更加實用。
      4).第二層中增加了前面微盤中沒有涉及到的config,constant和common包。第一,其中config中儲存一些系統配置,比如名稱,應用參數等系統級的常量或者靜態變數,當然,如果你有其他大模組的配置,比如如果擁有複雜的使用者管理模組的話,完全可以增加一個UserConfig.java中儲存使用者的一些配置資訊等等。第二,constant包,此包下存放的都是public static final常量,定義狀態,類型等等。出於效能考慮,android開發中我不推薦使用枚舉。common包中定義一個公用庫,這裡因為應用單一,無法很好的說明common包內容結構。
      5).common包要涉及後面多個軟體比較後我們再得出結論。
      通過久憶日記的分析,借鑒到了不少的東西,使我們的架構更豐滿更強大了。 

3.網易新聞
      網易新聞確實做的不錯,從應用的角度看,是我最欣賞的應用之一。它的工程結構是怎麼樣的呢?
 
      網易新聞的工程結構和前面2各app又有很多的不同,它並沒有按照模組來分,而是主要按照組件的類型來分的,然後把此類型所有的類全部放在其下。那麼這種把所有activity全部放在activity包下的分法的確在android開發中比較普遍。
      1).第一層被分成了兩層,可以看出來,這裡肯定是採用了公用包jar,如此說來,我們開發公用包的時候也應該按照"公司網域名稱+公用模組名稱"組合方式來命名比較好。
      2).第三層(綠色層)中activity和service包下都是存放所有的activity組件和service組件,其實這裡麵包含了一種代碼習慣。往往activity相關的類如監聽器,線程,適配器等非常多的類,這些不好直接丟在activity包下,而是直接寫在相應的activity中以匿名或者內部類形式定義,否則activity包和service包看上去會比較雜亂。
      因為android的app很可能不是很大,activity或者service包也不會雜亂,所以網易新聞的這種方式也是很有參考借鑒價值的。

4.小米應用
      小米應用程式套件括3個應用,小米分享,小米閱讀,小米標籤,從實際代碼開發來看,我感覺不是同一個團隊,或者同一組人開發的。 這種情況下,他們的架構又使如何?
 
 
 
       上面的結構以及結構內部的細節其實很多地方我都是不大苟同的,但是能做出來好東西就是值得大家學習的,所以我只把其中我認為最值得學習的一點拿出來說。
       首先,widget,provider這些特殊模組分類建立單獨的模組包即可,這裡久不多說什麼。
       第二,通過觀察,我們發現小米分享中每個應用都有common包,不僅有應用程式層級的common包,而且有應用程式內層級的common包。我想說的是,android開發中隨著項目開發的積累,確能提取到很多公用的方法、類、功能模組。各個項目之間如此,各個項目內部也是如此,所以針對項目類被各個模組調用的方法,類也可以提取出相應的公用庫。
       那麼這裡有個問題,公用common包的內部包可能涉及到很多的內容,是否要分包分級呢,又如何分包分級?我覺得,這個因情況而已,一般來說移動開發,為了減少包的大小,我們會控制common包的膨脹,往往common包僅僅包括一些最簡潔最經典的東西,東西又很少的話就無需分包,但是如果貴公司開發成百上千,每個項目都用到行為分析,意見反饋等公用模組,分一下包會更清楚一點。總而言之,分不分包無關緊要,盡量讓你的代碼結構清晰,思路瞭然就好。

5.聚各家之長,集大家之成。
      上面粗略的分析之後,我們應該對android程式的架構有一個感覺,清晰而雜亂。我也沒有去了看更多其他應用的結構,暫時就總結一下,得出一個我們自己的通用的工程結構。
      假如公司名為tianxia,目前公司準備開發讀書應用,交友應用,生活服務應用。
      第一時間我們應該得出下面這種整個的架構(具體的app開發當然要分開):

      公司下開發3個應用reader,friend,life,其中common包為這三個應用共用,config,oauth為可選,view存放一些最通用的自訂view,比如對話方塊,定製的列表等,如果你覺得有些view可能不會通用,最好把它放在應用程式類的common包下。
      如果各位看過Android學習系列(6)--App模組化及工程擴充的話,對於這種多應用模式,應該存在android庫共用情況,來解決資源替換,工程複用的問題。所以我又修改如下:
 
其中BaseApplication做一些所有app都會用到的基礎初始化或者配置。之後其他應用的application應該都繼承此BaseApplication。

      base是一個android庫,也是一個完整的android工程,而common只是一個jar檔案,當然你也可以根據需要作為android庫來開發。其他主工程reader,friend,life應該引用base工程。
      ad包存放公司自訂的一些軟廣告。
      feedback包下儲存一些使用者反饋等通用功能模組。
      其實,很多情況下,upgrade模組也可以添加到base工程下,制定統一的軟體升級機制。 
      接下來我們以reader為例子,來詳細完成它的工程結構的設計。
      其中,config包下的AppConfig.java存放應用程式的根配置,比如版本,目錄配置等等。
      module包下分為各個模組,blog為部落格模組,bbs為論壇模組,person為整站個人資訊模組,widget表示一種特殊功能模組。
      common包下存放一些工具類,本應用程式的一些自訂View等等。
      再結合之前所講的內容,我們把整個串起來,完善一個reader的最後的架構如下(兩外兩個freind和life亦是類似如此):

     注意:1).功能模組和類型模組均可以劃分,如果沒有需要的話,模組的劃分都可以省略。
             2).activity和service這類組件劃分,如果沒有需要的話,組件的劃分都可以省略。
             3).所有的劃分,如果沒有需要的話,所有的劃分都可以省略。
     但是,但是,這種分類,我個人還是覺得層次清晰,架構明朗,值得參考的,當然其中很多細節我也沒有仔考慮,如有不妥,還請發現者指出。 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.