/2012/07/07/How-to-obfuscate-and-package-a-libgdx-app-for-distribution/
{"item":{"status":"visible","url":"\/2012\/07\/07\/How-to-obfuscate-and-package-a-libgdx-app-for-distribution\/","trash":"","name":"How-to-obfuscate-and-package-a-libgdx-app-for-distribution","parent":"","title":"How to obfuscate and package a libgdx app for distribution","date":"2012-07-07 22:05:59","filepath":"posts\/20120707_How-to-obfuscate-and-package-a-libgdx-app-for-distribution.xml.json","type":"post","content":"<p><strong><img style=\"float: left; margin-left: 10px; margin-right: 10px;\" src=\"http:\/\/www.8bitrobot.com\/media\/uploads\/2012\/01\/gear.png\" alt=\"\" width=\"60\" height=\"64\" \/>First off:<\/strong> This is an <a href=\"http:\/\/www.8bitrobot.com\/tag\/impatient%20guide\/\">Impatient Guide<\/a> and it will be short on explanation and possibly accuracy<\/p>\n<p><strong>Second off:<\/strong> This method is a first attempt and is probably fraught with errors and inefficiencies, but it worked for me.<\/p>\n<p><em>Let's get started!<\/em><\/p>\n<p>Say you have a <a href=\"http:\/\/libgdx.badlogicgames.com\/\">LibGDX<\/a> project and you want to package it up for redistribution, but you don't want to give out a jar and would like it to be wrapped in a nice executable (.exe) just like any ordinary Windows binary. In addition, obfuscating the code to make reverse engineering more difficult might be something you want too.<\/p>\n<p>Here's how I did it manually with <a href=\"http:\/\/www.eclipse.org\/\">Eclipse<\/a>, <a href=\"http:\/\/proguard.sourceforge.net\/\">ProGuard<\/a>, <a href=\"http:\/\/launch4j.sourceforge.net\/\">Launch4j<\/a>, and <a href=\"http:\/\/www.7-zip.org\/\">7-zip<\/a>.<\/p>\n<h2>Creating the JAR files:<\/h2>\n<ol>\n<li>Export a jar file with the <a href=\"http:\/\/www.eclipse.org\/\">Eclipse<\/a> Export Wizard. I did this for my desktop version, by right clicking on the project \"myapp-desktop\" -> Export -> Java -> Runnable Jar File.<\/li>\n<li>Plug in the usual stuff into the wizard, but choose \"Copy required libraries into a sub-folder next to the generated JAR.\" Otherwise, ProGuard will make your life a nightmare when you try to obfuscate (e.g. \"Warning: org.lwjgl.input.Controllers: can't find referenced class net.java.games.input.ControllerEnvironment\").<\/li>\n<li>Hit \"finish\" and the wizard will generate your shiny new .jar file.<\/li>\n<li>Do 1 through 3 again, but in step 2 choose \"Package required libraries into generated JAR.\" The jarinjarloader files and the MANIFEST.MF from this second generated JAR will be used later on.<\/li>\n<\/ol>\n<h2>Obfuscate your jar with ProGuard:<\/h2>\n<ol>\n<li>Run the GUI version of <a href=\"http:\/\/proguard.sourceforge.net\/\">ProGuard<\/a>: <em>java -jar proguardgui.jar<\/em><\/li>\n<li>In the Input\/Output tab, click \"Add input...\" and enter the first generated JAR path.<\/li>\n<li>Click \"Add output...\" and enter your output JAR... say (e.g. <em>output.jar<\/em>).<\/li>\n<li>Click \"Add...\" in the Add libraries section and add the library export directory generated with the first JAR. If your export JAR name was <em>foo.jar<\/em>, the export dependencies should be in <em>foo_lib.<\/em><\/li>\n<li>In the Obfuscation tab uncheck \"<em>Use mixed-case class names.<\/em>\"<\/li>\n<li>Keep the default settings for now (you can tweak them later once you have this working).<\/li>\n<li>Start processing the JAR. In the <em>Process<\/em> tab click <em>Process!<\/em><\/li>\n<li>If ProGuard finishes it will produce a nice obfuscated\/shrunk JAR, <em>output.jar<\/em>.<\/li>\n<\/ol>\n<h2>Combine library dependencies into obfuscated JAR<\/h2>\n<ol>\n<li>The <em>output.jar<\/em> is not runnable as is. It needs to know how to find the library dependencies. You can pack the dependencies into the JAR with <a href=\"http:\/\/www.7-zip.org\/\">7-zip<\/a>. So, open <em>output.jar<\/em> in 7-zip.<\/li>\n<li>Add\/drag the contents of <em>foo_lib<\/em> (from step 2 in the first section) into the root level of the JAR (e.g. they should be in the same directory <em>META-INF<\/em> is in).<\/li>\n<li>Extract the other JAR from the first section (see step 4) into a temp directory (e.g. <em>temp<\/em>).<\/li>\n<li>In <em>output.jar<\/em>, clobber the file \"<em>META-INF\/MANIFEST.MF\" <\/em>with the file from <em>\"temp\/META-INF\/MANIFEST.MF\"<\/em>.<\/li>\n<li>In <em>output.jar<\/em>, add the directory <em>\"org\/eclipse\"<\/em> from <em>\"temp\/org\/eclipse\"<\/em>.<\/li>\n<li>Confirm the JAR is runnable: <em>java -jar output.jar<\/em><\/li>\n<\/ol>\n<h2>Wrap your JAR in a Windows executable<\/h2>\n<ol>\n<li>Use <a href=\"http:\/\/launch4j.sourceforge.net\/\">Launch4j<\/a> to wrap your JAR. Open the Launch4j GUI.<\/li>\n<li>Add your output file: <em>out.exe<\/em><\/li>\n<li>Add your input JAR file: <em>output.jar<\/em><\/li>\n<li>In the <em>JRE<\/em> tab, set the <em>Min JRE version<\/em> (e.g. 1.6.0)<\/li>\n<li>Click the gear icon to build the wrapper.<\/li>\n<li>Confirm the binary works. <strong><em>High Fives all Around!<\/em><\/strong><\/li>\n<\/ol>\n<div> <\/div>"}}