Подтвердить что ты не робот

Отмена аннотаций Proguard в приложении Android

Я включил проект, используя gradle в моем приложении:

compile group: 'org.bytedeco', name: 'javacv', version: '0.11'

Что строит отлично. Но всякий раз, когда я запускаю приложение с включенной proguard, он, видимо, удаляет аннотацию @Platform из банок, которые затем включаются.

Я попытался использовать следующее на основе http://proguard.sourceforge.net/manual/examples.html#annotations

-keepattributes *Annotation*

-keep @org.bytedeco.javacpp.annotation interface * {
    *;
}

Я также пробовал следующее на основе http://proguard.sourceforge.net/manual/troubleshooting.html#notkept

-keep @interface *

Но это тоже не работает. Что еще я могу попытаться предотвратить, чтобы proguard удалил эти аннотации? Я думал об использовании -injars или -libraryjars, но я верю, что gradle обрабатывает это для вас.

<ч/" >

Решение:

Итак, решение таково:

Я включил следующее в мои правила proguard:

# JavaCV
-keep @org.bytedeco.javacpp.annotation interface * {
    *;
}

-keep @org.bytedeco.javacpp.annotation.Platform public class *

-keepclasseswithmembernames class * {
    @org.bytedeco.* <fields>;
}

-keepclasseswithmembernames class * {
    @org.bytedeco.* <methods>;
}

-keepattributes EnclosingMethod
-keep @interface org.bytedeco.javacpp.annotation.*,javax.inject.*

-keepattributes *Annotation*, Exceptions, Signature, Deprecated, SourceFile, SourceDir, LineNumberTable, LocalVariableTable, LocalVariableTypeTable, Synthetic, EnclosingMethod, RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations, RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations, AnnotationDefault, InnerClasses
-keep class org.bytedeco.javacpp.** {*;}
-dontwarn java.awt.**
-dontwarn org.bytedeco.javacv.**
-dontwarn org.bytedeco.javacpp.**

# end javacv

И следующие строки в моем gradle (это самые последние версии на дату 7/5/2015 (дд/мм/гггг)):

compile group: 'org.bytedeco', name: 'javacv', version: '0.11'
compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '2.4.11-0.11', classifier: 'android-arm'
compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '2.4.11-0.11', classifier: 'android-x86'
compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.6.1-0.11', classifier: 'android-arm'
compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.6.1-0.11', classifier: 'android-x86'

Я совершенно уверен, что некоторые правила proguard немного переборщит, но я еще не тестировал, которые являются избыточными. Вы можете сами понять это, если столкнулись с этой проблемой.

4b9b3361

Ответ 1

Я также использую javacv, и вот как выглядит мой файл proguard:

## JavaCV
-keepattributes *Annotation*, Exceptions, Signature, Deprecated, SourceFile, SourceDir, LineNumberTable, LocalVariableTable, LocalVariableTypeTable, Synthetic, EnclosingMethod, RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations, RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations, AnnotationDefault, InnerClasses
-keep class org.bytedeco.javacpp.** {*;}
-dontwarn java.awt.**
-dontwarn org.bytedeco.javacv.**
-dontwarn org.bytedeco.javacpp.**

Это может быть несколько чрезмерно, но это то, что, наконец, заставило его работать на меня. Надеюсь, это поможет вам.

Вам также не нужно добавлять дополнительные файлы jar, если вы добавите следующие строки в ваш файл gradle:

compile group: 'org.bytedeco.javacpp-presets', name: <module>, version: <module-version>, classifier: <your-platform>

Чтобы получить доступные модули, выполните поиск javacpp в jcenter, и вы увидите их как org.bytedeco.javacv-presets:<module>.

Щелчок по любому из них позволит вам получить версию, соответствующую вашей версии javacv. Поэтому, если вы используете javacv 0,11 и хотите добавить модуль opencv, вам нужно будет использовать версию 2.4.11-0.11 javacpp-preset.

Наконец, просто добавьте платформу по вашему выбору android-arm или android-x86 или оба варианта, и вам должно быть хорошо идти.

Наконец, в качестве примера, здесь импорт javacv будет выглядеть для opencv и ffmpeg для платформы для рук:

compile group: 'org.bytedeco', name: 'javacv', version: '0.11'
compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '2.4.11-0.11', classifier: 'android-arm'
compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.6.1-0.11', classifier: 'android-arm'

Ответ 2

Возможно, это может помочь.

-keep @org.bytedeco.javacpp.annotation.Platform public class *

-keepclasseswithmembernames class * {
    @org.bytedeco.* <fields>;
}

-keepclasseswithmembernames class * {
    @org.bytedeco.* <methods>;
}

Ответ 3

Следующие могут помочь:

-keepattributes *Annotation*
-keepattributes EnclosingMethod
-keep @interface org.bytedeco.javacpp.annotation.*,javax.inject.*

Ответ 4

Вы можете использовать:

-keepattributes *Annotation*

-keep @org.bytedeco.javacpp.annotation.Platform interface * {
    *;
}
-keepclassmembers,allowobfuscation class * {
    @org.bytedeco.javacpp.annotation.Platform <fields>;
    @org.bytedeco.javacpp.annotation.Platform <init>(...);
}