Navigace

Hlavnφ menu

 

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:

<!-- Define external Antenna tasks -->
<taskdef name="wtkobfuscate"
         classname="de.pleumann.antenna.WtkObfuscate"/>

PotΘ rozÜφ°φme tßsk Clear o mazßnφ adresß°e obfuskovan²ch t°φd:

<!-- Clear project directories -->
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:

<!-- Run obfuscation task -->
<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.

<!-- Run without obfuscation task -->
<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∞:

<!-- Make JAR package and JAD descriptor -->
<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:

<!-- Define external Antenna tasks -->
<taskdef name="wtkpreprocess"
         classname="de.pleumann.antenna.WtkPreprocess"/>

Teprve po v²Üe uveden²ch ·pravßch nadefinujeme nov² tßsk preprocess:

<target name="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

Prochßzka, Ji°φ (4. 3. 2004)

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!