2016-05-21 17 views
5

sto cercando di effettuare la sostituzione all'interno del file AndroidManifest.xml dall'estensione Android build.gradle ma sto ottenendo questo errore:Gradle "manifesta richiede una sostituzione segnaposto" errore, ma manifestPlaceholders fornisce un valore

AndroidManifest.xml:89:16 Error: 
    Attribute uses-library#com.company.platform.${encoding}@name at AndroidManifest.xml:89:16 requires a placeholder substitution but no value for <encoding> is provided. 
/Users/Company/Desktop/Checkout/android/Project/app/src/main/AndroidManifest.xml:0:0 Error: 
    Validation failed, exiting 
:app:processDebugManifest FAILED 

si tratta di un frammento del file manifesto:

... 
    </receiver> 
    <uses-library android:name="com.company.platform.${encoding}" /> 
</application> 
... 

E questa è una tagliò del build.gradle:

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.1" 
    defaultConfig { 
     applicationId "com.company.app" 
     minSdkVersion 23 
     targetSdkVersion 23 
     versionName cityVersion 
     setProperty("archivesBaseName", "City_$versionName") 
     manifestPlaceholders = [encoding: "some value"] 
     manifestPlaceholders = [version: cityVersion] 
    } 

Ho anche provato ad aggiungere i manifestPlaceholders nelle buildTypes cioè

buildTypes { 
    release { 
     minifyEnabled true 
     shrinkResources true 
     manifestPlaceholders = [encoding: deviceEncoding] 
     manifestPlaceholders = [version: cityIDVersion] 
    } 
    debug { 
     manifestPlaceholders = [encoding: deviceEncoding] 
     manifestPlaceholders = [version: cityIDVersion] 
    } 

}

Ma ho ancora ottenere lo stesso errore.

Perché è presente un errore in merito alla sostituzione di un segnaposto quando ne è previsto uno in manifestPlaceholders?

risposta

18

È necessario aggiungere solo per l'array. Lo stai sostituendo. Fare questo:

manifestPlaceholders = [encoding: "some value", version: cityVersion] 

Dichiarando manifestPlaceholders due volte per lo stesso sapore/tipo di costruzione, il vostro stanno sostituendo quello precedente. Dopo che il precedente è stato sostituito, la tua build è fallita perché la proprietà non esiste più.

+0

Grazie mille! –

+0

risposta giusta per me – floatingmuseum

1

È necessario aggiungere il segnaposto applicationId al gradle dell'applicazione. Questo avviene con l'integrazione di Firebase, dopo l'aggiornamento a 2.2.0 Gradle-alfa1

android { 
    ... 
    defaultConfig { 
     applicationId "com.example.my.app" 
     ... 
    } 
} 

See: Unable to get provider com.google.firebase.provider.FirebaseInitProvider

+0

La sua già lì. – Gruntcakes

+0

Ah, davvero, scusate ... Mi sono fissata cieca a questo problema.Non ce l'ho, il che ha risolto il messaggio di errore, ma non riesco ancora a ottenere alcun APK da Android Studio ... solo, ora anche senza errori/avvisi –

0

avevo lasciato il $ {} simboli in tutto il mio valore:

<meta-data android:name="net.example" android:value="${XXXX}" /> 
+0

Cosa stai cercando di dire? Non capisco ... – Sakiboy

+0

Ho aggiunto il valore senza avvolgerlo con $ {...} –

0

Per quelli di voi incorrere in fusione/problemi di iniezione manifestano evidenti a causa di manifestPlaceholders definito nelle librerie manifesto, la questione è in arrivo dal Infatti, è necessario definire un valore per manifestPlaceholders nel manifest delle tue librerie. Questo valore non viene sovrascritto quando si inserisce il valore reale nell'applicazione che consuma. Per ovviare a questo, è necessario definire solo i valori manifestPlaceholders per i build debug nella libreria.

Come così:

android.buildTypes.debug.manifestPlaceholders = [ 
    authScheme: 'clientAppReplaces', authHost: 'clientAppReplaces' 
] 

In questo modo si sarà in grado di costruire la vostra libreria. Mentre lascia che l'applicazione client fornisca i valori corretti per manifestPlaceholders. Permettendo alla tua biblioteca di fare tutto ciò che dovrebbe essere pesante. Questo è possibile perché le librerie vengono create come build di rilascio (se non diversamente definito).

applicazione client build.gradle esempio:

defaultConfig { 
    applicationId "com.app.manifestPlaceholders" 
    minSdkVersion 16 
    targetSdkVersion 27 
    versionCode project.ext.versionCode 
    versionName project.ext.versionName 

    manifestPlaceholders = [authScheme: 'customSchemeValue', authHost: 'hostValue'] 
}