2014-01-20 47 views
0

我有我的項目中下面的模塊,我不能讓搖籃合併了Android表現正常:搖籃合併封裝/子模塊的Android清單到主模塊的清單

myproject_alpha 
myproject_beta 
myproject_lib 
myproject_release 

的* _lib模塊該項目的主要模塊包含所有源代碼。其他3個模塊是「包裝模塊」,對內容提供者的「權限」參數進行輕微修改,更改* _lib模塊清單中指定的活動意向過濾器中的「數據」字段,並允許其他一些不存在的活動myproject_release模塊。

目前,我已經在alpha(或beta或release)與lib之間對Android錯誤進行了合併。例如,lib和阿爾法之間我看到以下的gradle 2個錯誤:

Trying to merge incompatible /manifest/application/provider[@name=com.myproject.contentprovider.MyProvider] element: 
    <provider 
-- @android:authorities="com.myproject.alpha.provider" 
    <provider 
++ @android:authorities="com.myproject.lib.provider" 

:myproject_alpha:processDebugManifest FAILED 

Trying to merge incompatible /manifest/application/activity[@name=com.myproject.activity.LoginActivity] element: 
    <activity 
    @android:name="com.myproject.activity.LoginActivity" 
      @android:name="android.intent.action.MAIN"> 
      @android:name="android.intent.category.LAUNCHER"> 
    <intent-filter> 
      @android:name="android.intent.action.VIEW"> 
      @android:name="android.intent.category.BROWSABLE"> 
      @android:name="android.intent.category.DEFAULT"> 
     <data 
--   @android:host="myhost.test.com" 
    <activity 
    @android:name="com.myproject.LoginActivity" 
      @android:name="android.intent.action.MAIN"> 
      @android:name="android.intent.category.LAUNCHER"> 
    <intent-filter> 
      @android:name="android.intent.action.VIEW"> 
      @android:name="android.intent.category.BROWSABLE"> 
      @android:name="android.intent.category.DEFAULT"> 
     <data 
++   @android:host="myhost.com" 

:myproject_alpha:processDebugManifest FAILED 

唯一相似的問題,我發現
Gradle: How to merge Android manifest files for different buildTypes which need the same Activity, but with different intent-filters。然而,它並不真正符合我的問題,因爲在我的情況下,「lib」和「alpha」是相互依賴的模塊,而不是不同的構建。我會欣賞一些反饋。

回答

0

如果您檢查class that merges the manifests,您會發現mergeNewOrEqual()方法不夠巧妙,無法合併不相同的元素。不幸的是,這是用來合併提供者和活動的方法。

所以唯一的「解決方案」是要麼只在一個地方定義元素,要麼在兩個定義中給它們相同的簽名。

+0

感謝您的鏈接,它很有用。我們繼承了來自外部團隊的代碼,因此不確定他們是否有代碼按照原樣構建。現在我編輯所有清單以使用相同的簽名,並且在未來的版本中,我將重構代碼庫以更好地使用Gradle。 – cavega

0

聲明您的清單作爲標題如下:

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

然後,使用上的任何活動下列相應的屬性之一,您希望活動的別名,服務,接收器,或提供元素合併:

tools:merge="override" 
tools:merge="remove" 

此信息被收集來自:
https://android.googlesource.com/platform/tools/base/+/idea133/build-system/manifest-merger/src/main/java/com/android/manifmerger/ManifestMerger.java

+0

您的解決方案不起作用 –

+0

請解釋「不起作用」。合併後的清單是什麼樣的?請提供子清單和超級清單的副本。 – swooby

+0

它會說:嘗試合併不兼容/清單/應用程序/活動[@ name =#provider#]元素: –

1

我有問題與以上回答,當我編譯,我總是得到消息

無效指令「合併」,有效指令是: 拆卸,更換,嚴格

我發現成功導入工具中@swooby回答,然後在<activity>標籤添加tools:node="merge"爲正推出我想更換,然後加入

<intent-filter tools:node="remove"> 
       <action android:name="android.intent.action.MAIN"/> 

到活動的啓動,我不希望活動有一個發射器圖標

希望這會有所幫助。

+0

謝謝你的更新。以前的解決方案必須有點爛。通過檢查生成的中間清單,我證實了這一點,正如我期望的那樣,在我使用它的兩種產品口味中都能正常工作。 – Oded