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

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět