proguard 缺少类型参数
我尝试用 ProGuard 混淆我的 Android 应用程序代码。但在此之后,我的应用程序在运行时出现异常:
11-15 01:46:26.818: W/System.err(21810): java.lang.RuntimeException: Missing type parameter.
11-15 01:46:26.828: W/System.err(21810): at da.<init>(Unknown Source)
11-15 01:46:26.828: W/System.err(21810): at gc.<init>(Unknown Source)
11-15 01:46:26.828: W/System.err(21810): at fx.f(Unknown Source)
11-15 01:46:26.828: W/System.err(21810): at com.yourshows.activity.UnwatchedActivity.onResume(Unknown Source)
我检查了一个映射文件并发现了这一点:
com.google.gson.reflect.TypeToken -> da:
我认为我的应用程序中的行如下:
Type mapType = new TypeToken<Map<Integer, WatchedEpisodes>>(){}.getType(); // define generic type
jsData = gson.fromJson(r, mapType);
我无法理解我应该做什么结论?不要使用少于三个字符的变量名或者什么?
UPD:答案
i try obfuscate my code of android app with ProGuard
. But after this my app give exception at running:
11-15 01:46:26.818: W/System.err(21810): java.lang.RuntimeException: Missing type parameter.
11-15 01:46:26.828: W/System.err(21810): at da.<init>(Unknown Source)
11-15 01:46:26.828: W/System.err(21810): at gc.<init>(Unknown Source)
11-15 01:46:26.828: W/System.err(21810): at fx.f(Unknown Source)
11-15 01:46:26.828: W/System.err(21810): at com.yourshows.activity.UnwatchedActivity.onResume(Unknown Source)
I checked a mapping
file and found this:
com.google.gson.reflect.TypeToken -> da:
I think it's lines in my app like:
Type mapType = new TypeToken<Map<Integer, WatchedEpisodes>>(){}.getType(); // define generic type
jsData = gson.fromJson(r, mapType);
I can not understand what conclusions should I do? Do not use variable name less then three characters or what?
UPD: answer
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
答案是:使用这个 proguard.cfg
非常感谢这个项目的所有者 --> google-gson
UPD:
google/gson
有针对 Android 应用程序的 proguard 配置示例。在 github 上查看
他们建议使用此配置模板
answer is: use this proguard.cfg
Big thanks to owner this project --> google-gson
UPD:
google/gson
has their example of proguard configuration for android applications.see on github
They propose to use this template of configuration
由于我一开始没有注意到问题中的链接,因此以下是线程中提到的让 GSON 与 Proguard 一起使用所需的具体行:
Since I didn't notice the link in the question at first, here are the specific lines mentioned in the thread needed to get GSON to work with Proguard:
这个问题可以通过使用不同的方式创建
TypeToken
实例(对于参数化类型Map
)来解决:gson 的下一个版本(我假设2.8),将允许您更轻松地键入:
This issue can be solved by using a different way to create the
TypeToken
instance (for the parameterized typeMap<Integer, WatchedEpisodes>
):The next version of gson (I assume 2.8), will allow you to type this more easily:
当前的答案没有解决我的问题。这是我的解决方案:
将这些行添加到您的
proguard-rules.pro
文件中:重要提示:
您应该将所有与 gson 一起使用的模型放入一个包中并将其排除使用此 proguard 规则进行 minify:
根据您的包名称更改它。 例如如果您的模型位于
com.example.models
中,您应该具有以下行:The current answer didn't solve my problem. Here is my solution:
Add these lines to your
proguard-rules.pro
file:Important Note:
You should put all your models that work with gson in a package and exclude it from minify using this proguard rule:
change it based on your package name. for example if your models are in
com.example.models
you should have this line:导入不正确:
您可能使用的是 Guava
(com.google.common.reflect.TypeToken)
中的 TypeToken 类,而不是 Gson(com.google.gson.反射.TypeToken)
。确保根据您正在使用的库导入正确的类。Incorrect Import:
You might be using the TypeToken class from Guava
(com.google.common.reflect.TypeToken)
instead of Gson(com.google.gson.reflect.TypeToken)
. Ensure you're importing the correct class based on the library you're using.