我正在爲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類型,因爲String
和MyObject
都被保留。
它仍然工程還沒有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>;
}
這與Java中的類型擦除有關,我猜? http://en.wikipedia.org/wiki/Generics_in_Java#Problems_with_type_erasure – etienne 2013-04-09 08:25:04