2013-09-09 8 views
15

, więc próbuję użyć gradle do stworzenia osobnego buildType, ale ten buildType musi używać różnych charakterystyk dla ta sama aktywność. W tym przypadku moja aktywność powitalna wymaga innego filtru intencji w zależności od typu buildType. czy to możliwe?Gradle: jak scalić pliki manifestu systemu Android dla różnych typów buildTypes, które wymagają tego samego działania, ale z różnymi filtrami intencji

pojawia się następujący błąd w Gradle:

:Tinder:processUtestManifest 
[AndroidManifest.xml:67, AndroidManifest.xml:38] Trying to merge incompatible /manifest/application/activity[@name=com.<company_name>.activities.ActivitySplash] element: 
    <activity 
     @android:name="com.<company_name>.activities.ActivitySplash" 
     <intent-filter> 
      <action 
--   @android:name="android.intent.action.MAIN"> 
    <activity 
     @android:name="com.<company_name>.activities.ActivitySplash" 
     <intent-filter> 
      <action 
++   @android:name="com.apphance.android.LAUNCH"> 

Odpowiedz

11

To nie jest możliwe, aby połączyć zamiarem filtr oddzielnie w tej chwili więc polecam kopiując cały <activity> węzeł w

src/buildtype1/AndroidManifest.xml 

i

src/buildtype2/AndroidManifest.xml 

i zostanie automatycznie scalone do ostatecznego manifestu (oczywiście chcesz go również usunąć z głównego manifestu).

+0

Dzięki Xav, kiedy używam tego Modelu i próbuję budować w ramach Android Studio, otrzymuję: "Android Packager: [] java.util.zip.ZipException: duplikat wpisu: AndroidManifest.xml" Wszelkie pomysły? –

+0

czy dostosowujesz zestawy źródeł? to nie powinno się zdarzyć, jeśli tego nie zrobisz, a jeśli tak, to musisz sprawić, aby ścieżka, o której wspomniałem, pasowała do twojej aktualnej struktury. –

+0

Dzięki Xav, próbowałem skonfigurować projekt zgodnie z Twoimi sugestiami, ale ta konfiguracja prawdopodobnie spowodowała kolejny problem z adnotacjami Androida, więc nie jestem w stanie określić, czy to rozwiąże mój problem z łączeniem. Drugi problem to http://stackoverflow.com/questions/18833642/gradle-android-annotations-merged-manifest-could-not-find-the-androidmani. Jeśli nie miałbyś nic przeciwko temu, spojrzałbym na to, naprawdę bym to docenił! –

4

Zmiana AndroidManifest w spożywającej app/lib od:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"> 
... 
<activity android:name="com.<company_name>.activities.ActivitySplash"> 

Do:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 
... 
<activity android:name="com.<company_name>.activities.ActivitySplash" 
    tools:merge="override"> 
+0

Ta metoda działa dla mnie. Wszystko, czego potrzebujesz, to dodać narzędzia: merge = "przesłonięcie" w dziecku (nadpisane) AndroidManifes.xml –

+0

Po dodaniu nadal próbuję "połączyć wtyczki niekompatybilne" :( – slott

+0

To rozwiązanie jest bitrowane. Zobacz działające tutaj http: //stackoverflow.com/questions/21239844/gradle-merge-wrapper-sub-modules-android-manifest-into-a-main-modules-manifest – Oded

5

Pozwól mi zakładać pełne rozwiązanie, które działa. W takim przypadku aplikacja zarządza filtrami zamiany zarówno obrazów, jak i filmów. Jednak w przypadku konkretnego smaku chcemy tylko przechwytywać wideo, a nie obrazy.

Say swoją działalność jest zdefiniowana następująco:

<activity 
    android:name=".MainActivity" 
    android:configChanges="keyboardHidden|orientation|screenSize" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" 
    android:screenOrientation="landscape" 
    android:theme="@style/CameraTheme"> 

    <intent-filter> 
     <action android:name="android.media.action.IMAGE_CAPTURE"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 

    <intent-filter> 
     <action android:name="android.media.action.VIDEO_CAPTURE"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 
</activity> 

Dla smaku nazwie myFlavor, że zakładam już masz, trzeba mieć to w pliku AndroidManifest.xml:

<!-- Remove the intent filter for images. MyFlavor is only for videos. --> 
<activity 
    android:name="com.androidsx.heliumvideochanger.MainActivity" 
    tools:node="merge"> 

    <intent-filter tools:node="remove"> 
     <action android:name="android.media.action.IMAGE_CAPTURE"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 
</activity> 

Synchronizuj z Gradle i sprawdź ostatni manifest, który zwykle jest w myApp/build/intermediates/manifests/full/myFlavor/debug/AndroidManifest.xml

Powiązane problemy