2017-07-18 1 views
8

J'essaie d'utiliser un espace réservé manifeste pour supprimer un noeud uses-permission dans le AndroidManifest.xml pour des versions de version sans succès.Impossible d'utiliser des espaces réservés manifestes pour supprimer une autorisation

build.gradle

buildTypes { 
    release { 
     manifestPlaceholders.excludeDebugPermissions = "remove" 
    } 
    debug { 
     manifestPlaceholders.excludeDebugPermissions = "merge" 
    } 
} 

AndroidManifest.xml

<uses-permission 
    android:name="android.permission.SYSTEM_ALERT_WINDOW" 
    tools:node="${excludeDebugPermissions}" /> 

Il produit une erreur comme ceci:

Error:Execution failed for task ':app:processDebugManifest'. No enum constant com.android.manifmerger.NodeOperationType.${EXCLUDE_DEBUG_PERMISSIONS}

Mais en utilisant l'espace réservé partout fonctionne autrement correctement (le manifeste fusionné est OK et il n'y a pas d'erreur), par ex.

<uses-permission 
    android:name="${excludeDebugPermissions}" 
    tools:node="remove" /> 

Donc je suppose que l'attribut tools:node ne supporte pas les espaces réservés manifeste et je vais probablement le pirater en remplaçant le nom d'autorisation au lieu du marqueur de noeud (merge/remove), mais je préférerais éviter si possible.

Des conseils?

+0

vous visez d'avoir des autorisations différentes pour le débogage et versions Release? Vous pouvez mettre un autre manifeste android dans src/debug. L'inconvénient est que vous avez deux à maintenir. – RobVoisey

+1

@RobVoisey En fait, j'essaie de me débarrasser de l'autorisation SYSTEM_ALERT_WINDOW héritée de React Native. –

+0

Avez-vous pu résoudre ce problème? –

Répondre

0

En réponse à vos commentaires sur réaction native, je trouve ceci: https://github.com/facebook/react-native/issues/5886

La solution était d'avoir dans vos types de construction qui est un peu différent de ce que vous actuel avez:

buildTypes { 
    debug { 
     manifestPlaceholders = [excludeSystemAlertWindowPermission: "false"] 
    } 
    release { 
     manifestPlaceholders = [excludeSystemAlertWindowPermission: "true"] 
    } 
} 

Alors ce serait dans votre manifeste:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" tools:remove="${excludeSystemAlertWindowPermission}"/> 
+3

J'ai déjà vu ce problème. La solution proposée ne fonctionne pas (confirmé [ici] (https://github.com/facebook/react-native/issues/5886#issuecomment-230569276)) et je ne comprends pas pourquoi il pourrait comme le [doc] (https://developer.android.com/studio/build/manifest-merge.html) indique clairement que 'tools: remove' va" supprimer les attributs spécifiés "et accepte les noms d'attribut, pas une valeur booléenne. –

+1

Je peux confirmer que cette solution ne fonctionne pas. –

1

Le j'ai trouvé pour résoudre ce problème façon la plus simple et la plus propre était de créer une version uniquement fichier AndroidManifest (app/src/release/AndroidManifest.xml) avec le contenu suivant pour supprimer l'autorisation SYSTEM_ALERT_WINDOW:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" tools:node="remove"/> 
</manifest>