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:\諾基亞\Devices\諾基亞_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