2014-01-20 4 views
0

나는 내가 Gradle을 안드로이드를 병합 얻을 수있는 내 프로젝트 내부의 다음 모듈이 올바르게 명단이 있습니다Gradle을은 메인 모듈의 매니페스트에 래퍼/서브 모듈의 안드로이드 매니페스트를 병합

myproject_alpha 
myproject_beta 
myproject_lib 
myproject_release 

* 표시 _lib 모듈입니다 모든 소스 코드를 포함하는 프로젝트의 주 모듈. 나머지 3 개의 모듈은 컨텐트 프로 바이더의 "authority"매개 변수를 약간 수정하고 * _lib 모듈의 매니페스트에 지정된 활동의 인 텐트 필터 내에서 "data"필드를 변경하고 거기에없는 다른 활동을 활성화하는 "래퍼 모듈"입니다 myproject_release 모듈.

현재 알파 (또는 베타 또는 릴리스) 대 lib 사이에 병합 안드로이드 매니페스트 오류가 있습니다. 예를 들어, LIB 및 알파 사이에 나는 다음과 같은 2 Gradle을 오류를 참조하십시오 내가 찾은

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

, 모든 활동에 다음과 같은 적절한 속성 중 하나를 사용, 당신이 원하는 활동 별칭, 서비스, 수신기, 또는 공급자의 요소를 병합 : 와 나는 문제가
https://android.googlesource.com/platform/tools/base/+/idea133/build-system/manifest-merger/src/main/java/com/android/manifmerger/ManifestMerger.java

+0

해결책이 작동하지 않습니다. –

+0

"작동하지 않음"을 설명하십시오.병합 된 매니페스트는 어떤 모습입니까? 하위 매니페스트와 수퍼 매니페스트의 사본을 제공해주세요. – swooby

+0

다음과 같이 표시됩니다 : 호환되지 않는/manifest/application/activity [@ name = # provider #] 요소를 병합하려고합니다 : –

1

:에서

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

이 정보가 수집되었다 내가 컴파일 할 때 난 항상 메시지

를 얻을 수 있다는 점에서 위의 대답

잘못된 명령 '병합', 유효한 지침은 다음과 같습니다 제거 교체,

내가 같이 도구를 가져 오기에 성공을 엄격한 내가 대체 할 다음 내가 원하는하지 않는 활동의 실행에

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

을 추가 출시되는 활동에 대한 <activity> 태그에 tools:node="merge"를 추가 한 후 응답하고 @swooby 실행기 아이콘이 있습니다

희망이 있습니다.

+0

실패 업데이트 해주셔서 감사합니다. 이전 솔루션은 약간 썩어 야합니다. 생성 된 중간 적 매니페스트를 검사하여 두 제품의 맛에서 기대했던대로 작동하는지 확인했습니다. – Oded