2013-07-19 2 views
0

Итак, мы достигли последних этапов разработки нашей Android-игры, и пришло время включить некоторую запутывание с Proguard.Greystripe and 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

Кто-нибудь есть какие-либо понятия об этом? Как я запутываю свое приложение, оставив только банку greystripe-sdk?

+0

Я хотел бы добавить, что авария, которая происходит при использовании '-dontwarn' действительно NullPointer Исключение в классах Greystripe. –

ответ

1

ProGuard печатает эти предупреждения сразу после считывания ввода, поэтому параметры -keep не помогут. Вы должны строить против API 17, поэтому ProGuard может найти все классы, необходимые для анализа и обработки вашего приложения. Вы можете указать разные цели в своем AndroidManifest.xml.

Если вы используете стандартные сборки Ant/Eclipse/Gradle, вы не должны указывать -libraryjars, так как эти сборки уже делают это за вас.

+0

Вау, ответ самого человека. Благодаря! Я был рекомендован другим парнем, чтобы настроить API 17 тоже, хотя по другим причинам. Так что, наверное, я закончу. Пока что, мне действительно удалось заставить его работать с параметром '-dontwarn'. Он компилируется и запускается без ошибок. Однако в журнале выполнения показывается предупреждение, и будет интересно узнать, не исчезнет ли это при использовании API 17. –

0

Хотя у меня нет времени, чтобы проверить это на данный момент (есть куча других вещей, которые я должен сделать), я хочу написать его здесь, пока он еще свежий в моем сознании. Затем мы увидим, будет ли это решение позже.

Важно иметь в виду: targetSdkVersion - это не то же самое, что версия сборки.

В этом случае с классами Greystripe, где они, очевидно, проверяют наличие определенных классов Android, которые доступны только с API 17, вы должны установить цель сборки в API 17. Это означает, что вы будете компилировать с использованием классов доступный в API 17. Proguard должен поэтому не давать предупреждений.

В вашем файле AndroidManifest.xml, однако, вам не обязательно указывать targetSdkVersion = "17". Вы можете настроить его на любую желаемую цель. (Хотя, поскольку ICS и проблема с кнопкой меню, рекомендуется всегда нацеливать API 14 или выше).

Так оптимальные настройки (в теории, придется проверить позже) прямо сейчас, чтобы установить

цель сборки = API 17 - чтобы избежать предупреждений Proguard, потому что Greystripe API относится к классам API 17 sdkTargetVersion> = 14 - из-за проблем с совместимостью. Установите его в версию API, которую вы можете протестировать на minTargetVersion = 7 (если ваше приложение будет работать на API 7) - поскольку API Greystripe должен работать на API 7 в соответствии с документами

Тогда все должно работать.

More (пол), связанное с чтением: 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

1

Добавьте следующие строки в файл ProGuard:

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

Это должно устранить предупреждения и позволяет Greystripe SDK функционировать как предполагалось.

Если по какой-то причине, что линия не исправить, попробуйте следующее:

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

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

Смежные вопросы