2013-04-09 95 views
1

我正在爲android開發一些apis作爲庫項目,我想將它們導出爲混淆jar。Proguard和HashMap <String,MyObject>

我有不同的類,但唯一的公共實體有:

  • MyInterface:接口列出一些方法,用戶將必須實現;

  • MyUtilities:有一些靜態方法的類;一個單例(用一個INSTANCE實現爲enum);

  • MyObject:實現我需要處理的特定對象的類;

我是新的混淆,所以我遵循一些教程和閱讀android/proguard文檔。

我成功地從我的項目創建了一個jar,並在外部應用程序中使用它。 我也成功地混淆了所有非公開課(所以除了上面提到的每個課程),它仍然繼續工作。


現在我的問題:

一個在MyInterface specifed方法是

public void getObject(HashMap<String, MyObject>); 

混淆之前用戶可以添加implements MyInterface到他的活動/類(自動)生成的執行界面方法,特別是:

@Override 
public void getObject(HashMap<String, MyObject> hashmap){ 
    // User implementation 
} 

後已經模糊罐子,當我添加implements MyInterface用戶活動和自動生成方法的實現,我得到:

@Override 
public void getObject(HashMap hashmap){ 
    // User implementation 
} 

所以沒有HashMap的類型。我真的不知道爲什麼會發生這種情況.. 我預計也會看到HashMap類型,因爲StringMyObject都被保留。

它仍然工程還沒有HashMap的類型,但我必須將它轉換爲Hasmap<String, MyObject>

這是我的ProGuard的conf文件(ProGuard的GUI工具生成):

-injars inAPIs.jar 
-outjars 'obfAPIs.jar' 

-libraryjars /My/android/SDK/Path/platforms/android-15/android.jar 
-libraryjars /My/android/SDK/Path/tools/support/annotations.jar 
-libraryjars /My/android/SDK/Path/add-ons/addon-google_apis-google-15/libs/effects.jar 
-libraryjars /My/android/SDK/Path/add-ons/addon-google_apis-google-15/libs/maps.jar 
-libraryjars /My/android/SDK/Path/add-ons/addon-google_apis-google-15/libs/usb.jar 

-overloadaggressively 


-keep class my.package.MyObject { 
    public <fields>; 
    public <methods>; 
} 

-keep public class my.package.MyUtilities { 
    public <fields>; 
    public <methods>; 
} 

-keep interface my.package.MyInteface { 
    public <fields>; 
    public <methods>; 
} 

-keep public class my.package.MySingleton { 
    public <fields>; 
    public <methods>; 
} 

-keep,allowshrinking public class my.package.MyInterface { 
    public <fields>; 
    public <methods>; 
} 

-keep,allowshrinking public class my.package.MyObject 

-keep,allowshrinking public class my.package.MyUtils 

-keep,allowshrinking public enum my.package.MySingleton { 
    public <fields>; 
    public <methods>; 
} 
+0

這與Java中的類型擦除有關,我猜? http://en.wikipedia.org/wiki/Generics_in_Java#Problems_with_type_erasure – etienne 2013-04-09 08:25:04

回答

3

Proguard docs ,你可能要添加以下選項:

-keepattributes Signature 

引用他們的文檔:

在JDK 5.0和更高版本中編譯時,需要「簽名」屬性才能訪問通用 類型。

+0

完美,谷歌搜索「proguard類型擦除」我在這裏閱讀它:http://sourceforge.net/p/proguard/bugs/406/ – 2013-04-09 08:40:09

+0

是的,這是它。 – etienne 2013-04-09 08:41:11

相關問題