Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android資訊 >> Android項目的依賴關系解析

Android項目的依賴關系解析

編輯:Android資訊

在Android SDK Tools和Eclipse ADT 插件的第17版本 (revision 17)中,我們對Android項目的依賴關系管理做了很多改變。

我們所做的第一個改變是調整基於 Ant 的編譯系統和 Eclipse ADT 插件,使他們具有相同的行為。

Android 項目包含源代碼文件夾,以及對庫項目 (android library projects) 和 jar 文件的依賴。 不需要其他多余的設置,只需要在project.properties中添加對於庫項目的依賴,Android項目就會在動在 classpath 中添加以下依賴項:

  • libs/*.jar 的內容
  • 庫項目(library project)的輸出。
  • 庫項目的 libs/*.jar 的內容。

這些依賴項,加上項目自身源代碼編譯的結果,被一起交給DEX工具,然後被轉化成字節碼從而打包到最終的APK當中。

因為一個項目可能依賴於好幾個使用相同的 jar 文件的庫項目,Android 編譯系統會檢查所有所需的 jar 文件,檢測出來自不同的庫項目的重復 jar 文件,並刪除這些重復的jar引用。這會防止可怕的”already added” DX錯誤。

下面介紹了系統如何發現重復引用。

重要的變化 我們已經改變了庫項目生成和打包R類的方式:

  • R類不再被打包到庫項目的輸出 jar 包中。
  • 庫項目不再為其所依賴的庫項目生成R類。 只有主應用項目才會在生成本身R類的同時為所依賴的庫項目生成R類。

這意味著庫項目不能導入(import)另一個庫項目的R類。 其實這是沒有必要的,因為它們自身的R類包含所有必要的資源。

請注意,應用程序的項目仍然可以導入所引用的庫項目的R類,但是重申一遍,其實沒有必要這麼做, 因為他們本身的R類包括所有的資源。

Eclipse的具體變化

由於不光包含庫項目,被稱為”Library Projects”的動態class path容器 (dynamic class path container) 已更名為“Android Dependancies”。

現在被庫項目引用的純 Java 項目也可以填充classpath容器。 如果這些Java項目也引用其他 Java 項目或 jar 文件,它們將被自動添加(現在也支持通過 user libraries引用的jar文件)。

重要: 僅當被引用的項被標記為”exported”時這才起作用。 請注意,默認情況下,當一個項目或jar文件被添加到項目的build path 中時是不會被標記為”exported”。

庫項目( 以及它們所引用的lib/*.jar文件)總是會被標記為”exported”。

重要: 如果你還在手動引用jar類庫,而不是把他們放在libs目錄下, 注意以下幾點:

  • 如果該項目是一個 library project,應用項目默認情況下看不見這些jar 類庫。 你必須把這些類庫挪到”libs”子目錄下。
  • 如果該項目是一個應用程序項目,你可以這樣做,但你必須確保把引用的jar文件標記為”exported”。

下圖介紹了如何將Java項目和jar類庫標記為”exported”(Android Dependencies 容器不必被標為”exported”,反正它總是會被導出):

Mark references as exported in Eclipse

再次強調一下, 重復的引用(包括引用的項目和 jar 文件)會被自動發現並且刪除掉。

依賴解析

當一個項目引用了兩個庫項目,都需要相同的jar文件,編譯系統需要檢測和解決這種重復。

一個完整的依賴系統會將每個jar文件關聯到一個完全限定名 (fully qualified name) 和一個版本號,以決定使用哪個版本。

不幸的是,Android編譯系統暫時還沒有一個完整的依賴解析系統。 在此期間,我們按照下列規則實現了一個簡單的系統:

** 嚴格按照文件名來識別 jar 文件 **

這意味著 mylib.jar 和 mylib-v2.jar 是不同的兩個文件,雖然它們實際上是不同版本的同一個類庫, 他們都將被打包,從而可能導致 dx “already added” 錯誤。

對於具有相同文件名的 jar 文件,“相同版本”是指完全相同的文件。

目前,我們的檢測是非常基本的,只檢查這些文件是不是有相同的大小和sha1 值。

如果兩個庫都包含在他們的libs文件夾名為mylib.jar文件,但是這兩個文件是不同的,編譯系統將不能指出這種依賴錯誤。

解決的辦法: 如果它們是相同的類庫,確保兩個jar文件實際上是同一個。 如果是不同的兩個類庫,把他們重新命名為不同的jar包。

特殊情況: android-support-v4.jar 和 android-support-v13.jar

我們把這兩個庫當作特殊情況來處理, 因為-V13裡面包含一個完整-V4的版本。 如果發現兩者同時存在,只有V13被使用。

請注意,我們不能保證-V13中使用的-V4版本和其他老的類庫使用到的-V4版本是相同的。 我們建議,當您更新您的項目與新版本的support library,你在同一時間更新您的所有項目,無論他們使用-V4還是-V13。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved