0

因此,我们已经到了 Android 游戏开发的最后阶段,是时候对 Proguard 进行一些混淆了。

我们的游戏使用 Greystripe 广告,编译调试版本时一切正常,针对 API 7。

但是在编译发布版本时(在过程中添加了 Proguard),有很多警告:

Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.DeviceInfo: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.GSFullscreenActivity: can't find referenced class android.hardware.Camera$CameraInfo
Warning: com.greystripe.sdk.GSFullscreenActivity: can't find referenced class android.hardware.Camera$CameraInfo
Warning: com.greystripe.sdk.GSFullscreenActivity: can't find referenced method 'void getCameraInfo(int,android.hardware.Camera$CameraInfo)' in class android.hardware.Camera
Warning: com.greystripe.sdk.GSFullscreenActivity: can't find referenced method 'int getNumberOfCameras()' in class android.hardware.Camera
Warning: com.greystripe.sdk.GSFullscreenActivity: can't find referenced method 'android.hardware.Camera open(int)' in class android.hardware.Camera
Warning: com.greystripe.sdk.GSFullscreenActivity: can't find referenced method 'void setDisplayOrientation(int)' in class android.hardware.Camera
Warning: com.greystripe.sdk.GSFullscreenActivity: can't find referenced class android.hardware.Camera$CameraInfo
Warning: com.greystripe.sdk.GSFullscreenActivity: can't find referenced method 'void setLayerType(int,android.graphics.Paint)' in class com.greystripe.sdk.aa
Warning: com.greystripe.sdk.a: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.a: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.ah: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.aj: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.aj: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.aj: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.as: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.as: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.as: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.as: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.as: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.at: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.at: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.bd: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.be: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.be: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.be: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.be: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.be: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.be: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.bh: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.bh: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.bl: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.bl: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.bl: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.bl: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.bl: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.m: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.m: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.m: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.m: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.m: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.m: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.m: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.m: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.m: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.s: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.s: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.w: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.w: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.w: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.w: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.w: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.w: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.w: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.w: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.w: can't find referenced class android.webkit.JavascriptInterface
Warning: com.greystripe.sdk.w: can't find referenced class android.webkit.JavascriptInterface
Warning: there were 64 unresolved references to classes or interfaces.
     You may need to specify additional library jars (using '-libraryjars').
Warning: there were 5 unresolved references to program class members.
     Your input classes appear to be inconsistent.
     You may need to recompile them and try again.
     Alternatively, you may have to specify the option 
     '-dontskipnonpubliclibraryclassmembers'.

所以很明显我开始尝试很多不同的变化-keep class等等-keep public class,但没有任何效果。然后我开始大量使用谷歌搜索,发现大量论坛帖子中人们都有同样的问题,我尝试了人们回复的所有建议。还是没有变化。

然后我查看了android.jar,发现android.webkit.JavascriptInterface在API 17之前没有引入,然后它当然是有道理的。因为我的目标是 API 7,所以自然没有android.webkit.JavascriptInterface可用的。

但我不想仅仅因为广告而定位 API 17,而且我很确定我也不应该这样做。

从逻辑上讲,我认为我应该能够做到-dontwarn,但这样做会导致应用程序在加载时崩溃。

我当然确保我放了-libraryjars /path/to/libs/greystripe-android-sdk-2.3.0.jar而且/path/to/android.jar

有人对此有任何线索吗?如何混淆我的应用程序,同时不理会 graystripe-sdk jar?

4

3 回答 3

1

ProGuard 在读取输入后立即打印这些警告,因此-keep选项无济于事。您应该针对 API 17 进行构建,以便 ProGuard 可以找到分析和处理您的应用程序所需的所有类。您仍然可以在 AndroidManifest.xml 中指定不同的目标。

如果您使用的是标准的 Ant/Eclipse/Gradle 构建,则不应指定-libraryjars,因为这些构建已经为您完成了这项工作。

于 2013-07-19T23:08:45.030 回答
1

将以下内容添加到您的 ProGuard 文件中:

-keep class com.greystripe.** { *; }

这应该会删除警告并允许 Greystripe SDK 按预期运行。

如果由于某种原因该行无法修复它,请尝试以下操作:

-keep class com.greystripe.** { *; }

-keepclassmembers class com.greystripe.** { public *; }

于 2013-07-29T22:40:58.080 回答
0

虽然我现在没有时间测试这个(我还有很多其他的事情要做),但我想趁它还记忆犹新的时候把它写在这里。然后我们将看看它是否会成为以后的解决方案。

要记住的重要一点:targetSdkVersion 与构建版本不同。

在这种情况下,使用 Greystripe 类,它们显然会测试某些仅在 API 17 之后才可用的 Android 类的存在,您应该将构建目标设置为 API 17。这意味着您将使用 API 17 中可用的类进行编译. Proguard因此不应该给出警告。

不过,在您的 AndroidManifest.xml 文件中,您不一定必须输入 targetSdkVersion="17"。您可以将其设置为您希望的任何目标。(尽管由于 ICS 和菜单按钮问题,建议始终以 API 14 或更高版本为目标)。

所以现在的最优设置(理论上,以后还要测试),就是设置

build target = API 17 - 避免 Proguard 警告,因为 Greystripe API 引用 API 17 sdkTargetVersion >= 14 中的类 - 因为兼容性问题。将其设置为您能够在 minTargetVersion = 7 上测试的 API 版本(如果您的应用程序将在 API 7 上运行) - 因为根据文档,Greystripe API 应该在 API 7 上运行

然后一切都应该工作。

更多(半)相关阅读: http ://simonvt.net/2012/02/07/what-api-level-should-i-target/ http://developer.android.com/guide/topics/manifest/uses -sdk-element.html https://developer.android.com/reference/android/os/Build.VERSION_CODES.html#ICE_CREAM_SANDWICH

于 2013-07-20T08:53:27.783 回答