1. 程式人生 > >Android的奇技淫巧—多個Project程式碼同時引入

Android的奇技淫巧—多個Project程式碼同時引入

背景

從開始學習程式設計時,老師就告訴我們設計模式、MVC等在程式設計中非常重要,所以一定要努力學習。在專案設計的時候,為了更好地解耦,我們往往會將每一個小模組都設計到了獨立的 module 裡面,但是這樣子雖然做了拆分,卻並不能很好地在各個專案中重用它們。因此筆者做了一個更加嚴格拆分,每一個library都會放在獨立的project中,這樣就可以更好地在不同的專案裡重用library。不僅如此,我們在開啟獨立的project時,Android Studio 會執行的更流暢。

每一個library在使用的時候都會被打包成aar,上傳到公司內部的maven伺服器,如此進行依賴就可以避免基礎庫遭到亂改。

但是使用這種方式,並不利於原始碼的閱讀。因此我們需要將不同的專案引入到同一個工種中進行載入。

引入工程

首先我們來看一下,使用module的時候,是如何引入的,如下:

include ":demo", ":common-android"

現在我們需要把外部工程的 module 也引入進來。要怎麼做呢?

如下:

  1. 使用Android Studio開啟作為主工程的專案

  2. 手動開啟主工程專案根目錄下的settings.gradle,新增module的依賴進去

    include ":toolkit"
  3. 給引入的module指定projectDir的路徑(專案檔案的真實路徑,建議使用相對路徑

    )

    project(":toolkit").projectDir = new File("../toolkit_lib/toolkit")

    其中,../toolkit_lib為 toolkit 的專案目錄,這個目錄下是一個完整的AS專案,可以直接開啟。

專案依賴處理

按照上面的方式,我們可以在一個專案中檢視所有的module的原始碼,但是,在獨立專案中,沒有原始碼,為解決依賴問題,我們會將每一個module都上傳到maven伺服器,使用路徑地址來進行專案依賴管理。

那麼,問題來了。我們將所有的原始碼都引入到了一個專案中,但是程式碼間的跳轉還是使用的maven中下載下來的程式碼庫。

為了解決這個問題,我們可以定義一個變數來處理,判斷當前module是否是在獨立的專案中,如果是在獨立的專案中,使用maven

庫的依賴,如果是以程式碼的形式引入整個專案,則直接使用程式碼庫的依賴。

  • 定義變數
    在每一個獨立的專案中,在gradle.properties檔案中新增isAlone屬性,如下:

    isAlone=true
  • 讀取isAlone的值

    build.gradle檔案中,讀取isAlone屬性,如果為true,依賴maven中的library, 反之依賴project中的。程式碼如下:

    def isAlone = "true" // 預設值為true
    // 判斷是否存在isAlone屬性,如果存在,讀取他的值
    if (project.hasProperty("isAlone")) { 
    isAlone = project.isAlone
    }
    // 如果是獨立專案,使用maven的引用,反之使用project
    if (isAlone == "true") {
    project.dependencies.add("compile", "com.knero.test:toolkit:[email protected]")
    } else {
    project.dependencies.add("compile", project(':toolkit'))
    }

    在新增依賴的時候,可以使用程式碼add的方式,當然也可以直接將不同的dependences放在不同的檔案中,然後分情況依賴不同的檔案,如下:

    if (isAlone == "true") {
        apply from: 'dependencies_sdk.gradle'
    } else {
        apply from: 'dependencies_sdk_proj.gradle'
    }

    不僅是依賴可以通過groovy程式碼進行新增,Android的其它屬性也可以新增,Demo如下:

    android.sourceSets.main.res.srcDirs = ['res', 'otherRes']
    android.sourceSets.main.jniLibs.srcDirs = ['libs', 'otherLibs']
    android.sourceSets.main.assets.srcDirs = ['assets', 'otherAssets']

到現在,我們的問題基本解決,但是我追求完美,還一個小瑕疵需要解決。

多專案引入的VCS處理

Android Studio有一個VCS的模組,他可以快速的在AS中處理git相關的邏輯。我都會使用他的Modify/New/Rename/Delete/Revert 等功能。但是AS預設只能處理一個專案。所以,導致我們引入的其它Project中的Module不支援git的特點,使用起來非常的不方便。經過一系列的查詢,終於找到解決方案。

一個intellij idea專案,在其根目錄下都有一個.idea的資料夾,這個裡面儲存著整個專案的配置檔案,當然也包括git的, 檔名為vcs.xml, 預設內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
    <component name="VcsDirectoryMappings">
        <mapping directory="$PROJECT_DIR$" vcs="Git" />
    </component>
</project>

當然,我們需要更改這個檔案,將我們的toolkit_lib資料夾加入到裡面,修改過後如下:

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
    <component name="VcsDirectoryMappings">
        <mapping directory="$PROJECT_DIR$" vcs="Git" />
        <mapping directory="$PROJECT_DIR$/../toolkit_lib" vcs="Git" />
    </component>
</project>

PS: toolkit_lib 和當前引入的專案在同一個資料夾下面,所以使用PROJECT_DIR相對路徑,來指定專案目錄。當然,這個地方的directory, 你也可以使用絕對路徑來指定。

依賴引入的最佳實踐

我們有多個專案需要引入,但是部分專案,沒有修改的需求,並沒有要把專案引入的需求。所以,使用一個變數,來管理所有的專案,使用起來,略顯靈活度不夠。所以,我們將每一個專案按照單獨properties來讀取其狀態,當其中一個專案的dependencies要使用maven,我們只需要將其對應的變數值設定為true或者刪除掉。讀取屬性的程式碼如下:

def isAloneProject = "true"
def propertiesName = "${project.name}Alone"
if (project.hasProperty(propertiesName)) {
    isAloneProject = project.property(propertiesName)
}
if (isAloneProject == "true") {
    // dependencies maven path.
} else {
    // dependencies project path.
}

當作為module引入的時候,只需要在主Project中的gradle.properties檔案裡面加入對應值。

toolkitAlone=false

傳送門

歡迎關注我的公眾號,一起交流技術事。

大羅說事

相關推薦

AndroidProject程式碼同時引入

背景 從開始學習程式設計時,老師就告訴我們設計模式、MVC等在程式設計中非常重要,所以一定要努力學習。在專案設計的時候,為了更好地解耦,我們往往會將每一個小模組都設計到了獨立的 module 裡面,但是這樣子雖然做了拆分,卻並不能很好地在各個專案中重用它們。因

Android studio

這篇文章篇幅較長,可以使用版權宣告下面的目錄,找到感興趣的進行閱讀 轉載自:android studio奇技淫巧   目錄 3.1 Android Studio使用初探  Project面板 S

css3 - 如何給小汽車換背景色談起

進階 真的是 poi cdp keyword 詳解 圖片轉換 select 工具 css3 的魅力,不容小覷。曾經被她折服,再度回首,依舊拜倒在她的石榴裙下。相信在未來,她仍然魅力依舊。 站在巨人的肩上學習,不斷提升自身實力。 用 CSS 和顏色選擇工具更改圖片中的顏

SQL(01):給查出的資料排序編號【row_number() over(order by c)】(mysql,db2,oracle,sqlserver通用)

我們天天都在跟資料庫打交道,寫下的程式碼不計其數,寫下的SQL更是可以繞地球幾圈。這裡收集關於SQL的神奇語法及用法,雖然你可能沒有用過,但這些SQL卻可以在關鍵的時候,派上用場。 我對SQL語句的理解,可以比作一座橋樑,將零散的資料組合起來,拿到我所需要的有效資訊。也以此記錄一下使用心得 一. 語法

,將 Docker 映象體積減小 99%

原文連結:Docker Images : Part I - Reducing Image Size 對於剛接觸容器的人來說,他們很容易被自己構建的 Docker 映象體積嚇到,我只需要一個幾 MB 的可執行檔案而已,為何映象的體積會達到 1 GB 以上?本文將會介紹幾個奇技淫巧來幫助你精簡映象,同時又不犧

關於字符串和文件流的

童鞋 err pen spa 關於 文件大小 ood c_str 64bit 早早起來,發一篇來概括一下昨天晚上搞到深夜才學到的一些字符串和文件流的簡單操作。 (寫在前面:以下所有的文件流都以輸入文件流為例,另外這種文件讀寫方式與競賽時使用的有較大差別,NOIP黨裏C++剛

Mysql數據閃回的(binlog2sql)

mysql binlog2sql 一、概述binlog2sql是一個開源項目,應用於大眾點評線上環境。類似於ORACLE中的閃回功能,binlog2sql可以基於時間點或者位置偏移量進行數據恢復。從MySQL binlog解析出你要的SQL。根據不同選項,你可以得到原始SQL、回滾SQL、去除主鍵的I

CSS布局:各種居中

設置 ybds orm 必須 解決 html prim 分享 post CSS布局奇技淫巧:各種居中 2017-08-23 無雙 前端開發 作者:無雙 鏈接:www.cnblogs.com/2050/p/3392803.html 居中是我們使用css來布局時常

黑暗中的生物:利用快活生存

not 正在 ever reading 自己的 which cat 世界 round 今日導讀 如果讓你在伸手不見五指的黑暗當中生存,你能熬過幾天呢?而大千世界,無奇不有。在很多你不知道的角落,有些生物在完全黑暗的世界裏不僅活得相當快活,還進化出了各種令人瞠目結舌的驚奇技能

C#開發一:調試windows系統服務

選項 nbsp 調試 方法 href info bubuko 系統 .html 原文:C#開發奇技淫巧一:調試windows系統服務windows系統服務不能直接運行,只能在安裝完服務之後啟動、暫停、繼續、停止服務,導致服務的調試不能使用一般的斷點調試。 要調試系統服務,

C#開發二:根據dll文件加載C++或者Delphi插件

man int cnblogs 需要 pat method msg initial 函數指針 原文:C#開發奇技淫巧二:根據dll文件加載C++或者Delphi插件 這兩天忙著把框架改為支持加載C++和Delphi的插件,來不及更新blog了。 原來的

javascript 向下取整

mat asc floor math 轉化 java 目的 奇技淫巧 移位運算 let a=5/4|0 輸出a=1 利用了javascript在進行位運算前,先把浮點數轉化為整數的特性。 同理,也可以用移位運算,達到同樣目的 let a =5/4<

」博客園頁面美化(差不多是劃水

http 沒有 博客 -- erl text 頁面 ash spa 何為頁面美化?永遠沒有止境的亂搞也。 ——hzz 教材: 博客園美化

C的

如果 %s def 完全 逆序 函數 遞歸實現 -s r+ 直接上代碼: (1).交換兩參數的值 #include <stdio.h>int main(){    int a = 10,b = 5;    a^=b^=a^=b;  

CF1063A Oh Those Palindromes

傳送門(當然上洛咕能搜到) 求指定字串最多回文子串個數 Ssy太強了... 學到一個新東西 就是如果一個字元有x個 那麼它能產生的最多的迴文串個數為C(x,2) 可以理解為選擇兩個字母作為邊界 然後發現 如果所有一樣的字母全都拼在一起 那麼總個數就是C(x,2) 所以答案就是一樣的放一起就OK

java的--意外行為與特性(譯文)

Java是一種非常成熟的程式語言 - 事實上,它已經走過21年了,如果它是一個人,它可以在美國隨便混!隨著年齡的增長,智慧也在增長,而至少有時候,有些東西會變得很怪異。在本文中,我將介Java語言的一些奇技淫巧的行為和特徵。 在這裡,沒有特別的順序去介紹一系列Java的奇技淫巧,僅供娛樂,或者你向朋友們推介

Noip前的大抱佛腳----

STL函式 set set查詢前驅後繼 multiset<int>::iterator iter; S.insert(x); iter=S.find(x);//返回迭代器 iter--;//前驅 int ans=*iter; S.erase(find(x)); return ans; 或者

那些

1.交換兩個變數的值。 分析:常用的做法是新增第三個變數來作為中介完成,這裡分享一個不太常用的做法: 變數為字串時: $a = "hello"; $b = "php"; list($a,$b) = array($b,$a); 或者: $a = $a.$b; $b = strlen(

Puppet的一些

puppet這個工具真的很神奇,先不說商業版有哪些黑科技,單是開源版本就有很多可能讓你摸不著頭腦的地方,下面來列舉一下puppet是怎麼查詢puppet server的 其實很簡單,puppet agent只要知道puppet是什麼就可以了,你可以將“puppet”寫在

Vue.js 你不知道的

自己先想一分鐘。       關於上面的面試題的具體解釋,請移步這裡,本文不在累述。正文開始,下面列舉的一些奇技淫巧有的或許你用過,有的或許你沒用過。不管有的沒的,希望你看完之後有所收穫吧。文筆和知識有限,不對的地方,請留言斧正! 給 prop