2015-08-13 8 views
7

Voglio modificare qualcosa nel file jar del plug-in Barcode Scanner per cordova, ovvero lo RESULT_DISPLAY_DURATION_MS nello CaptureActivity class.Modifica classe in jar: build android non riuscita

L'ho decompresso usando il terminale (sono su un mac).

Quindi, utilizzando ClassEditor, ho cercato la classe CaptureActivity e ho modificato il valore. Successivamente, l'ho ri-archiviato usando jar cfv samenameasoriginal.jar *. Quindi, ho sostituito il file jar originale per quello nuovo.

Il problema è che quando provo a costruire utilizzando ionica, ho una lunga lista di errori, contenente:

IMPREVISTO TOP-LEVEL ECCEZIONE: com.android.dx.cf.iface. ParseException: lunghezza attributo errata; atteso lunghezza 00000002 ... ... durante l'analisi com/google/ZXing/client/android/CaptureActivity.class

ho notato che il nuovo file jar è di 7 kb più grande di quella originale , anche se ho solo cambiato il numero da 1500 a 9500, quindi è un po 'strano.

Chiunque può aiutarmi? Sembrava online, ma trovato nulla ...

+0

Perché vuoi farlo? –

+0

Quando lo scanner di codici a barre esegue la scansione di un codice, mostra un messaggio come "URL trovato" o "testo trovato" per un po 'meno di 2 secondi. Voglio eliminare questo ritardo perché nella mia app è fondamentale che la scansione sia veloce. Per prima cosa ho provato a cambiare i file .java del plugin, ma questo non mi ha aiutato molto: http://stackoverflow.com/questions/31965298/ionic-cordova-plugin-not-upating – binoculars

+0

Perché non estendi le classi che stai usando e cambia il loro codice? il comportamento? Perché hackerare il barattolo quando puoi usare OOP? –

risposta

1

estendono dalla classe e di regolare il valore:

public class CustomCaptureActivity extends CaptureActivity { 

    RESULT_DISPLAY_DURATION_MS = 9500; // wheras 9500 is your custom value 
} 

Invece di chiamare CaptureActivity ora utente classe personalizzata.

Se RESULT_DISPLAY_DURATION_MS è di sola lettura: Copia & incollare i metodi utilizzando questa variabile alla classe personalizzata e sostituire la variabile con una nuova costante definita nella propria classe. Finché CaptureActivity non è final questo spero fa il trucco per voi.

0

La risposta corretta è che alcuni dei file jar non vengono compilati. Dovresti andare nel tuo percorso di build (imposta tutto il percorso dipendente) nel tuo progetto, e cercare nelle tue dipendenze.

Se stai solo importando alcuni file jar, puoi provare a rimuoverli e aggiungerli uno alla volta. Questo ti aiuterà a determinare quale di essi causa l'errore.

Nel mio caso, ho fatto proprio questo, e quando stavo importando l'ultimo, l'app compilata. Quindi penso che il vero problema era che stavo importando troppi in una volta. Ma ora tutto funziona.

1

Penso che il problema sia perché quando si crea il JAR, ci sono alcuni link che possono riguardare la vecchia versione del file (a causa di ragioni di optiomination) e tutto si blocca.

Non sicuro, ma penso che sia la ragione.

Quindi, invece di modificare il file, è possibile utilizzare o un Decorator Design Patter (migliore idea, se possibile) sottoclasse la classe che è necessario modificare con le modifiche (https://en.wikipedia.org/wiki/Decorator_pattern) o è possibile utilizzare la riflessione per modificare direttamente il biblioteca.

Ecco un esempio di come modificare un campo finale privato.Puoi fare qualcosa di simile:

import java.lang.reflect.*; 

public class EverythingIsTrue { 
    static void setFinalStatic(Field field, Object newValue) throws Exception { 
     field.setAccessible(true); 

     Field modifiersField = Field.class.getDeclaredField("modifiers"); 
     modifiersField.setAccessible(true); 
     modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 

     field.set(null, newValue); 
    } 

    public static void main(String args[]) throws Exception {  
     setFinalStatic(Boolean.class.getField("FALSE"), true); 

     System.out.format("Everything is %s", false); // "Everything is true" 
    } 
}