超强混淆器ProGuard之终极心决

王朝厨房·作者佚名  2007-01-04
窄屏简体版  字體:   |    |    |  超大  

ProGuard是一个非常酷的混淆器和收缩器(shrinker, 大家有更好听的翻译方法一定告诉我)。它的特点是除了可以混淆保护你的代码,还可以自动检测和删除没有用到的类、方法和数据成员,还可以去掉包的层次关系,最大限度的缩小你的jar包。

使用ProGuard的另外一个显著意义就是,因为它可以自动删除不用的部分,你大可以放心的使用模块级重用,而不是通常j2me程序员所采用的代码级重用,大大提高开发效率。因此郑重的向所有j2me开发者推荐ProGuard。

但是一个问题是ProGuard还不能集成到JB和WTK等开发环境(不过WTK2.0自带),而要自己写命令行来使用,我想这个是制约大家使用ProGuard的最大障碍。

因此我最近研究了一下,写了个自动化程度很高的脚本,提供给大家使用。

这个脚本自动替你做所有的事情:编译、预打包、混淆、预审核、打包、创建jad文件等。而且在中间任何一步出错可以自动停止。我都是先用JB开发,最后发布前用这个脚本处理一下即可。

对每个新的工程,需要修改的部分全部集中在一开头的变量设置部分,7个变量分别是:程序名(将用做jar和jad的名字)、主类名(MIDlet子类)、图标文件名、编译列表(请按依赖关系顺序书写)、java库路径、proguard的路径、作者信息。其中图标如果不需要可以省略或置空(set ICON_NAME= ),而PROGARD_HOME和APP_VENDOR一般也是不需要重复修改的。

要求所有的资源文件都放在src的res目录下,这是我的个人习惯,大家可以按照自己的习惯更改脚本。

===========================================================================

@echo off

rem ############################################################################

rem ## Script for compiling, obfuscating, preverifying & packaging ##

rem ############################################################################

setlocal

rem ############################################################################

rem ## Set up varialbles ##

rem ############################################################################

set APP_NAME=MyGame

set MIDLET_CLASS=MyGameMID

set ICON_NAME=icon.png

set COMPILE_LIST=src/com/joyamigo/gamefast/*.java src/com/joyamigo/util/*.java src/com/joyamigo/gameui/*.java src/*.java

set LIB_PATH=C:\Nokia\Devices\Nokia_Series_60_MIDP_Concept_SDK_Beta_0_2\lib\classes.zip

set PROGUARD_HOME=C:\JBuilder7\proguard1.6.2

set APP_VENDOR=CNJM

echo Start building %APP_NAME%

echo.

rem pause

rem ############################################################################

rem ## Compiling ##

rem ############################################################################

set STEP=Compiling

echo %STEP%...

if exist tmp1 rd /s/q tmp1

md tmp1

javac -d tmp1 -bootclasspath "%LIB_PATH%" -classpath tmp1 %COMPILE_LIST%

if ERRORLEVEL 1 goto ERROR

xcopy /i/e src\res tmp1\res > nul

rem pause

rem ############################################################################

rem ## Pre-packaging ##

rem ############################################################################

set STEP=Pre-packaging

echo %STEP%...

rem create manifest file

echo Manifest-Version: 1.0> manifest.mf

echo MIDlet-Name: %APP_NAME%>> manifest.mf

echo MIDlet-1: %APP_NAME%, , %MIDLET_CLASS%>> manifest.mf

if not ’’%ICON_NAME%’’==’’’’ echo MIDlet-Icon: /res/%ICON_NAME%>> manifest.mf

echo MIDlet-Version: 1.0>> manifest.mf

echo MIDlet-Vendor: %APP_VENDOR%>> manifest.mf

echo MicroEdition-Configuration: CLDC-1.0>> manifest.mf

echo MicroEdition-Profile: MIDP-1.0>> manifest.mf

jar cfm tmp1.jar manifest.mf -C tmp1 .

if ERRORLEVEL 1 goto ERROR

del manifest.mf

rd /s/q tmp1

rem pause

rem ############################################################################

rem ## Obfuscating ##

rem ############################################################################

set STEP=Obfuscating

echo %STEP%...

rem create proguard obfuscating script

echo -libraryjars %LIB_PATH%> myconfig.pro

echo -injars tmp1.jar>> myconfig.pro

echo -outjar tmp1\tmp1.jar>> myconfig.pro

echo -overloadaggressively>> myconfig.pro

echo -dontusemixedcaseclassnames>> myconfig.pro

echo -defaultpackage ’’’’>> myconfig.pro

echo -printseeds>> myconfig.pro

echo -keep public class * extends javax.microedition.midlet.MIDlet>> myconfig.pro

md tmp1

java -jar "%PROGUARD_HOME%lib\proguard.jar" @myconfig.pro > nul

if ERRORLEVEL 1 goto ERROR

del tmp1.jar

del myconfig.pro

rem pause

rem ############################################################################

rem ## Preverifying ##

rem ############################################################################

set STEP=Preverifying

echo %STEP%...

cd tmp1

jar xf tmp1.jar

del tmp1.jar

preverify -classpath "%LIB_PATH%" -d . .

if ERRORLEVEL 1 goto ERROR

rem pause

rem ############################################################################

rem ## Packaging ##

rem ############################################################################

set STEP=Packaging

echo %STEP%...

if exist ..\%APP_NAME%.jar del ..\%APP_NAME%.jar

jar cfm ..\%APP_NAME%.jar meta-inf\manifest.mf .

if ERRORLEVEL 1 goto ERROR

cd ..

rd /s/q tmp1

rem pause

rem ############################################################################

rem ## Creating descriptor ##

rem ############################################################################

set STEP=Creating descriptor

echo %STEP%...

rem create temporary batch to create jad file

echo echo MIDlet-1: %%~n1, , %%2^> %%~n1.jad> tmp1.bat

if not ’’%ICON_NAME%’’==’’’’ echo echo MIDlet-Icon: /res/%ICON_NAME%^>^> %%~n1.jad>> tmp1.bat

echo echo MIDlet-Jar-Size: %%~z1^>^> %%~n1.jad>> tmp1.bat

echo echo MIDlet-Jar-URL: %%1^>^> %%~n1.jad>> tmp1.bat

echo echo MIDlet-Name: %%~n1^>^> %%~n1.jad>> tmp1.bat

echo echo MIDlet-Vendor: %%3^>^> %%~n1.jad>> tmp1.bat

echo echo MIDlet-Version: 1.0^>^> %%~n1.jad>> tmp1.bat

call tmp1.bat %APP_NAME%.jar %MIDLET_CLASS% %APP_VENDOR%

del tmp1.bat

echo.

echo %APP_NAME%.jar and %APP_NAME%.jad created, building completed.

goto EXIT

:ERROR

echo.

echo Error occurred while %STEP%, building stopped.

:EXIT

endlocal

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航