2014-10-22 18 views
-1

你們中的任何一個人會用你自己的話來解釋一些關於他們手冊中編寫的關鍵詞的解釋嗎?我很難全面瞭解它們中的一些是什麼意思,以及如果它們不在.cfg文件中,它們會發生什麼變化。請解釋幾個關於proguard的關鍵詞

我感興趣的關鍵詞是: 1)-dontskipnonpubliclibraryclasses和-dontskipnonpubliclibraryclassmembers

第二個作爲被解釋:

指定不要忽視包裝可見庫班成員(字段和方法) 。默認情況下,ProGuard在解析庫類時會跳過這些類成員,因爲程序類通常不會引用它們。然而,有時候,程序類和庫類一樣都在相同的包中,並且它們確實引用了它們的包可見類成員。在這些情況下,實際閱讀類成員可能會很有用,以確保處理後的代碼保持一致。

首先,它只是在外部罐子的背景下參考嗎?其次,這些標誌存在於.cfg文件中與不在那裏的區別是什麼?

2)-libraryjars,我失去了那一個。此關鍵字的用途是什麼?在proguard手冊頁上,它顯示:

指定要處理的應用程序的庫罐(或倉庫,戰爭,耳朵,拉鍊,apks或目錄)。

那麼這是不是意味着如果我不使用這個標誌,那麼這些罐子就不會被置於整個混淆過程之下?但是,如果是這種情況,那麼爲什麼當我不使用這個關鍵字時,proguard輸出中這些罐子中的類有很多警告?

下,它說:

這些罐子中的文件將不會被包含在輸出罐子。

這是什麼意思?這意味着,如果設置了該標誌,那麼除了.class文件之外的所有其他文件都不會包含在父應用程序jar中?

回答

1

經過數小時的閱讀,我想我得到了答案。特別是幫助我的是在StackOverflow上閱讀許多ProGuard的創造者答案。

讓我從罐子話題開始。 Libraryjars通常是platfrom jar,應用程序是針對它的,所以android.jar就是一個很好的例子。這個jar不會被處理,它的類不會駐留在輸出apk中,因爲它們將全部在客戶端設備上。它們不會被混淆或縮小,因爲a)即使它們不會被複制到輸出apk中,反之亦然b)如果它們被混淆,那麼它會使應用程序崩潰,因爲在混淆過程中說活動會有名稱更改爲「a」,但在客戶端設備上,android API不會更改。

因此,libraryjars用於處理我們的應用程序時,proguard需要的所有jar,但是最終apk中不包含哪些jars(或它的類文件)。

另一方面,Injars是我們想要縮小/混淆等的所有罐子(除非我們使用keep *關鍵字)。

現在我有這麼多困難的原因是因爲這裏有關於這些關鍵字的信息有衝突。有人說使用-injars,有人說使用-libraryjars,有些人說比較貼心。我後來發現的是,最後的答案是正確的。不需要-libraryjars或-injars關鍵字,因爲ADT爲開發人員完成了所有這些工作,並且將-injars關鍵字與位於/ libs文件夾中的所有jar一起使用。

這也是爲什麼我發現很多人使用「保持」關鍵字與其中一個罐子的軟件包忽略它的混淆/縮小。其原因是因爲ADT默認使用-injars關鍵字作爲這些罐子(而不是在此上下文中基本相同的庫罐子),所以這些罐子被標記爲處理(混淆/收縮)。爲了消除這種效應,人們使用-keep關鍵字來處理這些罐子的包裝。

至於#1問題:

首先,不是僅在外部罐的情況下參考,?答案是否定的。它受到連接罐內引用的所有庫的影響

第二,那些標誌位於.cfg文件中與不在那裏之間有什麼區別?從我發現它可以幫助ProGuard處理這些庫。