2017-03-26 14 views
8

根據許多Android lib模塊,我們有多個項目。 爲避免應用程序清單中出現重複的xml標記,我們將相關的接收者,服務和活動放入其各自的模塊中。Android構建不會合並庫中的清單

直到今天,我們使用:

  • Android的工作室:2.2.1
  • gradle這個:2.1.3
  • buildToolsVersion:23.0.3

今天,我們已經更新到:

  • Android Studio:2.3
  • gradle這個:2.3.0
  • buildToolsVersion:25.0.0

直到此更新,一切工作得很好,艙單合併,我們有衝突,我們解決它們。至於我們所做的更新,清單將不會合並!

---更新1 ---

我們使用的合併清單視圖,並認爲這只是不包括在合併的體現,唯一它從清單中的模塊合併是權限,例如,如果我向模塊清單添加新權限,它只會合併它,而不是其他元素!

Nothing to merge

我保證有很多東西合併!

---更新2 ---

似乎一切應用程序標記其合併到主清單,並在應用程序標記一切,事實並非如此。

---更新3 ---

模塊不合並:

搖籃:

apply plugin: 'com.android.library' 

android { 
    compileSdkVersion 23 
    buildToolsVersion '25.0.0' 

    defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
     debug { 
      jniDebuggable true 
     } 
    } 
} 

dependencies { 
    compile project(path: ':android-infra') 
    compile 'com.google.android.gms:play-services-gcm:9.0.0' 
    compile project(path: ':engine-core-server') 
    compile project(path: ':engine-core-aneeda') 
} 

清單:

<manifest package="com.sensiya.voip.managers.gcm" 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools"> 

    <uses-permission android:name="com.google.android.c2dm.permission.KAKI"/> 


    <application 
     tools:node="replace"> 
     <service 
      android:enabled="true" 
      android:name="com.sensiya.voip.managers.gcm.GcmIntentService"/> 

     <receiver   android:name="com.sensiya.voip.managers.gcm.GcmBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND"> 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE"/> 

       <category android:name="com.iamplus.onenumber.device"/> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

模塊,它將合併:

搖籃:

apply plugin: 'com.android.library' 

android { 
    compileSdkVersion 23 
    buildToolsVersion '25.0.0' 

    defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
     debug { 
      jniDebuggable true 
     } 
    } 
} 

dependencies { 
    compile project(path: ':android-infra') 
    compile 'com.sensiya:sense-services-client:[email protected]' 
    compile project(path: ':engine-core-server') 
    compile project(path: ':engine-core-aneeda') 
} 

清單:

<manifest package="com.iamplus.android.senseServices" 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools"> 

    <application 
     tools:node="replace"> 
     <service 
      android:name="com.iamplus.senseServices.ContextualEventService" 
      android:enabled="true"/> 

     <service 
      android:name="com.iamplus.senseServices.Serv" 
      android:enabled="true"/> 

     <service 
      android:name="com.iamplus.senseServices.Serv1" 
      android:enabled="true"/> 
    </application>  
</manifest> 

有什麼建議?

+1

控制檯中沒有日誌?沒有錯誤? – azizbekian

+0

Asolutly什麼都沒有... – TacB0sS

+0

你可以分享你的應用程序gradle文件。 –

回答

2

如果您收到明顯的合併衝突,您有兩種選擇。

1)找到項目中包含的所有清單文件,包括庫中那些作爲依賴關係的清單文件,並確保沒有衝突的配置。

或2)將一些合併解決規則添加到您的清單以指示應如何解決每個衝突。

這裏有一個偉大的頁面,有很多細節。
https://developer.android.com/studio/build/manifest-merge.html

+0

沒有衝突,沒有gardle控制檯錯誤或警告消息,並且只有當我手動將組件複製到應用程序清單它實際上將它們添加到最終清單 – TacB0sS

5

它可能是很多東西。因爲你沒有提供代碼,我猜你會使用默認合併行爲。有關更多信息,請參閱:Merge conflict heuristics

您可以使用Merged Manifest view預覽合併的清單的結果並查找衝突錯誤。

一般來說,默認情況下合併應該工作。然後,只需使用合併清單視圖即可瞭解&合併過程中丟失值的位置。使用Merge rule markers將幫助您通過分配規則標記來管理合並。

如果根本沒有合併。所以它可能是模塊之間的依賴性問題。

請注意,依賴性順序對具有相同優先級的模塊(如庫)起着至關重要的作用。

---更新5.April.2017 ---

下面是一些有用的提示:

  1. 嘗試更新並不亞於你可以重建其他庫。
  2. 刪除所有依賴項,然後清理項目,然後再次添加它們。和 檢查您是否正確導入它們。這可以通過建立沒有問題的項目來完成。
  3. 請注意,由於模塊中的gradle 2.2.0資產將無法在應用中訪問 。
  4. 檢查你的清單,如果合併過程不受屬性exciplicitly禁用: tools:node=」remove"tools:node="removeAll"或gradle這個(見 這Disable Manifest Merger in Android Gradle Build
  5. 嘗試創建一個模塊和跟蹤合併演示。然後將 輸出匹配到您的項目。這將明確表示不 配置問題,而Android 2.3工作室(所以再重新安裝新版本 )

---更新(2)5.April.2017 ---

後你已經添加的代碼,我看得出來,你在你的模塊(在應用程序的清單,也許太)使用屬性

tools:node="replace" 

在應用元素。我認爲這就是爲什麼你沒有得到合併到應用程序清單中的導入模塊的任何清單合併的原因。請參閱Node markers下的tools:node="replace"

完全替換較低優先級的元素。也就是說,如果低優先級清單中存在 匹配元素,請忽略該元素,並使用與此清單中顯示的元素完全相同的 。

這意味着上述兩個模塊將永遠不會得到任何東西合併清單來自:

  • Android的紅外
  • com.sensiya:感服務的客戶端:1.24.2
  • 引擎-core服務器
  • 發動機核心aneeda

擺脫這個屬性並清理並重建模塊。然後重建整個項目。

+0

這似乎是迄今爲止最好的方式..我沒有意識到合併視圖...我會盡快檢查併發回 – TacB0sS

+0

1.嘗試過,沒有任何東西。 2.試過,什麼都沒有。已知。 4.不存在。 5.這與演播室版本無關,當使用gradle從其他計算機的命令行構建時,也會發生這種情況...所以??? – TacB0sS

+0

替換是爲了解決問題而添加的,與替換的一個模塊合併而另一個不合並是無關緊要的。我們試圖創建另一個項目來顯示這個問題,我們無法重現它。我們嘗試從所有子模塊的應用程序標記中刪除所有標記,但無法合併... Android插件中存在隱藏的深層錯誤,但我們無法放置它 – TacB0sS

1

Android Studio中

構建--->清潔工程
然後
建設 - >使項目
這應該有助於解決

+0

這不起作用 – TacB0sS

0

我Unity的類似問題。我能夠通過繼續使用SDK管理器並刪除最新的android api來解決這個問題。然後我安裝了一個年齡稍大的API和它的工作(API 21或22,我認爲)

What the SDK Manager looks like

0

我最近在我的生產代碼相同的問題。 在其他Gradle依賴項中也存在一個庫到應用程序模塊中會導致重複條目。 我們需要從衝突的模塊或庫中排除這些模塊或庫。

爲此,我們必須知道特定Gadle依賴關係使用的庫的數量。

考慮在我的應用程序中使用「bolts-android-1.2.0.jar」的情況。 在同一個gradle中,我使用下面的FacebookSDK。

compile('com.facebook.android:facebook-android-sdk:4.5.0') 

所以我必須排除「螺栓,機器人」,如下

compile('com.facebook.android:facebook-android-sdk:4.5.0') { 
     exclude module: 'bolts-android' 
    } 

那麼如何知道facebookSDK採用「螺栓,機器人」

在這裏,您可以使用插件Android Method Count

0

看起來像問題是f ROM使用application元素中的tools:node="replace"。從documentation

...如果優先級較低的清單中存在匹配的元素,請忽略它,並使用與此清單中顯示的完全相同的元素。

實際上您要使用的是tools:node="merge"這是默認行爲。

合併在這個標籤中所有屬性和所有嵌套元素當有使用合併衝突啓發式沒有衝突。這是元素的默認行爲。

+0

我希望我能測試這個...代碼不再適用於我 – TacB0sS