Na tej stronie opisujemy, jak działa scalanie plików manifestu i jak to zrobić ustawienia na rozwiązywać konflikty scalania. Wprowadzenie do aplikacji pliku manifestu, zobacz opisie pliku manifestu aplikacji.
Scalanie wielu plików manifestu
Plik APK lub pakiet Android App Bundle może zawierać tylko jeden
AndroidManifest.xml
, ale projekt Android Studio może zawierać
kilka plików manifestu udostępnionych przez główny zbiór źródłowy, warianty kompilacji i zaimportowane
biblioteki. Kompilacja Gradle jest scalona podczas tworzenia aplikacji
wszystkie pliki manifestu w jeden spakowany plik manifestu
do aplikacji.
Narzędzie do łączenia plików manifestu łączy wszystkie elementy XML z każdego pliku w następujący sposób: scalanie heurystyki i stosowanie się do zdefiniowanych przez siebie preferencji scalania ze specjalnymi atrybutami XML.
Wskazówka: użyj pliku manifestu scalonego widoku danych, jak opisano w następnej sekcji, aby wyświetlić podgląd wyników scalonego pliku manifestu i znaleźć konflikty .
Scal priorytety
Narzędzie do łączenia danych łączy wszystkie pliki manifestu w jeden plik sekwencyjnie zgodnie z priorytetem każdego pliku manifestu. Jeśli na przykład masz 3 plików manifestu, plik manifestu o najniższym priorytecie jest scalony z plikiem plik manifestu o następnym najwyższym priorytecie, który jest następnie scalany z plikiem manifestu o najwyższym priorytecie. pliku manifestu, jak pokazano na rys. 1.
Istnieją 3 podstawowe typy plików manifestu, które można scalać w każdy z nich a ich priorytety scalania są następujące (najpierw o najwyższym priorytecie):
- Plik manifestu dla
utwórz wariant
Jeśli dla wariantu masz kilka zbiorów źródłowych, ich wartości w pliku manifestu są następujące priorytety:
- Plik manifestu wariantu kompilacji (np.
src/demoDebug/
) - Plik manifestu typu kompilacji (np.
src/debug/
) - Plik manifestu rodzaju produktu (np.
src/demo/
)Jeśli używasz wymiarów dotyczących rodzajów, priorytety w pliku manifestu w kolejności, w której każdy wymiar jest wymieniony w tabeli Właściwość
flavorDimensions
(pierwsza ma najwyższy priorytet).
- Plik manifestu wariantu kompilacji (np.
- Główny plik manifestu modułu aplikacji
- Plik manifestu z uwzględnionej biblioteki
Jeśli masz wiele bibliotek, ich priorytety w pliku manifestu są takie same w kolejności, w jakiej są wyświetlane w Gradle Blok
dependencies
.
Na przykład plik manifestu biblioteki został scalony z głównym plikiem manifestu, a potem plik główny plik manifestu został scalony z plikiem manifestu wariantu kompilacji. Pamiętaj, że są to te same wartości. priorytety scalania dla wszystkich zbiorów źródłowych, tak jak to opisano w Twórz z użyciem zbiorów źródłowych.
Ważne: konfiguracje kompilacji z
build.gradle
zastępują wszystkie odpowiadające im atrybuty w
scalonego pliku manifestu. Na przykład
minSdk
z build.gradle
lub
build.gradle.kts
zastępuje pasujący atrybut w
<uses-sdk>
.
manifestu. Aby uniknąć nieporozumień, pomiń
<uses-sdk>
i zdefiniuj te właściwości tylko w tagu
build.gradle
. Więcej informacji:
Skonfiguruj kompilację.
Scal heurystykę konfliktów
Narzędzie do łączenia danych może logicznie dopasować każdy element XML, od jednego pliku manifestu do odpowiadającego mu elementu w innym pliku manifestu. Szczegółowe informacje na temat sposobu dopasowywania zapoznaj się z priorytetami scalania w poprzedniej sekcji.
Jeśli element z pliku manifestu o niższym priorytecie nie pasuje do żadnego elementu w pliku manifestu o wyższym priorytecie, zostanie on dodany do scalonego pliku manifestu. Pamiętaj jednak: gdy istnieje pasujący element, narzędzie do łączenia wszystkich atrybutów z każdego z nich w ten sam element. Jeśli narzędzie wykryje, że pliki manifestu zawierają ten sam atrybut z różnymi wartościami, po czym następuje scalenie konflikt danych.
Tabela 1 przedstawia możliwe rezultaty, jakie może wystąpić po połączeniu przez narzędzie do łączenia danych. wszystkie atrybuty w jeden element.
Atrybut o wysokim priorytecie | Atrybut niskiego priorytetu | Wynik scalonego atrybutu |
---|---|---|
Nieistotna | Nieistotna | Brak wartości (użyj wartości domyślnej) |
Wartość B | Wartość B | |
Wartość A | Nieistotna | Wartość A |
Wartość A | Wartość A | |
Wartość B | Błąd konfliktu – musisz dodać parametr znacznika reguły scalania. |
W kilku sytuacjach narzędzie do łączenia danych działa jednak inaczej. aby uniknąć konfliktów podczas scalania:
- Atrybuty w elemencie
<manifest>
nigdy nie są scalane razem; używane są tylko atrybuty z pliku manifestu o najwyższym priorytecie. - Atrybut
android:required
w<uses-feature>
i Elementy<uses-library>
używają lub scalenie LUB. Jeśli wystąpi konflikt,"true"
jest a funkcja lub biblioteka wymagana przez jeden plik manifestu jest zawsze uwzględniana. - Atrybuty w
Element
<uses-sdk>
zawsze używa wartości z parametru plik manifestu o wyższym priorytecie. Wyjątkiem są te sytuacje:- Gdy plik manifestu o niższym priorytecie zawiera wartość
minSdk
tej wyższej wartości, występuje błąd, chyba że zastosujoverrideLibrary
reguła scalania. - Gdy plik manifestu o niższym priorytecie zawiera pole
targetSdkVersion
o niższej wartości, narzędzie do scalania użyje wartości z pliku manifestu o wyższym priorytecie, a także dodaje wszelkie uprawnienia systemowe które są niezbędne, aby mieć pewność, że importowana biblioteka działają prawidłowo (w przypadkach, gdy wyższa wersja Androida zwiększonych ograniczeń dotyczących uprawnień). Więcej informacji na ten temat zapoznaj się z sekcją o układzie niejawnym .
- Gdy plik manifestu o niższym priorytecie zawiera wartość
- Element
<intent-filter>
nigdy nie pasuje do: plików manifestu. Każdy element jest traktowany jako niepowtarzalny i dodano do wspólnego elementu nadrzędnego w scalonym pliku manifestu.
W przypadku wszystkich innych konfliktów między atrybutami pojawia się błąd i konieczne jest wskaże narzędzie do łączenia danych, jak rozwiązać ten problem, dodając specjalny atrybut w plik manifestu o wyższym priorytecie. Zobacz następującą sekcję na temat: znaczniki reguł scalania.
Nie polegaj na domyślnych wartościach atrybutów. Ponieważ wszystkie
unikalne atrybuty są łączone w ten sam element, może to spowodować,
zawiera nieoczekiwane wyniki, jeśli plik manifestu o wyższym priorytecie naprawdę zależy od
domyślną wartość atrybutu bez jego zadeklarowania. Na przykład, jeśli wyższy-
Plik manifestu priorytetu nie deklaruje pola android:launchMode
, to użyjemy domyślnej wartości "standard"
– ale jeśli
w pliku manifestu o niższym priorytecie deklaruje on ten atrybut z inną wartością,
jest stosowana do scalonego pliku manifestu, co zastępuje wartość domyślną. Ty
powinien bezpośrednio definiować każdy atrybut zgodnie z potrzebami. Wartości domyślne
dla każdego atrybutu są udokumentowane w
manifestu reference.
Scal znaczniki reguł
Znacznik reguły scalania to atrybut XML, którego możesz użyć do określenia własnych preferencji. jak rozwiązywać konflikty scalania lub usuwać niechciane elementy i atrybuty. Znacznik można zastosować do całego elementu lub tylko do konkretnego elementu w elemencie.
Jeśli scalasz dwa pliki manifestu, narzędzie do scalania wyszukuje te znaczniki w plik manifestu o wyższym priorytecie.
Wszystkie znaczniki należą do przestrzeni nazw Androida tools
, dlatego najpierw musisz zadeklarować
tę przestrzeń nazw w elemencie <manifest>
, jak pokazano tutaj:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp" xmlns:tools="http://schemas.android.com/tools">
Znaczniki węzłów
Aby zastosować regułę scalania do całego elementu XML (do wszystkich atrybutów w danym manifestu i wszystkich jego tagów podrzędnych), użyj następującego tagu atrybuty:
tools:node="merge"
- Scal wszystkie atrybuty w tym tagu i wszystkie zagnieżdżone elementy, jeśli występują
brak konfliktów przy użyciu scalania
heurystyki konfliktów. Jest to domyślne działanie elementów.
Plik manifestu niskiego priorytetu:
<activity android:name="com.example.ActivityOne" android:windowSoftInputMode="stateUnchanged"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Plik manifestu o wysokim priorytecie:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" tools:node="merge"> </activity>
Wynik scalonego pliku manifestu:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" android:windowSoftInputMode="stateUnchanged"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
tools:node="merge-only-attributes"
- Scal tylko atrybuty w tym tagu; nie scalaj zagnieżdżonych elementów.
Plik manifestu niskiego priorytetu:
<activity android:name="com.example.ActivityOne" android:windowSoftInputMode="stateUnchanged"> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Plik manifestu o wysokim priorytecie:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" tools:node="merge-only-attributes"> </activity>
Wynik scalonego pliku manifestu:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" android:windowSoftInputMode="stateUnchanged"> </activity>
tools:node="remove"
- Usuń ten element ze scalonego pliku manifestu. Używana, gdy
w scalonym pliku manifestu widzisz element, który nie jest Ci potrzebny.
została udostępniona w pliku manifestu o niższym priorytecie, na który nie masz kontroli
(np. zaimportowanej biblioteki).
Plik manifestu niskiego priorytetu:
<activity-alias android:name="com.example.alias"> <meta-data android:name="cow" android:value="@string/moo"/> <meta-data android:name="duck" android:value="@string/quack"/> </activity-alias>
Plik manifestu o wysokim priorytecie:
<activity-alias android:name="com.example.alias"> <meta-data android:name="cow" tools:node="remove"/> </activity-alias>
Wynik scalonego pliku manifestu:
<activity-alias android:name="com.example.alias"> <meta-data android:name="duck" android:value="@string/quack"/> </activity-alias>
tools:node="removeAll"
- Podobne do
tools:node="remove"
, ale usuwa wszystkie elementów pasujących do tego typu elementu (w obrębie tego samego elementu nadrzędnego).Plik manifestu niskiego priorytetu:
<activity-alias android:name="com.example.alias"> <meta-data android:name="cow" android:value="@string/moo"/> <meta-data android:name="duck" android:value="@string/quack"/> </activity-alias>
Plik manifestu o wysokim priorytecie:
<activity-alias android:name="com.example.alias"> <meta-data tools:node="removeAll"/> </activity-alias>
Wynik scalonego pliku manifestu:
<activity-alias android:name="com.example.alias"> </activity-alias>
tools:node="replace"
- Zastąp całkowicie element o niższym priorytecie. Oznacza to, że
jest pasującym elementem w pliku manifestu o niższym priorytecie, zignoruj go i użyj
dokładnie w takiej postaci, w jakiej występuje w tym pliku manifestu.
Plik manifestu niskiego priorytetu:
<activity-alias android:name="com.example.alias"> <meta-data android:name="cow" android:value="@string/moo"/> <meta-data android:name="duck" android:value="@string/quack"/> </activity-alias>
Plik manifestu o wysokim priorytecie:
<activity-alias android:name="com.example.alias" tools:node="replace"> <meta-data android:name="fox" android:value="@string/dingeringeding"/> </activity-alias>
Wynik scalonego pliku manifestu:
<activity-alias android:name="com.example.alias"> <meta-data android:name="fox" android:value="@string/dingeringeding"/> </activity-alias>
tools:node="strict"
- Generuj błąd kompilacji za każdym razem, gdy ten element o niższym priorytecie
plik manifestu nie jest dokładnie zgodny z elementem w pliku manifestu o wyższym priorytecie (chyba że
rozstrzygnięte przez inne znaczniki reguł scalania). Zastępuje to heurystykę konfliktów scalania. Dla:
Jeśli na przykład plik manifestu o niższym priorytecie zawiera dodatkowy atrybut,
kompilacja się nie uda (gdy domyślne działanie powoduje dodanie dodatkowego atrybutu do
pliku manifestu scalonego).
Plik manifestu niskiego priorytetu:
<activity android:name="com.example.ActivityOne" android:windowSoftInputMode="stateUnchanged"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Plik manifestu o wysokim priorytecie:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" tools:node="strict"> </activity>
Spowoduje to utworzenie błędu scalania pliku manifestu. Dwa elementy manifestu nie mogą się zupełnie różnić w trybie ścisłym. Musisz zastosować inne znaczniki reguł scalania żeby zniwelować te różnice. (Bez
tools:node="strict"
te dwa pliki można scalić bez błędów, jak w przykładzie dla argumentutools:node="merge"
).
Znaczniki atrybutów
Aby zamiast tego zastosować regułę scalania tylko do określonych atrybutów w pliku manifestu, użyj . Każdy atrybut może mieć co najmniej jedną nazwę atrybutu (łącznie z przestrzeni nazw atrybutów), rozdzielone przecinkami.
tools:remove="attr, ..."
- Usuń określone atrybuty ze scalonego pliku manifestu.
Używana, gdy plik manifestu o niższym priorytecie zawiera te
i chcesz mieć pewność, że nie zostaną scalone.
pliku manifestu.
Plik manifestu niskiego priorytetu:
<activity android:name="com.example.ActivityOne" android:windowSoftInputMode="stateUnchanged">
Plik manifestu o wysokim priorytecie:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" tools:remove="android:windowSoftInputMode">
Wynik scalonego pliku manifestu:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait">
tools:replace="attr, ..."
- Zastąp określone atrybuty w pliku manifestu o niższym priorytecie
tych z tego pliku manifestu. Innymi słowy, pamiętaj, aby zawsze
z wartości pliku manifestu o wyższym priorytecie.
Plik manifestu niskiego priorytetu:
<activity android:name="com.example.ActivityOne" android:theme="@oldtheme" android:exported="false" android:windowSoftInputMode="stateUnchanged">
Plik manifestu o wysokim priorytecie:
<activity android:name="com.example.ActivityOne" android:theme="@newtheme" android:exported="true" android:screenOrientation="portrait" tools:replace="android:theme,android:exported">
Wynik scalonego pliku manifestu:
<activity android:name="com.example.ActivityOne" android:theme="@newtheme" android:exported="true" android:screenOrientation="portrait" android:windowSoftInputMode="stateUnchanged">
tools:strict="attr, ..."
- Wystąpił błąd kompilacji za każdym razem, gdy te atrybuty w pliku
plik manifestu o niższym priorytecie nie pasuje dokładnie do atrybutów w wyższym priorytecie
pliku manifestu. Jest to domyślne działanie w przypadku wszystkich atrybutów z wyjątkiem
osób o specjalnych zachowaniach opisanych w artykule heurystyki scalania konfliktów.
Plik manifestu niskiego priorytetu:
<activity android:name="com.example.ActivityOne" android:screenOrientation="landscape"> </activity>
Plik manifestu o wysokim priorytecie:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" tools:strict="android:screenOrientation"> </activity>
Spowoduje to utworzenie błędu scalania pliku manifestu. Musisz zastosować inną regułę scalania znacznikami w celu rozwiązania konfliktu. Jest to działanie domyślne, więc ten sam wynik występuje przy jawnym dodaniu
tools:strict="screenOrientation"
Do jednego elementu możesz też zastosować wiele znaczników, jak w tym przykładzie:
Plik manifestu niskiego priorytetu:
<activity android:name="com.example.ActivityOne" android:theme="@oldtheme" android:exported="false" android:allowTaskReparenting="true" android:windowSoftInputMode="stateUnchanged">
Plik manifestu o wysokim priorytecie:
<activity android:name="com.example.ActivityOne" android:theme="@newtheme" android:exported="true" android:screenOrientation="portrait" tools:replace="android:theme,android:exported" tools:remove="android:windowSoftInputMode">
Wynik scalonego pliku manifestu:
<activity android:name="com.example.ActivityOne" android:theme="@newtheme" android:exported="true" android:allowTaskReparenting="true" android:screenOrientation="portrait">
Selektor znaczników
Jeśli chcesz zastosować znaczniki reguł scalania tylko do
zaimportowanej biblioteki, dodaj atrybut tools:selector
z
nazwę pakietu biblioteki.
Na przykład w tym pliku manifestu remove
reguła scalania jest stosowana tylko wtedy, gdy plik manifestu o niższym priorytecie pochodzi z
Biblioteka com.example.lib1
:
<permission android:name="permissionOne" tools:node="remove" tools:selector="com.example.lib1">
Jeśli plik manifestu o niższym priorytecie pochodzi z dowolnego innego źródła,
remove
reguła scalania jest ignorowana.
Uwaga: jeśli używasz tego atrybutu z jednym ze znaczników atrybutów, dotyczy to wszystkich atrybutów określonych w znaczniku.
Zastąp <uses-sdk> dla zaimportowanych bibliotek
Domyślnie podczas importowania biblioteki z wartością minSdk
jest wyższy niż w głównym pliku manifestu, pojawia się błąd i
Nie można zaimportować biblioteki.
Aby narzędzie do łączenia kont zignoruj ten konflikt,
zaimportuj bibliotekę, zachowując w aplikacji krótszy minSdk
dodaj atrybut overrideLibrary
do tagu <uses-sdk>
.
Wartością atrybutu może być co najmniej jedna nazwa pakietu biblioteki
(rozdzielone przecinkami), wskazujące biblioteki, które mogą zastąpić bibliotekę główną
minSdk
w pliku manifestu.
Jeśli na przykład główny plik manifestu aplikacji dotyczy pliku overrideLibrary
podobny do tego:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app" xmlns:tools="http://schemas.android.com/tools"> <uses-sdk tools:overrideLibrary="com.example.lib1, com.example.lib2"/> ...
Potem będzie można scalić ten plik manifestu bez błędu dotyczącego
<uses-sdk>
, a scalony plik manifestu zachowuje
minSdk="2"
z manifestu aplikacji.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.lib1"> <uses-sdk android:minSdk="4" /> ...
Pośrednie uprawnienia systemowe
Niektóre interfejsy API Androida, które kiedyś były swobodnie dostępne dla aplikacji, stały się ograniczone przez uprawnienia systemowe w najnowszych wersji Androida.
Aby uniknąć uszkodzenia aplikacji, które oczekują do nich dostępu
API, ostatnie wersje Androida umożliwiają aplikacjom dalszy dostęp do tych interfejsów.
bez tego uprawnienia, jeśli targetSdkVersion
ma wartość niższą
niż w wersji, do której dodano ograniczenie. To zachowanie
przyznaje aplikacji niejawne uprawnienia dostępu do interfejsów API. Scalony
pliki manifestu z różnymi wartościami
Może to mieć wpływ na: targetSdkVersion
.
Jeśli plik manifestu o niższym priorytecie ma niższą wartość dla:
targetSdkVersion
, które przyzna mu uprawnienie niejawne,
a plik manifestu o wyższym priorytecie nie ma takiego samego
(ponieważ jego targetSdkVersion
jest równy lub większy
niż w wersji, w której dodano ograniczenie), narzędzie do łączenia
jawnie dodaje uprawnienia systemowe do scalonego pliku manifestu.
Jeśli na przykład Twoja aplikacja ustawi targetSdkVersion
na 4 lub wyższą i zaimportuje
z biblioteką z wartością targetSdkVersion
ustawioną na 3 lub mniejszą, narzędzie do łączenia
WRITE_EXTERNAL_STORAGE
.
uprawnienia do scalonego pliku manifestu.
Tabela 2 zawiera wszystkie możliwe uprawnienia które można dodać do scalonego pliku manifestu:
Deklaracje w pliku manifestu o niższym priorytecie | Dodano uprawnienia do scalonego pliku manifestu |
---|---|
targetSdkVersion ma wartość 3 lub niższą |
WRITE_EXTERNAL_STORAGE , READ_PHONE_STATE |
targetSdkVersion ma co najmniej 15 lat i korzysta z konta READ_CONTACTS |
READ_CALL_LOG |
targetSdkVersion ma co najmniej 15 lat i korzysta z konta WRITE_CONTACTS |
WRITE_CALL_LOG |
Sprawdzanie scalonego pliku manifestu i znajdowanie konfliktów
Jeszcze przed utworzeniem aplikacji możesz wyświetlić podgląd elementów, które zostały scalone plik manifestu. Aby wyświetlić podgląd:
- W Android Studio otwórz plik
AndroidManifest.xml
. - U dołu edytora kliknij kartę Plik manifestu scalonego.
Widok pliku manifestu scalonego zawiera po lewej stronie wyniki scalonego pliku manifestu. i informacje o każdym scalonym pliku manifestu z prawej strony, jak pokazano na rys. 2.
Elementy, które zostały scalone z plików manifestu o niższym priorytecie są wyróżnione różnymi kolorami po lewej stronie. Kluczem każdego koloru jest określona w sekcji Źródła pliku manifestu.
pliki manifestu, które były częścią kompilacji, ale nie zawierały elementów lub są wymienione w sekcji Inne pliki manifestu.
Aby zobaczyć informacje o tym, skąd pochodzi element, kliknij go po lewej stronie a szczegóły pojawią się w sekcji Dziennik łączenia.
Jeśli wystąpią konflikty, pojawią się one w sekcji Błędy łączenia. ze wskazówkami dotyczącymi rozwiązywania konfliktów za pomocą znaczniki reguł scalania
Błędy są też drukowane w oknie Dziennik zdarzeń. Aby je wyświetlić, wybierz Widok > Okna narzędziowe > Dziennik zdarzeń.
Pełny log drzewa decyzyjnego o scalaniu znajdziesz
znajduje się w katalogu build/outputs/logs/
modułu o nazwie
manifest-merger-buildVariant-report.txt
Scal zasady
Narzędzie do łączenia plików manifestu może logicznie dopasować każdy element XML z jednego pliku manifestu
do odpowiedniego elementu w innym pliku. Scalenie odpowiada każdemu elementowi
używając klucza dopasowania, czyli niepowtarzalnej wartości atrybutu (np. android:name
) lub
Niepowtarzalność samego tagu (np. może zawierać tylko jeden tag
<supports-screen>
).
Jeśli 2 pliki manifestu zawierają ten sam element XML: narzędzie łączy oba elementy przy użyciu jednej z trzech zasad scalania:
- Scal
- Połącz wszystkie atrybuty niekolidujące w jednym tagu i scal elementów podrzędnych zgodnie z odpowiednimi zasadami scalania. Jeśli jakiekolwiek atrybuty kolidują ze sobą, scal je przy użyciu znaczników reguł scalania
- Scal tylko podrzędne
- Nie łącz ani nie scalaj atrybutów (zachowaj tylko podane atrybuty pliku manifestu o najwyższym priorytecie) i scal elementów podrzędnych zgodnie z ich zasadami scalania.
- Keep
- Pozostaw element w niezmienionej formie i dodaj go do wspólnego elementu nadrzędnego w polu scalony plik. Jest on używany tylko wtedy, gdy akceptowalne jest kilka tego samego elementu.
Tabela 3 zawiera listę wszystkich typów elementów, typów użytych zasad scalania oraz klucz używany do określania dopasowania elementu między 2 plikami manifestu:
Żywioły | Zasada scalania | Klucz dopasowania |
---|---|---|
<action>
|
Scal | android:name atrybut
|
<activity>
|
Scal | android:name atrybut
|
<application>
|
Scal | Obowiązuje tylko 1 na <manifest> .
|
<category>
|
Scal | android:name atrybut
|
<data>
|
Scal | Obowiązuje tylko 1 na <intent-filter> .
|
<grant-uri-permission>
|
Scal | Obowiązuje tylko 1 na <provider> .
|
<instrumentation>
|
Scal | android:name atrybut
|
<intent-filter>
|
Keep | Brak dopasowań; w elemencie nadrzędnym można umieścić kilka deklaracji. |
<manifest>
|
Scal tylko podrzędne | W każdym pliku jest tylko 1 plik. |
<meta-data>
|
Scal | android:name atrybut
|
<path-permission>
|
Scal | Obowiązuje tylko 1 na <provider> .
|
<permission-group>
|
Scal | android:name atrybut
|
<permission>
|
Scal | android:name atrybut
|
<permission-tree>
|
Scal | android:name atrybut
|
<provider>
|
Scal | android:name atrybut
|
<receiver>
|
Scal | android:name atrybut
|
<screen>
|
Scal | android:screenSize atrybut
|
<service>
|
Scal | android:name atrybut
|
<supports-gl-texture>
|
Scal | android:name atrybut
|
<supports-screen>
|
Scal | Obowiązuje tylko 1 na <manifest> .
|
<uses-configuration>
|
Scal | Obowiązuje tylko 1 na <manifest> .
|
<uses-feature>
|
Scal | android:name (jeśli go nie ma, używany jest atrybut
android:glEsVersion )
|
<uses-library>
|
Scal | android:name atrybut
|
<uses-permission>
|
Scal | android:name atrybut
|
<uses-sdk>
|
Scal | Obowiązuje tylko 1 na <manifest> .
|
Elementy niestandardowe | Scal | Brak dopasowań; narzędzia do łączenia kont nie mają dostępu do informacji na ich temat, zawarte w scalonym pliku manifestu. |
Wstrzyknij zmienne kompilacji do pliku manifestu
Jeśli chcesz wstawić do pliku AndroidManifest.xml
zmienne, które:
zdefiniowane w pliku build.gradle
, możesz to zrobić za pomocą funkcji
Usługa manifestPlaceholders
. Ta właściwość pobiera mapę par klucz-wartość,
jak tutaj:
Odlotowe
android { defaultConfig { manifestPlaceholders = [hostName:"www.example.com"] } ... }
Kotlin
android { defaultConfig { manifestPlaceholders["hostName"] = "www.example.com" } ... }
Następnie możesz wstawić jedną z tych zmiennych do pliku manifestu jako wartość atrybutu:
<intent-filter ... >
<data android:scheme="https" android:host="${hostName}" ... />
...
</intent-filter>
Domyślnie narzędzia do kompilacji udostępniają też
identyfikator aplikacji
w zmiennej ${applicationId}
. Wartość zawsze pasuje do ostatecznej
identyfikator aplikacji w bieżącej kompilacji, w tym
za pomocą wariantów kompilacji.
Jest to przydatne, gdy chcesz użyć unikalnej przestrzeni nazw dla identyfikatorów
np. działanie intencji, nawet pomiędzy
wariantami kompilacji.
Jeśli na przykład plik build.gradle
wygląda tak:
Odlotowe
android { defaultConfig { applicationId "com.example.myapp" } flavorDimensions "type" productFlavors { free { applicationIdSuffix ".free" dimension "type" } pro { applicationIdSuffix ".pro" dimension "type" } } }
Kotlin
android { defaultConfig { applicationId = "com.example.myapp" } flavorDimensions += "type" productFlavors { create("free") { applicationIdSuffix = ".free" dimension = "type" } create("pro") { applicationIdSuffix = ".pro" dimension = "type" } } }
Następnie możesz wstawić identyfikator aplikacji w pliku manifestu w następujący sposób:
<intent-filter ... >
<action android:name="${applicationId}.TRANSMOGRIFY" />
...
</intent-filter>
W pliku manifestu pojawi się po utworzeniu „bezpłatnej” smak produktu jest taki:
<intent-filter ... >
<action android:name="com.example.myapp.free.TRANSMOGRIFY" />
...
</intent-filter>
Więcej informacji: Ustaw identyfikator aplikacji.