App工程搭建:幾種常見Android代碼架構分析

2021-02-13 21CTO
導語

本文算是一篇漫談,談一談關於android開發中工程初始化的時候如何在初期我們就能搭建一個好的架構。本文先分析幾個當今比較流行的android軟體包,最後我們汲取其中覺得優秀的部分,搭建我們自己的通用android工程模板。

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).所有的劃分,如果沒有需要的話,所有的劃分都可以省略。

關於21CTO社區

21CTO.com是中國網際網路第一技術人脈與社交平臺。我們為國內最優秀的開發者提供社交、學習等產品,幫助企業快速對接開發者,包括人才招聘,項目研發,顧問諮詢服務。

看微信文章不過癮,請移步到網站,誠摯歡迎您加入社區作者團隊。

網站地址:www.21cto.com

投稿郵箱:info@21cto.com

QQ群: 79309783 (歡迎掃描下列二維碼關注本微信號)

相關焦點

  • Android搭建屬於自己的技術堆棧和App架構
    (能不能好好聊天了)這篇博文主要就是針對平常使用到的框架做一個整理和分析其優劣。為了從整體上進行把握,先來看看一個完整的APP整體架構三、APP的整體架構從較高的層次將,一個APP的整體架構可以分為兩層,即應用層和基礎框架層。
  • 從零開始學Android架構(一)——什麼是設計模式?
    應用的架構是一件非常成熟,有非常多的經驗提供我們借鑑的事情,我們可以從Android的架構中學習大型項目的架構思路,我們也可以從Android的局部中學習框架的精髓,如binder的設計,framework的設計,我們也可以深入到Android的代碼細節中去看看具體的實現,看看什麼樣的場景使用什麼的設計模式,如何寫出更優雅的代碼。
  • Android架構之App組件化方案詳細實踐與總結
    ,根據不同的業務分幾個文件夾,把需要的第三方庫依賴下就開始開發了,這樣的代碼耦合嚴重,牽一髮而動全身,刪除某處代碼就會到處報錯,如果不解決掉報錯的地方,就沒法編譯打包,而且這樣的代碼只適合於個人開發,尤其團隊開發合併代碼的時候那真是一個麻煩,相信大家都會深有體會,如果項目很大的話,修改一點簡單的頁面都要重新編譯,Android編譯速度大家也都見識過,每次打包都很耗時,並且這樣的代碼想做單元測試也是無從下手
  • 【移動安全】Android程序分析入門
    一、編寫Android程序使用Android studio編寫Android應用程式加載完成進入主界面後,點擊activity_main.xml進入工程布局界面,然後可以拖動左邊的palette內的各種各樣的控制項,系統就會自動幫我們生成xml代碼。
  • Android代碼混淆使用手冊
    使用代碼混淆技術可以讓反編譯後的代碼難以閱讀(注意混淆不是讓apk不能閱讀,而是加大閱讀的難度),還可以通過壓縮優化代碼,從而減小APK的體積,甚至在一定程度上還能減小應用運行時的內存混淆包括四個功能,shrinker(壓縮), optimizer(優化),obfuscator(混淆),preverifier(預校驗)shrink:檢測並移除沒有用到的類
  • android app被殺原因專題及常見問題 - CSDN
    分析長按HOME鍵清理App最終會執行到ActivityManagerService.cleanUpRemovedTaskLocked方法中,ActivityManagerService類在文件"frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java"中,
  • 一個 2 年 Android 開發者的 18 條忠告
    絕對不要犯還沒有使用ProGuard的情況下就在Play Store上發布app的錯誤。ProGuard不僅僅減小了你的代碼,還混淆了代碼,讓逆向工程師更難理解和複製。它是Android SDK附帶的,完全免費,因此沒有理由不用。我曾見過幾個開發者沒有使用ProGuard就把app發布了。對於一個技術很普通的黑客來說破解你的app也就是幾個小時的事情。
  • Android 代碼規範文檔
    這個時候問題來了,如何讓代碼不分你我,或許只需要一套規則,你和我都認可並且遵守的代碼規範守則。那麼你的疑問可能又來了,怎麼樣才能算好的代碼規範,答案只有一個,真正好的代碼規範就是別人的代碼你一眼就能看懂,更不需要反覆去看。
  • Android APP安全測試入門
    年初單位來了一位對App安全略有研究的小夥伴,某日閒來無事教了筆者幾招,分享給大家。有句古語:」工欲善其事,必先利其器」,我們要研究App安全,沒有幾款高大上的神器是會非常麻煩的,因此本文主要給大家分享一下筆者學到的一些基礎知識,主要是一些移動端測試輔助工具的使用。
  • ...方案—全新的動態化框架Android App Bundles分析 Seasoninthesun
    針對不同cpu架構問題,國內應用開發商大部分都會將so文件只放在armabi目錄下,如此做雖然可以有效減少包體積,但可能帶來性能問題。安裝應用程式時,首先安裝base apk,然後安裝split apks。為了解splite apks運作原理,我們還是結合源碼做簡要分析。因為splite apks是Android 5.0開始支持,所以我們以5.0版本開始分析。
  • Android DropBox SDK漏洞(CVE-2014-8889)分析
    我們發現的這一漏洞影響使用Dropbox SDK 1.5.4-1.6.1版的所有Android app。我們分析了使用Android Dropbox SDK的41個app(它們使用了1.5.4-1.6.1版),其中有31個app(76%)能夠被攻擊成功)。
  • 【Sobug漏洞時間】Android APP安全測試入門
    背景最近這兩年移動端真是非常火,每個單位或多或少都會有那麼幾款App,對於我們Web安全攻城師來說,App安全也需要或多或少的了解一些。Software Development Kit下載地址:http://developer.android.com/sdk/index.html下載之後打開包中的eclipse,然後進行模擬器Android鏡像的下載,包中自帶的鏡像是Android 5.0的鏡像,建議下載老版本的,方便測試App,新版的鏡像部分App在安裝的過程中可能會有不兼容的情況
  • 經驗丨Android開發最佳實踐
    使用Gradle,完成以下工作很方便:●構建APP不同版本的變種●製作簡單類似腳本的任務●管理和下載依賴●自定義秘鑰●更多同時,Android Gradle插件作為新標準的構建系統正在被Google積極的開發。
  • Gradle 與 Android 構建入門
    :.gradle 與 .idea.gradle 與 .idea 存放 Gradle 和 AS 對於當前工程的緩存。最常見的一個應用就是點擊 sync 後,AS 會在每個工程下生成 .iml 文件,他們與 .gradle、.idea 配合為我們提供了代碼提示等常見功能。所以如果你的代碼飄紅而你確認依賴沒有問題,可以嘗試下面步驟清除 AS 緩存:1. 刪.idea 刪.gradle 文件2. 命令行執行 ./gradlew clean3.
  • android基礎入門
    應用程式了,但是如果要深入了解Android,還是要花點時間在基礎上面,在這個階段的學習中,將會給大家介紹Android的概況、開發環境的搭建、系統架構、應用程式的核心模塊、應用程式的生命周期、基本的UI控制項、彈出框、Toast、pupupwindow、Notification通知、菜單。
  • 架構組件之 ViewModel | 中文教學視頻
    它可以用來解決常見的生命周期問題,同時使您的應用程式易於測試且可維護。ViewModel 用於提供和管理 UI 界面的數據。更多詳細內容介紹,請訪問以下文檔連結> 架構組件的官方開發者文檔:https://developer.android.google.cn/arch> ViewModel 的文檔: https://developer.android.google.cn/topic/libraries/
  • (第六講)分析你的第一個 Android 程序 3
    <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action
  • [乾貨] 【譯】Android 開發規範與應用
    你可以做到,例如,添加源組『paid』和『free』在src中,這將成為您的應用程式的付費和免費的兩種模式的原始碼。你的項目引用第三方項目庫時(例如,library-foobar),擁有一個頂級包名app從第三方庫項目區分你的應用程式是非常有用的。然後settings.gradle不斷引用這些庫項目,其中app/build.gradle可以引用。
  • Hook Android C代碼(Cydia Substrate)
    參考學習的英文博文https://koz.io/android-substrate-c-hooking/創建一個目標apk編寫目標項目,用於本次實操過程的hook對象1.創建項目android create project--target android-23 --path targetapp --package
  • Android 架構組件 - 讓天下沒有難做的 App
    架構大圖Jetpack 不屬於 Android Framework,不是 Android 開發的必需品,它只是應用層開發的一種輔助手段,幫我們解決了一些常見問題,比如版本兼容、API 易用性、生命周期管理等。