
Per utilizzare funzionalità presenti in Apache Commons Code in versioni uguali o superiori alla 1.4, come ad esempio quella del metodo encodeBase64String presente in Base64 non è sufficiente aggiornare il framework all'interno dell’applicazione perché la stessa utilizzerà a runtime le classi della versione precedentemente caricata, a parità di nome.
Pertanto l’utilizzo del seguente comando per ottenere una stringa codificata in Base64 non produrrà alcun errore in fase di compilazione ma genererà a runtime un’eccezione:String hash = org.apache.commons.codec.binary.Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
L'errore che ne risulta è:
No static method encodeBase64String([B)Ljava/lang/String; in class Lorg/apache/commons/codec/binary/Base64; or its super classes (declaration of 'org.apache.commons.codec.binary.Base64' appears in /system/framework/ext.jar
Per evitare questo tipo di conflitti è necessario modificare il namespace delle classi, nel caso specifico il package di Commons Codec.
La soluzione è quella di rinominare il package ad esempio da org.apache.commons.codec in android.org.apache.commons.codec e per farlo è necessario o effettuare la modifica manualmente sul codice sorgente di commons-codec e ricompilare il file in jar oppure seguire la procedura descritta di seguito:
Scaricare i Commons Codec più recenti dal sito ufficiale di Apache, nel caso specifico “commons-codec-1.10-bin.zip” ed estrarne il contenuto.
Il file che ci interessa all’interno dell’archivio è commons-codec-1.10.jar
Scaricare il file jarjar-1.4.jar (o la versione più recente) da https://code.google.com/p/jarjar/downloads/list che servirà per apportare modifiche ad un file jar già compilato, come nel nostro caso.
Creare un file e chiamarlo commons-codec.rules (per crearlo, con il Mac, ho utilizzato il terminale ed i comandi “sudo nano [nome_file]” ed utilizzato i comandi suggeriti dal terminale; da Windows basta un semplice file creato con Notepad opportunamente rinominato) contenente una sola riga:rule org.apache.** android.org.apache.@1
Questa sarà la regola che jarjar seguirà per rinominare il package della libreria di nostro interesse.
Da terminale, facendo attenzione a rispettare i path nei quali si trovano i singoli file interessati dal comando, lanciare:java -jar jarjar-1.4.jar process commons-codec.rules commons-codec-1.10/commons-codec-1.10.jar commons-codec-1.10/commons-codec-1.10-rep.jar
Verrà creato un nuovo file, commons-codec-1.10-rep.jar, che andrà inserito nella cartella libs del progetto e aggiunto come libreria.
Dopodichè la chiamata dovrà essere rinominata come di seguito:String hash = android.org.apache.commons.codec.binary.Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
E dopo un rebuilt e avvio dell’app il problema non si presenterà più in quanto la chiamata al metodo avrà un nuovo puntatore definito e univoco.
Nessuno ha ancora commentato questo articolo, fallo tu per primo!
Scrivi un Commento