2013-04-09 96 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

相关问题