2012-03-01 9 views
10

Ho bisogno di creare il vaso minimo della libreria utils da utilizzare in Android. Sto usando alcuni metodi dalle librerie di Apache Commons (come IOUtils, StringUtils). Tuttavia, ogni utilizzo mi consente di importare l'intera libreria (commons-lang, commons-io ecc.) Che è assolutamente accettabile in Tomcat (le dimensioni di mamoot sono uguali a war), ma assolutamente inaccettabili per il progetto Android.Genera jar minimizzato con solo classi utilizzate

Quindi, il mio obiettivo è quello di riunire tutte le classi utilizzate dalle dipendenze in un unico contenitore, ma solo le classi necessarie. Ricordo che una volta ero in contatto con il plugin di Maven che svolgeva quel compito, sfortunatamente non riesco a ricordare il suo nome né a trovarlo tramite Google.

Quindi, per favore, conosci il plug-in maven che eseguirà tale riduzione delle dipendenze o qualsiasi strumento autonomo che farà lo stesso?

risposta

0

Scusa, forse non ho capito chiaramente la domanda. Lo strumento Obfuscator (ad esempio ProGuard) potrebbe farlo, non è vero? Contiene diversi JAR in uno e taglia le classi inutilizzate. Se non hai bisogno di offuscamento/ottimizzazione (per evitare effetti collaterali indesiderati), puoi disabilitarli, lasciando abilitata la fase "shrink".

+0

Ho scoperto che ProGuard è già integrato in Android SKD, quindi cercherò sicuramente se soddisfi i miei requisiti. –

+0

Come so che una tale confezione rompe i JAR delle librerie firmate. Potrebbe essere uno svantaggio serio. – Mersenne

-3

Immagino che se usi Eclipse in JAR il progetto ti dà alcune opzioni per farlo mentre JARing :) Forse sarà utile.

Inoltre è possibile raccogliere le classi di libreria utilizzate in una libreria personalizzata e includere questa libreria creata dall'utente nel progetto.

+0

Questo è quello che mi serve per lo strumento. So che potrei farlo manualmente. –

0

In generale non è possibile selezionare automaticamente tutte le classi utilizzate da un'applicazione. Basti pensare a cosa possiamo fare con Class.forName(String name) o se usiamo un contenitore di dipendenze per l'iniezione e dichiariamo tipi in file di configurazione esterni.

+0

Ne sono consapevole, ma è solo quando si usa il riflesso. AFAIR questo strumento funzionava quando non era presente alcuna riflessione, ma non posso dire per certo che l'ho visto o era solo un sogno;) –

+0

Non solo quando si usa il reflection - si potrebbe caricare una classe da un URL e quella la classe potrebbe dipendere dalle classi sul classpath. Crollerebbe anche lui. –

+0

è ancora molto utile anche con un po 'di caricamento del codice in un modo che il compilatore non vede. Coloro che desiderano creare un vaso minimo possono inserire nella whitelist classi che non verrebbero trovate automaticamente. –

5

Il plug-in maven che non si ricorda è probabilmente Apache Maven Shade Plugin, c'è l'opzione minimizeJar. Come ha notato Andreas_D, questo non includerà le classi, caricate con Class.forName, quindi sarà necessario il numero implicity say in configuration, che è necessario. Ecco come ho fatto Maven a includere il driver jdbc nel mio singolo jar:

<filter> 
    <artifact>net.sourceforge.jtds:jtds</artifact> 
    <includes> 
     <include>**</include> 
    </includes> 
</filter>