0

これで、Android ゲームの開発の最終段階に到達したので、Proguard による難読化を含める時が来ました。

私たちのゲームはグレーストライプ広告を使用しており、デバッグ バージョンをコンパイルして 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 classand-keep public classなどを試し始めましたが、何の効果もありませんでした. それから私はグーグルをたくさん始めました、そして人々がいくらか同じ問題を抱えているフォーラムの投稿をたくさん見つけました、そして私は人々が答えたすべての提案を試しました. まだ変化なし。

次に、android.jar を調べたところ、android.webkit.JavascriptInterfaceAPI 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 に答える
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 に答える