首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >前卫和Scoreloop

前卫和Scoreloop
EN

Stack Overflow用户
提问于 2013-01-16 02:11:40
回答 2查看 796关注 0票数 2

我试图在我的Android项目上使用Proguard,但在运行时在Scoreloop (版本3.0.3)库上不断收到相同的错误……

我在project.properties文件中定义了proguard配置文件,如下所示:

代码语言:javascript
复制
proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
proguard.enabled=true

下面是我的proguard-project.txt文件(其中包含了所有内容,以防我在哪里做错了……):

代码语言:javascript
复制
# ####### #
# Project #
# ####### #
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference


# ##### #
# AdMob #
# ##### #
-keep public class com.google.ads.** {*;}
-keep public class com.google.gson.** {*;}


# #### #
# ACRA #
# #### #
# we need line numbers in our stack traces otherwise they are pretty useless
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

# ACRA needs "annotations" so add this... 
-keepattributes *Annotation*

# keep this class so that logging will show 'ACRA' and not a obfuscated name like 'a'.
# Note: if you are removing log messages elsewhere in this file then this isn't necessary
-keep class org.acra.ACRA {*;}

# keep this around for some enums and classes that ACRA needs
-keep class org.acra.ReportingInteractionMode {*;}
#-keep class org.acra.ReportField {*;}
-keepnames class org.acra.ReportField {*;}

# keep this otherwise it is removed by ProGuard
-keep public class org.acra.ErrorReporter {
    public void addCustomData(java.lang.String,java.lang.String);
}
-keep public class org.acra.ErrorReporter {
    public org.acra.ErrorReporter$ReportsSenderWorker handleSilentException(java.lang.Throwable);
}


# ######### #
# Scoreloop #
# ######### #
-dontwarn com.scoreloop.client.android.core.paymentprovider.**
-keep class com.scoreloop.client.android.core.paymentprovider.fortumo.FortumoPaymentProviderController {*;}
-keep class com.scoreloop.client.android.core.paymentprovider.fortumo.FortumoPaymentProvider {*;}
-keep class com.scoreloop.client.android.core.paymentprovider.paypalx.PayPalXPaymentProviderController {*;}
-dontwarn com.scoreloop.client.android.core.ui.WebViewDialog
-keep class com.scoreloop.client.android.core.ui.WebViewDialog {*;}
-keep class com.facebook.android.** {*;}


# ############## #
# In-App Billing #
# ############## #
# -keep class com.android.vending.billing.**


# ####### #
# OrmLite #
# ####### #
# OrmLite uses reflection
-keep class com.j256.**
-keepclassmembers class com.j256.** { *; }
-keep enum com.j256.**
-keepclassmembers enum com.j256.** { *; }
-keep interface com.j256.**
-keepclassmembers interface com.j256.** { *; }

我在运行时得到这个错误:

代码语言:javascript
复制
Caused by: java.lang.IllegalArgumentException: java.lang.NoSuchMethodException: <init> [class com.scoreloop.client.android.core.b.aw]
    at com.scoreloop.client.android.core.b.j.a(SourceFile:692)
    at com.scoreloop.client.android.core.b.j.<init>(SourceFile:368)
    at com.sofresh.games.megaflux.MegaFluxApplication.onCreate(SourceFile:106)
    at com.sofresh.games.megaflux.MegaFluxApplication_.onCreate(SourceFile:19)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1000)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4391)
    ... 10 more
 Caused by: java.lang.NoSuchMethodException: <init> [class com.scoreloop.client.android.core.b.aw]
    at java.lang.Class.getConstructorOrMethod(Class.java:460)
    at java.lang.Class.getConstructor(Class.java:431)
    at com.scoreloop.client.android.core.b.j.a(SourceFile:684)

从文件mapping.txt中,我发现了以下关于有问题的类和调用的信息:

代码语言:javascript
复制
com.scoreloop.client.android.core.model.Client -> com.scoreloop.client.android.core.b.j:
    java.util.Map a -> a
    com.scoreloop.client.android.core.model.ClientObserver b -> b
    com.scoreloop.client.android.core.model.Session c -> c
    103:104:boolean a(java.util.Properties,java.lang.String,boolean) -> a
    155:178:java.util.Properties a(android.content.Context) -> a
    182:185:void a(java.util.Properties,java.lang.String) -> a
    188:194:void a(java.util.Properties,java.lang.String,java.lang.String) -> a
    198:232:void a(android.content.Context,java.lang.String) -> a
    380:387:void a(java.util.Properties) -> a
    638:640:int b(java.util.Properties,java.lang.String) -> b
    684:692:void a(java.lang.Class) -> a
    708:711:void a$2a1b557e(com.scoreloop.client.android.core.model.Session) -> a
    715:718:boolean a(com.scoreloop.client.android.core.model.Session) -> b
    722:723:void b(android.content.Context) -> b
[...]
com.scoreloop.client.android.core.model.Session -> com.scoreloop.client.android.core.b.aw:
[...]

所以我认为错误是说它找不到接受会话的客户端的构造函数。我尝试将以下内容添加到我的proguard conf:

代码语言:javascript
复制
-keep class com.scoreloop.client.android.core.model.** {*;}
-keepclassmembers class com.scoreloop.client.android.core.model.**

不幸的是,现在我得到了这个错误:

代码语言:javascript
复制
Caused by: java.lang.IllegalArgumentException: java.lang.NoSuchMethodException: <init> [class com.scoreloop.client.android.core.model.Session]
    at com.scoreloop.client.android.core.model.Client.a(SourceFile:692)
    at com.scoreloop.client.android.core.model.Client.a(SourceFile:605)
    at com.scoreloop.client.android.core.model.Client.<init>(SourceFile:368)
    at com.blabla.MyApplication.onCreate(SourceFile:106)
    at com.blabla.MyApplication_.onCreate(SourceFile:19)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1000)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4391)
    ... 10 more
 Caused by: java.lang.NoSuchMethodException: <init> [class com.scoreloop.client.android.core.model.Session]
    at java.lang.Class.getConstructorOrMethod(Class.java:460)
    at java.lang.Class.getConstructor(Class.java:431)
    at com.scoreloop.client.android.core.model.Client.a(SourceFile:684)

现在我有点不知道下一步该怎么做了。对这个错误有什么想法和启示吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-27 23:35:38

在得到Scoreloop支持人员的响应和我这边的一些测试之后,下面是Scoreloop的ProGuard配置:

代码语言:javascript
复制
# ######### #
# Scoreloop #
# ######### #
-dontwarn com.scoreloop.client.android.core.paymentprovider.**
-keep class com.scoreloop.client.android.core.paymentprovider.fortumo.FortumoPaymentProviderController {*;}
-keep class com.scoreloop.client.android.core.paymentprovider.fortumo.FortumoPaymentProvider {*;}
-keep class com.scoreloop.client.android.core.paymentprovider.paypalx.PayPalXPaymentProviderController {*;}
-dontwarn com.scoreloop.client.android.core.ui.WebViewDialog
-keep class com.scoreloop.client.android.core.ui.WebViewDialog {*;}
-keep class com.facebook.android.** {*;}
-keep class com.scoreloop.client.android.core.** { *; }
票数 3
EN

Stack Overflow用户

发布于 2013-01-16 09:45:55

代码执行反射,并且找不到构造函数,因此您确实必须确保它被保留。您的-keep选项将保留指定包及其子包中的所有类/字段/方法:

代码语言:javascript
复制
-keep class com.scoreloop.client.android.core.model.** {*;}

然而,代码可能试图在这个包之外查找类的构造函数--不幸的是,堆栈跟踪不能说明这一点。您必须弄清楚这是哪个类(或一组类),然后保留它的构造函数。

注意,您的-keepclassmembers选项不做任何事情(因为它没有指定任何类成员),但这并不是必需的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14344100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档