5

Ho problemi con le annotazioni di supporto @StringDef. Funzionano perfettamente bene quando la libreria in cui si trovano è parte del progetto (non un file .aar), ma quando compilo la libreria come file .aar e cerco di usarli in un altro progetto, le annotazioni non vengono applicate.Annotazioni supporto Android @StringDef non funziona quando esportato in un file .aar

http://tools.android.com/tech-docs/support-annotations

Sotto la sezione "Utilizzo delle annotazioni nelle vostre librerie" si dice

Se annotare le proprie librerie con queste annotazioni, e utilizzare Gradle per costruire un artefatto AAR, al momento della compilazione il plug-in Android Gradle estrarrà le informazioni di annotazione e le invierà all'interno del tuo file AAR per l'utilizzo da parte dei clienti della tua libreria. Puoi dare un'occhiata al file annotations.zip all'interno dell'AAR dove vengono registrate le informazioni; questo sta usando il formato XML delle annotazioni esterne di IntelliJ. Questo è necessario perché i file .class non possono contenere abbastanza informazioni sulle annotazioni per gestire le informazioni di @IntDef sopra; si noti che è necessario registrare un riferimento alla costante stessa, non al suo valore. Il plug-in Android Gradle eseguirà l'attività di annotazione estratto come parte della build se (e solo se) il progetto dipende dalla libreria di supporto delle annotazioni. (Si noti che solo le annotazioni fonte di ritenzione sono collocati nel file .aar;. Le ritenzioni livello di classe sono tenuti in classes.jar)

ho aperto il file .aar e dentro c'è l'annotations.zip file, e se lo estraggo, c'è un file XML che ha tutte le annotazioni corrette.

sto usando il @Retention(RetentionPolicy.SOURCE) come si dice che ho bisogno di

L'applicazione che sto cercando di utilizzare questi in file come .aar ha una dipendenza la libreria di supporto compile 'com.android.support:support-annotations:23.1.1

Cosa am Mi manca per far funzionare questi lavori?

Modifica: ho ricontrollato che il progetto che utilizza questi file come .aar ha anche il processore di annotazioni attivato.

+0

Che cosa intendi con "le annotazioni non vengono applicate"? –

+1

Quando uso un metodo che ha un'annotazione su di esso, e non uso il valore annotato, dovrebbe contrassegnarlo in rosso e impedirmi di compilare. PER ESEMPIO. "Ciao" contro SomeClass.HELLO_CONSTANT.Funziona quando la libreria viene compilata direttamente nel progetto, ma non quando viene utilizzata come file .ar. – Ben987654

+2

Immagine di esempio di come dovrebbe apparire se è stato utilizzato il valore errato - https: // 0d9321c1-a-db1c6dfe-s-sites. googlegroups.com/a/android.com/tools/tech-docs/support-annotations/image06.png?attachauth=ANoY7cqTSb17QuPBLDWr4tzSd8PWqymMcqHTUdoW1VD-jKQ6m8DAG3jhcVWkDniYH72V9mV2ZNZUfnH2KXgUOZumtywXOq9v_BK42ub6taGLV2UZ4b4QhTN7pflf130U4DVEu-L5VSH7kUXtWb5RFRIBCT5vc9nmYNsbKWVB5tKqFqj7TiYIPvkyDWpLFmu1eUjFgkjVrt1grDcsR5RdXe4IeV9AMuVT9nFp6nxSaVDcQ0kWRy2fizQ%3D&attredirects=0 – Ben987654

risposta

1

Il problema era che le interfacce erano private.

Per qualche motivo un'interfaccia privata funziona correttamente quando un progetto di libreria viene compilato dal suo progetto host come sottomodulo.

Quando il progetto di libreria viene utilizzato come file .aar, l'interfaccia privata non funziona più.

+0

sto avendo lo stesso problema ... hai definito la tua 'public @interface YourTypeDef {}' in un file 'java' standalone? O hai creato una classe per incapsulare la tua implementazione typedef di annotazione? – Sakiboy

1

Come già detto here, le informazioni sulle costanti utilizzate come valori @ StringDef/@ IntDef andranno perse una volta compilate in un file aar. Ciò che rimane sono solo i valori delle costanti.

annotazioni @IntDef non possono essere ritenzione classe perché la cosa di cui hanno bisogno per registrare (cui le costanti sono valide) non può essere espresso nel file .class - gli unici dati memorizzati lì per un'annotazione è il valore della costante, non una sorta di puntatore alla costante stessa.