Proguard и специальный для Android DexGuard являются оптимизаторами и обфускаторами Java и Android приложений. Они помогают повысить скорость выполнения кода, уменьшить размер приложения, затруднить анализ и понимание алгоритмов работы и модификацию при декомпиляции. Вы может использовать совместно Proguard и DexGuard в вашем libGDX приложении чтобы сделать его более сложным для декомпиляции сторонними лицами, чтобы уменьшить размер и повысить скорость выполнения. В данной статье рассматриваются Proguard правила для libGDX, также вам могут быть полезны правила конфигурации ProGuard для разных библиотек и фреймворков.
Следующий конфигурационный файл позволить libGDX приложению работать совместно с ProGuard
Использование
# Чтобы задействовать ProGuard в вашем проекте отредактируйте project.properties # для определения proguard.config свойств как описано в этом файле. # Добавьте сюда Proguard правилась необходимые для вашего проекта # По умолчанию флаги в этом файле добавляются к указанным флагам в # ${sdk.dir}/tools/proguard/proguard-android.txt # Вы можете отредактировать путь и порядок включения, изменив свойства ProGuard # включенные в project.properties. # Подробнее смотрите # http://developer.android.com/guide/developing/tools/proguard.html # Добавьте сюда любые -keep правила вашего проекта # Если ваш проект использует WebView с JS, раскомментируйте следующие строки # и укажите полное имя JavaScript интерфейс класса. # -keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} -verbose -dontwarn android.support.** -dontwarn com.badlogic.gdx.backends.android.AndroidFragmentApplication -dontwarn com.badlogic.gdx.utils.GdxBuild -dontwarn com.badlogic.gdx.physics.box2d.utils.Box2DBuild -dontwarn com.badlogic.gdx.jnigen.BuildTarget* -keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* {(com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration); } -keepclassmembers class com.badlogic.gdx.physics.box2d.World { boolean contactFilter(long, long); void beginContact(long); void endContact(long); void preSolve(long, long); void postSolve(long, long); boolean reportFixture(long); float reportRayFixture(long, float, float, float, float, float); }
Proguard и рефлексия
Обратите внимание, что вам также необходимо будет добавить -keep для классов, которые вы используете через рефлексию! Более подробную информацию смотрите в документации ProGuard / DexGuard.
Чтобы использовать ProGuard/DexGuard в Android проекте вы можете воспользоваться следующим build.gradle файлом, который находится в android/ директории, но не корневой build.gradle файл.
android { buildToolsVersion "19.0.3" compileSdkVersion 19 signingConfigs { mySignature { storeFile file('/home/eric/.android/debug.keystore') storePassword 'android' keyAlias 'androiddebugkey' keyPassword 'android' } } defaultConfig { signingConfig signingConfigs.mySignature } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } instrumentTest.setRoot('tests') } buildTypes { release { minifyEnabled true proguardFile getDefaultProguardFile('proguard-android-optimize.txt') proguardFile 'proguard-project.txt' } } } // необходимо добавить общие JNI библиотеки в APK при компиляции CLI tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask -> pkgTask.jniFolders = new HashSet() pkgTask.jniFolders.add(new File(projectDir, 'libs')) } task copyAndroidNatives() { file("libs/armeabi/").mkdirs(); file("libs/armeabi-v7a/").mkdirs(); file("libs/x86/").mkdirs(); configurations.natives.files.each { jar -> def outputDir = null if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a") if(jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi") if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86") if(outputDir != null) { copy { from zipTree(jar) into outputDir include "*.so" } } } } task run(type: Exec) { def adb = "$System.env.ANDROID_HOME/platform-tools/adb" commandLine "$adb", 'shell', 'am', 'start', '-n', 'com.dozingcatsoftware.bouncy.android/com.dozingcatsoftware.bouncy.android.AndroidLauncher' } // настраивает проект Android Eclipse, используя старую сборку на основе Ant. eclipse { sourceSets { main { java.srcDirs "src", 'gen' } } jdt { sourceCompatibility = 1.6 targetCompatibility = 1.6 } classpath { plusConfigurations += project.configurations.compile containers 'com.android.ide.eclipse.adt.ANDROID_FRAMEWORK', 'com.android.ide.eclipse.adt.LIBRARIES' } project { name = appName + "-android" natures 'com.android.ide.eclipse.adt.AndroidNature' buildCommands.clear(); buildCommand "com.android.ide.eclipse.adt.ResourceManagerBuilder" buildCommand "com.android.ide.eclipse.adt.PreCompilerBuilder" buildCommand "org.eclipse.jdt.core.javabuilder" buildCommand "com.android.ide.eclipse.adt.ApkBuilder" } } // настраивает проект Android Idea, используя старую сборку на основе Ant. idea { module { sourceDirs += file("src"); scopes = [ COMPILE: [plus:[project.configurations.compile]]] iml { withXml { def node = it.asNode() def builder = NodeBuilder.newInstance(); builder.current = node; builder.component(name: "FacetManager") { facet(type: "android", name: "Android") { configuration { option(name: "UPDATE_PROPERTY_FILES", value:"true") } } } } } } }
Комментариев нет:
Отправить комментарий