2017-07-18 13 views
8

Próbuję użyć manifestu zastępczego do usunięcia węzła uses-permission w AndroidManifest.xml dla wersji wydań bez powodzenia.Nie można użyć manifestu zastępczego do usunięcia uprawnienia

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}" /> 

Produkuje błąd takiego:

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

ale stosując zastępczy nigdzie indziej prace poprawnie (scalony manifest jest OK i nie ma błędu), np.

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

Więc przypuszczam atrybut tools:node nie obsługuje oczywistych zastępcze, a ja prawdopodobnie będzie siekać je zastępując nazwę uprawnień zamiast znacznika węzeł (merge/remove), ale wolałbym uniknąć jeśli to możliwe.

Wszelkie porady?

+0

ty mające na celu mają różne uprawnienia do debugowania i uwalniania buduje? Możesz umieścić kolejny android manifest w src/debug. Minusem jest to, że masz dwa do utrzymania. – RobVoisey

+1

@RobVoisey Właściwie to próbuję pozbyć się uprawnienia SYSTEM_ALERT_WINDOW odziedziczonego po React Native. –

+0

Czy byłeś w stanie to rozwiązać? –

Odpowiedz

0

W odpowiedzi na Twój komentarz na temat reagować rodzimy, znalazłem to: https://github.com/facebook/react-native/issues/5886

Rozwiązaniem było mieć to w swoim rodzaju kompilacji, która różni się nieco od tego, co obecny mieć:

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

Tak to byłoby w swoim manifeście:

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

Widziałem już ten problem. Proponowane rozwiązanie nie działa (potwierdzone [tutaj] (https://github.com/facebook/react-native/issues/5886#issuecomment-230569276)) i nie rozumiem, dlaczego mogło to być [doc] (https://developer.android.com/studio/build/manifest-merge.html) wyraźnie mówi, że 'tools: remove'" usunie określone atrybuty "i zaakceptuje nazwy atrybutów, a nie wartości boolowskie. –

+1

Mogę potwierdzić, że to rozwiązanie nie działa. –

1

Najprostszym i najczystszym sposobem znalazłem rozwiązania tego problemu było stworzenie uwalnianiu tylko AndroidManifest plik (app/src/release/AndroidManifest.xml) o następującej treści usunąć pozwolenie 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> 
Powiązane problemy