2016-11-19 84 views
0

我有一個Android open source library project其中我一直在使用單獨的庫logging(這也是我開發的)。處理庫項目中的依賴關係

日誌庫並不重要,但它使開發和調試變得更加簡單(對我和主庫的用戶都是如此)。 我正在使用gradle(和Jitpack)來使用這兩個庫。現在,日誌記錄庫實際上在清單中沒有額外的權限(用於將日誌寫入文件,而不是主庫所必需的)。

現在其中一位用戶要求我刪除額外的權限。我不知道如何在不移除日誌庫(或者更改日誌庫本身的功能)的情況下做到這一點。 我甚至意識到幾乎沒有人可能根本不需要日誌記錄庫,所以有什麼辦法可以使它成爲可選的,就像用戶沒有在他們的build.gradle中包含日誌記錄庫一樣,它不會被導入我可以檢測到而不是調用日誌記錄功能?

我知道這聽起來令人困惑,但我想知道如何去耦這兩個庫。實際上,如果您知道任何流行的圖書館的例子,請讓我知道。

+0

那麼你不能像[材料對話框](https://github.com/afollestad/material-dialogs)和其他一些庫有兩個版本庫 – Max

回答

0

是的,你可以做一些聰明的技巧。

部分權限1.

關於清單的權限。這很簡單,不要將權限添加到日誌記錄庫,而是在運行時檢查它。就像這樣:

if (context.checkPermission(
       Manifest.permission.WRITE_EXTERNAL_STORAGE, 
       android.os.Process.myPid(), 
       Process.myUid()) == PackageManager.PERMISSION_GRANTED) { 
     carry on with your write to disk operation ... 
} 

,然後在你的文檔編寫,如果使用該庫的開發人員希望有一個本地記錄,他們必須對艙單申報WRITE_EXTERNAL_STORAGE。

第2部分(不)導入LIB

所有我在這裏會寫是心臟和100%,未經測試。有可能(會)有一些錯誤,你必須轉移,但希望我會通過一個堅實的想法。

首先在NoobCameraFlash LIB,你會在build.gradle文件中定義LumberJackprovided,而不是compile。這會使編譯器知道LumberJack,所以編譯可以通過,但它不會將其包含在實際構建中。

然後在您的NoobCameraFlash庫中創建一個類庫庫funcionalities的鏡像。這意味着方法d(String, String),e(String, String)

然後你在這個鏡像類,你會像下面的東西,以檢查是否實際上可用伐木工人。

private static boolean lumberJackAvailable = false; 
private static boolean lumberJackTested = false; 
private static boolean isLumberJackAvailable() { 
    if(lumberJackTested) return lumberJackAvailable; 
    lumberJackTested = true; 
    try { 
     if(Class.forName("") != null) { 
      lumberJackAvailable = true; 
     } 
    } catch(Throwable e){ 
     // ClassNotFoundException, LinkageError, ExceptionInInitializerError 
    } 
    return lumberJackAvailable; 
} 

public static LumberJackMirror create() { 
    // could also be a singleton 
    if(isLumberJackAvailable() return new LumberJackMirror(); 
    else return null; 
} 

那麼當然你必須檢查if(lumberJackMirror != null)。所以你可以看到這不是最直接的做事方式。

簡化這一點的另一種方法是在不同的庫中創建一個接口,鏡像和實際的LumberJack實現並使用工廠可以返回接口的空實現,而不必空檢查所有時間。

同樣,在文檔中包含如果開發人員想要具有日誌功能,則必須將其添加到build.gradle。喜歡的東西compile 'your_groud_id:lumberjack:version'

編輯

這樣做的另一種常見的方式是使其明確的NoobCameraFlash初始化代碼。喜歡的東西:

NoobCameraFlash.config() 
     .setLogger(new LumberJack()); 

,這樣迫使開發者瞭解樵夫,而不是通過Class檢查。但那意味着你需要一些不僅僅是static方法的LumberJack版本。

end_edit

但希望只允許去除將足夠的,你沒有做到這一點PART.2 =]

編碼快樂。

+0

我不會使用'Class.forName(String) '除非你添加一個消費者程序規則來保留這個類。 –

+0

@JaredRummler你是對的。 @noob也必須明確告訴開發者添加ProGuard規則。我個人認爲帶有一些記錄器接口的'config()'選項是最乾淨的。但我可以看到它是如何將重構添加到Logger庫的 – Budius