5

Trong build.gradle, tôi đã hương vị sản phẩm thiết lập:Android, Gradle, hương vị sản phẩm và manifest

productFlavors 
{ 
    AlternateFlavour 
    { 
     applicationId "com.myapp.alternateflavour" 
    } 
} 

Sau đó, trong phần sourceSets, tôi sử dụng tài nguyên khác nhau, tài sản và danh bạ manifest cho những hương vị:

sourceSets { 
    main { 
     manifest.srcFile 'AndroidManifest.xml' 
     java.srcDirs = ['src'] 
     res.srcDirs = ['res'] 
     assets.srcDirs = ['assets'] 
    } 

    AlternateFlavour { 
     manifest.srcFile 'manifest-tmp/AlternateFlavour/AndroidManifest.xml' 
     java.srcDirs = ['src'] 
     res.srcDirs = ['res-tmp/AlternateFlavour'] 
     assets.srcDirs = ['assets-tmp/AlternateFlavour'] 
     } 
    } 

OK cho đến thời điểm này.

Trong manifest mà được sử dụng bởi các hương vị, đó là một phần tự động tạo ra, tôi có:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myapp.myapp" 
    android:versionCode="1010001" 
    android:versionName="V1.1.0.1" > 

nhưng trong biểu hiện ban đầu trong dự án gốc như sau:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myapp.myapp" 
    android:versionCode="1010000" 
    android:versionName="V1.1.0.DEBUG" > 

Điều này khiến Gradle không thành công:

Error: 
    Attribute [email protected] value=(1010001) from AndroidManifest.xml:4:5-28 
    is also present at AndroidManifest.xml:4:5-28 value=(1010000). 
Attributes of <manifest> elements are not merged. 

Tại sao nó cố gắng hợp nhất e với bản kê khai ban đầu ở tất cả, khi tôi đã chỉ định nó nên tìm ở nơi khác?

Và làm cách nào tôi có thể dừng điều này?

Tôi hy vọng một số người sẽ hỏi tại sao tôi làm theo cách này, hoặc thực sự tại sao tôi không sử dụng cấu trúc dự án hương vị được đề xuất. Vâng, tôi cần một biểu hiện bình thường để sử dụng bên ngoài Gradle, ví dụ: để triển khai từ Eclipse (một điều tại một thời điểm xin vui lòng!) và tôi cũng cần các phiên bản được tiêm bởi quá trình xây dựng.

Trả lời

0

tôi sẽ được giữ trong tâm trí những gì @CommonsWare nói trong câu trả lời của họ, nhưng bây giờ, tôi đã được giải quyết như sau:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    package="com.myapp.myapp" 
    tools:replace="android:versionName,android:versionCode" 
    android:versionCode="1010001" 
    android:versionName="V1.1.0.1" > 

Lưu ý hai tools đoạn.

tôi biết về vấn đề này ban đầu, nhưng tôi đã trì hoãn cố gắng nó, bởi vì các lỗi Gradle đầy đủ đề cập đến ba vấn đề:

  • mã phiên
  • tên phiên bản
  • API Maps chính

tất cả đều được tự động chèn. Tuy nhiên nó chỉ proferred tools:replace như là một gợi ý cho cuối cùng của những người, vì vậy tôi có ấn tượng rằng nó sẽ không hoạt động trên manifest thuộc tính. Trong thực tế nó có.

4

Tại sao nó cố gắng hợp nhất với tệp kê khai ban đầu, khi tôi đã chỉ định nó nên tìm ở nơi khác?

Bạn cho biết biểu hiện hương vị là ở nơi khác. Quá trình sáp nhập manifest kết hợp biểu hiện tất cả có liên quan:

  • main
  • xây dựng loại
  • hương vị sản phẩm (s)
  • thư viện

Các biểu hiện ở main luôn là có liên quan.

Và làm cách nào tôi có thể ngừng điều này?

Bạn không, rõ ràng là tệp kê khai trong main luôn có liên quan.

Giải pháp tốt nhất, nói chung, là để thoát khỏi versionCodeversionName từ tất cả biểu hiện, và đặt chúng trong build.gradle, nơi bạn có toàn quyền kiểm soát chương trình.

Giải pháp tốt nhất tiếp theo là di chuyển versionCodeversionName ra khỏi số main tệp kê khai thành hương vị sản phẩm mà bạn không hiển thị ở đây. Tôi chưa bao giờ thấy ai tạo ra một hương vị sản phẩm, vì AFAIK là vô nghĩa — bạn chỉ có thể xây dựng một hương vị sản phẩm đó (như AFAIK không có chút hương vị nào khi bạn giới thiệu hương vị). Hương vị sản phẩm thường có các nhóm 2+ (ví dụ: hương vị google sử dụng Dịch vụ của Play và hương vị standalone không có). Nếu các giá trị trong main thực sự cho hương vị không phải là AlternateFlavour, hãy di chuyển các công cụ mainversion... của bạn ở đó.

Ngoài ra, bạn có thể xem lại the documentation on the manifest merger process để xem bạn có thể đưa vào đúng chỉ thị để có được những gì bạn muốn hay không.

+0

Vì vậy, trước tiên, có vô số hương vị ở đây - tôi chỉ cố gắng giữ ví dụ đã cho đơn giản. Tôi không thể (AFAIK) loại bỏ các thuộc tính khỏi tệp kê khai ban đầu vì đó là tệp được sử dụng bởi triển khai IDE. Tuy nhiên tôi có thể có thể tạo ra một thứ ba, mà không có các thuộc tính, và có Gradle sử dụng theo mặc định. Có vẻ quá nhiều! –

+0

@RobPridham: "đó là cái được sử dụng bởi triển khai IDE" - nếu bạn đang sử dụng Android Studio, công cụ Phiên bản biến thể kiểm soát những gì được sử dụng bởi IDE. – CommonsWare

+0

Thật vậy. Không có được nêu ra không may - vẫn còn sử dụng Eclipse & ADT cho sự phát triển này, cho một loạt các lý do tốt (mặc dù ít tốt hơn theo thời gian). –

Các vấn đề liên quan