J2ME pro pokroΦilΘ - znovu J2ME a Ant
Tento Φlßnek se bude op∞t zab²vat vyu₧itφm Apache Ant p°i v²voji MIDp aplikacφ pro mobilnφ za°φzenφ. Navß₧eme na p°edeÜl² Φlßnek a rozÜφ°φme stßvajφcφ build skript o dalÜφ podp∙rnΘ tßsky, kterΘ nßm usnadnφ p°eklad aplikace, a rozÜφ°φme n∞kter² z ji₧ vytvo°en²ch tßsk∙ o dalÜφ vlastnosti.
NovΘ vlastnosti build skriptu
Pokud neznßte Apache Ant, p°eΦt∞te si nejprve Φlßnek J2ME a Ant. My ostatnφ se rovnou vrhneme na novΘ vlastnosti, kterΘ do naÜeho build skriptu zahrneme.
Prvnφ, co by se nßm mohlo hodit, je tßsk, kter² by obfuskoval p°elo₧en² k≤d. TakzvanΘ obfuskovßnφ k≤du zt∞₧uje jeho Φitelnost po dekompilaci a ΦßsteΦn∞ i k≤d optimalizuje. Pokud vßs zajφmajφ bli₧Üφ podrobnosti, naleznete je v Φlßnku Dekompilace v Jav∞ a co proti nφ. DalÜφ z vlastnostφ, o kterou rozÜφ°φme build skript, je Φφslovßnφ verzφ p°ekladu. ╚φslovßnφ verzφ se hodφ p°i testovßnφ aplikacφ, kdy mßm pomßhß udr₧et si p°ehled o tom, co se kde zm∞nilo a opravilo. A do t°etice rozÜφ°φme build skript o jednoduch² preprocesor, kter² je souΦßstφ pou₧itΘ knihovny Antenna. Pokud jste ji₧ programovali v C/C++, vφte, oΦ se jednß, pro ty ostatnφ dodßvßm, ₧e preprocesor zpracovßvß zdrojov² k≤d p°ed jeho vlastnφm p°ekladem. (Preprocesor implementovan² v Antenn∞ je zjednoduÜenou verzφ preprocesoru jazyka C/C++).
Implementace nov²ch vlastnostφ
Obfuskovßnφ k≤du
K obfuskovßnφ vyu₧ijeme tßsk knihovny Antenna nazvan² obfuscate, jemu₧ p°edßme jako parametr soubor t°φd, kterΘ chceme obfuskovat. Knihovna Antenna umφ pracovat s obfuskßtory RetroGuard a ProGuard. Umφst∞te je do adresß°e ${wtk.home}\bin (pop°φpad∞ mohou b²t zp°φstupn∞ny p°es prom∞nnou CLASSPATH). Nejprve si tedy zaregistrujeme tßsk pro obfuskaci:
<taskdef name="wtkobfuscate"
classname="de.pleumann.antenna.WtkObfuscate"/>
PotΘ rozÜφ°φme tßsk Clear o mazßnφ adresß°e obfuskovan²ch t°φd:
target name="clear">
<delete failonerror="false" dir="classes"/>
<delete failonerror="false" dir="preverified"/>
<delete failonerror="false" dir="build"/>
<delete failonerror="false" dir="obfuscated"/>
</target>
Nynφ nadefinujeme vlastnφ tßsk:
<target name="obfuscate" depends="compile">
<delete failonerror="false" dir="obfuscated"/>
<mkdir dir="tmp"/>
<jar jarfile="tmp\file.jar" basedir="classes" />
<wtkobfuscate jarfile="tmp\file.jar" />
<Preserve class="${main.class}"/>
</wtkobfuscate>
<unjar jarfile="tmp\file.jar" dest="obfuscated" />
<delete dir="tmp"/>
</target>
Poslednφm krokem je ·prava tßsku preverify, kde p°epφÜeme parametr "depends" z volßnφ tßsku compile na obfuscate. Abychom mohli obfuskaci jednoduÜe vypnout, nadefinujeme si jeÜt∞ jeden tßsk, kter² pouze p°ekopφruje soubory z adresß°e "classes" do adresß°e "obfuscated", odkud si je bere preverifikßtor. Parametr "depends" pak bude mφt hodnotu obfuscate_null.
<target name="obfuscate_null" depends="compile">
<delete failonerror="false" dir="obfuscated"/>
<copy todir="obfuscated" />
<fileset dir="classes" />
</copy>
</target>
Oba tßsky se v souboru build.xml nachßzejφ p°ed definicφ tßsku preverify.
╚φslovßnφ verzφ
Pro automatickΘ Φφslovßnφ verzφ upravφme tßsk build tφm, ₧e u volßnφ "wtkjad" odstranφme atribut version a p°idßme atribut update = "true". Touto ·pravou zajistφme, ₧e p°i ka₧dΘm buildu nebude vytvß°en nov² JAD soubor, ale pouze updatovßn ten p∙vodnφ. Verze MIDletu je ve formßtu major.miror.micro, kde micro je s ka₧d²m buildem inkrementovßno o 1. DalÜφ nezbytnou ·pravou je p°idßnφ atributu autoversion="true". V²sledn² tßsk bude vypadat nßsledovn∞:
<target name="build" depends="preverify" >
<mkdir dir="build"/>
<wtkjad jadfile="build\${project.name}.jad"
jarfile="build\${project.name}.jar"
name="${project.name}"
vendor="Tester"
update="true">
autoversion="true">
<midlet name="${project.name}" class="${main.class}"/>
</wtkjad>
<wtkpackage jarfile="build\hello.jar"
jadfile="build\hello.jad">
<fileset dir="preverified"/>
<fileset dir="res"/>
</wtkpackage>
</target>
Preprocesor
Pro zp°φstupn∞nφ funkce preprocesoru z Antenna knihovny musφme nejd°φve zadefinovat nov² tßsk wtkpreprocessor:
<taskdef name="wtkpreprocess"
classname="de.pleumann.antenna.WtkPreprocess"/>
Teprve po v²Üe uveden²ch ·pravßch nadefinujeme nov² tßsk preprocess:
<delete failonerror="false" dir="src_nokia"/>
<mkdir dir="src_nokia"/>
<wtkpreprocess srcdir="src"
destdir="src_nokia"
symbols="NOKIA"
verbose="true"
ident="true" />
<delete failonerror="false" dir="src_siemens"/>
<mkdir dir="src_siemens"/>
<wtkpreprocess srcdir="src"
destdir="src_siemens"
symbols="SIEMENS"
verbose="true"
ident="true" />
</target>
Nynφ u₧ m∙₧eme v k≤du pou₧φvat pot°ebnΘ direktivy. Aby nedochßzelo k chyb∞ p°i p°ekladu, jsou tyto direktivy brßny jako komentß°e, proto jsou p°ed ka₧dou z nich znaky //.
- #define <identifier>
- #undefine <identifier>
- #ifdef <identifier>
- #ifndef <identifier>
- #else
- #endif
- #elifdef <identifier>
- #elifndef <identifier>
- #if <expression>
- #elif <expression>
- #include <filename>
- #endiclude
Spustφme-li tßsk preprocess, dojde k vyhodnocenφ jednotliv²ch v²raz∙ v k≤du a tyto k≤dy jsou v naÜem p°φpad∞ ulo₧eny do adresß°e "src_nokia", respektive "src_siemens". Adresß° takto zφskan²ch zdrojov²ch k≤d∙ m∙₧eme p°edat jako parametr build skriptu a ten vytvo°φ v²sledn² JAD a JAR.
Shrnutφ
Jak vidφte, mo₧nosti Antu jsou tΘm∞° neomezenΘ. Build skript je sice po proveden²ch ·pravßch o n∞co slo₧it∞jÜφ, ale p°ekompilovßnφ aplikace je pro nßs u₧ jen pouhΘ spuÜt∞nφ p°φsluÜnΘho tßsku.
Odkazy, zdroje
- http://ant.apache.org - informace o projektu Apache Ant
- http://sourceforge.net/projects/antenna/ - sta₧enφ knihovny Antenna
J2ME pro pokroΦilΘ
Pokud to myslφte s Java 2 MicroEdition opravdu vß₧n∞, jist∞ ocenφte tento p°ehled ne zcela obligßtnφch programovacφch technik a postup∙. ╚lßnky na sebe sice p°φmo nenavazujφ, zato zvolenΘ tΘma zkoumajφ opravdu do hloubky. Tato sΘrie Φlßnk∙ dosud nebyla ukonΦena!
- J2ME pro pokroΦilΘ - znovu J2ME a Ant (prßv∞ Φtete)
- J2ME pro pokroΦilΘ - XML
- J2ME pro pokroΦilΘ - J2ME a Ant
- J2ME pro pokroΦilΘ - logovßnφ
- J2ME pro pokroΦilΘ - optimalizace zdrojovΘho k≤du