2016-07-06 48 views
1

緊湊的罐子,我們這是在JAR清單中定義一些入門的主要方法,和一堆依賴。創建沒有給出一個普通的Java項目的Gradle依賴

現在通常當我們創建一個分佈,我們可以使用應用程序的插件,並且有一定的結構類似這樣的輸出

/bin (some splatform specific scripts that point to our jar) 
/lib (our jar + all dependencies with their dependencies etc...) 

問題是,即使我們使用了只有幾類,從我們的直接依賴關係,他們和所有的傳遞依賴將最終分佈。例如,從100M的發行版中,只有1M是實際可能運行的代碼,可能與我們的應用程序有任何關係...

像proguard這樣的工具可以將代碼收縮到特定的jar中進行各種優化,但不會在意if該代碼未被使用。通過未使用我的意思是主要方法是jar的入口點,並根據主要的代碼它可能永遠不會使用實際應用程序jar中的大部分代碼和更多的庫罐中...

我們的目標是創建一個具有唯一的代碼,它實際上會使用這個1M罐子,考慮到是什麼在JAR清單的主要方法...

我搜索了很多,但找不到任何解決方案對此,proguard非常接近,但我找不到任何方式使它只關心代碼的特定流程而不是所有的代碼。

是否有可以做這件事的任何工具?

+0

只是一個側面說明:請記住,有一個)反射......使得它很難確定哪些類是真的* *需要...然後b)在轉換爲停機問題:對於任意程序和輸入,您可以**不**確定是否曾經使用某個函數(又名類)。所以,我說的是:也許你的問題有實用的答案,但是大的理論是不利於你的。 – GhostCat

+0

SO關閉主題。 – ManoDestra

+0

@Jägermeister通常,如果一個圖書館依賴於反思,你會發現它並明確告訴proguard不要刪除這個或那個類......在我的情況下,我根本不使用它...關於b)這是怎麼回事?如果proguard已經這樣做了,它會通過字節碼,並且如果它檢測到死代碼,它將刪除它或任何未使用的類...所以proguard做我想要的它只是它不關心入口點... – vach

回答

1

你對什麼樣的ProGuard確實描述是錯誤的:

的工具,像proguard的可收縮的代碼與各種 優化特定的罐子,但如果代碼是不使用也不會在意。未使用的i 表示主要方法是jar的入口點,並且取決於 主代碼可能永遠不會使用實際應用程序jar中的大部分代碼以及更多庫jar中的代碼...

你描述爲unused code正是ProGuard在其收縮步驟中所做的。從種子開始(在你的案例中,main方法),它將查找正在使用的任何類/方法並刪除其他所有內容。

如果有太多的類被保留,這是最有可能是由於一些-keep規則。您必須根據需要進行調整。如果第三方庫不使用反射,則不需要保留。

ProGuard也可以刪除dead code優化步驟:根據流分析決不會執行的方法中的任何指令都將被刪除。這種技術在教學層面上運行,而縮小在類層面上運行。

+0

但是我不知道我可以在哪裏給它我的主要方法?這是我做的 – vach

+0

injars「$ buildDir/libs/$ {project.name} .jar」, injars configurations.compile.all, outjars'build/libs/proguard-gradle-example.out.jar' – vach

+0

i希望它包含所有包括依賴項的jar包,並且只發佈一個jar ...我在哪裏告訴proguard這個特定的X.Jar是我真正的應用程序? – vach

相關問題