1、 在Eclipse中的project编译执行后,在文件夹bin以下有生成一些文件,当中classes.dex是未经过混淆生成的。而我们要混淆的话,就要又一次生成一个混淆过的classes.dex。本文主要讲如何手动生成混淆proguard。
2、 生成一个混淆过的classes.dex:要先对文件夹bin以下的classes文件夹(在Eclipse中看不到,系统文件管理中可查看)的class文件打包成jar, 再对jar进行proguard混淆,混淆后再用android dx 命令生成混淆的classes.dex。
3、 class文件打包成jar:控制台CMD进入classes文件夹,调用jar cvfM classes.jar android cn com,当中classes.jar是你要生成的jar包名称,android cn com 是指classes以下的文件夹
4、 对jar进行proguard混淆,首先确定你的project已经有混淆文件proguard.cfg。在android sdk文件夹下找到:C:android-sdk-windows oolsproguardinproguardgui.bat。

在InputOutput选项中,选择你的Add input…文件,上面打好的classes.jar,Add output命名你的输出混淆jar包(classes_out.jar),在Library jars,wars,ears,zips and directories一栏中Add进你选择编译的android sdk版本号源包(C:android-sdk-windowsplatformsandroid-7android.jar),再加入你的project中libs引用的第三方jar。
点击“process”,再点击“save configuration”,在弹出的对话框中,输入要保存的配置文件名(这里我的是test.pro),最后点击“保存”。

用编辑器编辑刚才保存下来的“test.pro”,用记事本什么都能够。要里面有关的proguard信息替换成你project中定好的proguard.cfg内容,保存。
又一次打开progrard,运行 bin文件夹下的proguardgui.bat。
点击第一个选项“Proguard”,再点击“Load configuration”,选择我们刚才保存的“test.pro”进行载入。

開始混代码,点击右边“process”,再点击“process!”
在等待处理完毕后,输出的“classes_out.jar”,就是混过的jar包。
以上有关使用proguardgui.bat的參照自:http://java-server.iteye.com/blog/1166114
5、 对已经混淆的classes_out.jar包,放进project的bin文件夹下,生成classes.dex。
//android sdk文件夹下的platform-toolsdx.bat
事实上也能够直接用我之前公布的打包工具中的createUnsignedApk这种方法。
參看:http://blog.csdn.net/hytfly/article/details/24458133
这样生成classes.dex然后在签名打包的,就是混淆以后的代码了。
6.为了方便,事实上能够自己也写到那个打包工具中去打包。自己生成classes.jar和out.jar,然后再自己主动打包。分享两个方法:
/** * 在bin下生成纯净的classes.jar文件 */ public static void createJar(){ try{ System.out.println("create jar start"); Process process = null; String cmd; //相当于先cd到 -C的文件夹下,然后执行没有C的这部分语句,注意.代表当前文件夹 cmd = "cmd.exe /C jar cvf "+PROJECT_PATH+"bin\classes.jar " +"-C "+PROJECT_PATH+"bin\classes ."; System.out.println(cmd); process = Runtime .getRuntime() .exec(cmd); // 生成jar文件 new MyThread(process.getErrorStream()).start(); new MyThread(process.getInputStream()).start(); process.waitFor(); process.destroy(); System.out.println("create jar over"); // 一条渠道的打包完毕。文件会输出到指定文件夹 }catch(Exception e){ e.printStackTrace(); System.exit(0); } } /** * 在bin下生成混淆后的classes_out.jar文件(在PROGUARD_PATH配置文件里写) * 执行proguard程序假设报错,请在cmd查看错误,可能是路径问题,自己改动proguard.bat文件 */ public static void createProguardJar(){ try{ System.out.println("create ProguardJar start"); File file=new File(PROGUARD_PATH); if(!file.exists()) System.out.println("not found "+PROGUARD_PATH); file=new File(PROJECT_PATH+"bin\classes_out.jar "); if(file.exists()) file.delete(); Process process = null; String jarsigner; jarsigner = androidSDK_PATH+"tools\proguard\bin\proguard.bat " + "-include "+PROGUARD_PATH; System.out.println(jarsigner); process = Runtime .getRuntime() .exec(jarsigner); // 生成混淆后的jar文件 new MyThread(process.getErrorStream()).start(); new MyThread(process.getInputStream()).start(); process.waitFor(); process.destroy(); System.out.println("create ProguardJar over"); }catch(Exception e){ e.printStackTrace(); System.exit(0); } }
再分享一下proguard.pro配置文件的一些方法:http://blog.csdn.net/yunyu5120/article/details/13024359 这个老兄写的ok了。