比方說,我有這樣的Java應用程序:的java的ProGuard刪除(收縮)未使用的類
package com.site;
public class MyAppBase {}
package com.site.free;
import com.site.MyAppBase;
public class MyApp extends MyAppBase {}
package com.site.pro;
import com.site.MyAppBase;
public class MyApp extends MyAppBase {}
package com.site;
public class Edition
{
public static final int FREE = 1;
public static final int PRO = 2;
private static final int EDITION = PRO;
public static boolean is(final int edition)
{
return (EDITION == edition);
}
}
現在
package com.site;
public class EditionFactory
{
public static MyAppBase get_app()
{
MyAppBase ret = null;
if (Edition.is(Edition.FREE))
ret = new com.site.free.MyApp();
else if (Edition.is(Edition.PRO))
ret = new com.site.pro.MyApp();
return ret;
}
}
,我想ProGuard的配置的任何組合,擺脫非選擇的版本(在這種情況下,它是免費的)無法正常工作。通過「擺脫」我的意思是使實際的類消失(以及來自調用代碼)。
換句話說,這樣一個電話:
final MyAppBase app = EditionFactory.get_app();
..目前正在翻譯成,ProGuarding之後,這樣的:
if (a.a(1))
localObject5 = new c(); // <<< FREE
else if (a.a(2))
localObject5 = new d(); // <<< PRO
..同時我也希望被翻譯成這樣:
localObject5 = new d(); // <<< PRO only in the code (as set at Edition.EDITION)
底線是(除了ProGuard是偉大的事實!),我似乎無法使其「透視」,並明白,Edition.is()是一個布爾函數,返回一個常量,它可以刪除一些類。
我已經試過類似的配置:
-keep,allowshrinking,allowoptimization public class * extends com.site.MyAppBase
-optimizationpasses 10
..沒有工作。另一方面,如果我參考Edition.EDITION並比較它內聯(即沒有任何「代理」函數),Java編譯器(v1.6)會檢測它並刪除整個非引用的引用 - 選擇版/類。
這導致ProGuard移除/縮小非常好的未使用的類。
這裏唯一的問題是關於維護 - 我很樂意繼續使用EditionFactory風格。
你的意思是讓'版本'爲'enum'? –
不工作JVerstry,但謝謝你的努力.. – Poni
哎呀,對不起,錯字,我的意思是版本。 – JVerstry