2015-02-12 18 views
41

Tôi gặp sự cố với việc xác định hai tệp kê khai khác nhau cho hương vị của mình trong Android Studio. Đây là cấu trúc dự án hiện tại của tôi:Android Studio hai hương vị với các tệp kê khai khác nhau

Current project structure

Các AndroidManifest.xml trong hương vị free trông như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="se.example.package"> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
</manifest> 

Các AndroidManifest.xml trong hương vị main không có người sử dụng-quyền, nhưng chứa phần còn lại của mã kê khai được chia sẻ giữa tất cả các hương vị.

Các AndroidManifest.xml trong hương vị pro trông như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="se.example.package"> 
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" /> 
</manifest> 

build.gradle định nghĩa hai hương vị như

productFlavors { 
    free { 
     applicationId 'se.example.package.free' 
     minSdkVersion 14 
     targetSdkVersion 21 
     versionCode 1 
     versionName '1.0' 
    } 
    pro { 
     minSdkVersion 14 
     applicationId 'se.example.package.pro' 
     targetSdkVersion 21 
     versionCode 2 
     versionName '1.1' 
    } 
} 

Kết quả mà tôi đang mong đợi là các hương vị khác nhau định nghĩa sử dụng khác nhau -quyền. Đây không phải là trường hợp. Kết quả hiện tại là cả hai hương vị chỉ xác định <uses-permission android:name="com.android.vending.CHECK_LICENSE" /> như được định nghĩa trong AndroidManifest.xml trong hương vị chuyên nghiệp.

Tôi đã thử:

  • sạch dự án
  • Rebuild dự án
  • Restart Android Studio
  • Sync gradle

Nhưng không thành công. Tôi làm cách nào để sửa lỗi này? Bất kỳ trợ giúp được đánh giá cao.

EDIT 1

Tôi đã thay đổi vị trí của từng hương vị AndroidManifest.xml tập tin từ mỗi res thư mục để freepro thư mục. Kết quả của việc này:

  1. Hương vị chuyên nghiệp cho thấy giấy phép được cho phép như mong đợi.
  2. hương vị miễn phí cho phép từ hai AndroidManifest.xml file, Giấy phép và quyền truy cập mạng (Nên chỉ mạng)

này cảm thấy như một vấn đề về cấu trúc của dự án. Phải làm gì với điều này?

EDIT 2

Tôi kéo các báo cáo hợp nhất như Commonsware gợi ý, đó là những báo cáo liên quan đến uses-permissions

miễn phí:

uses-permission#com.android.vending.CHECK_LICENSE 
ADDED from qwknoteGIT:licencing-library:unspecified:26:5 
    android:name 
     ADDED from qwknoteGIT:licencing-library:unspecified:26:22 

Pro:

uses-permission#com.android.vending.CHECK_LICENSE 
MERGED from qwknoteGIT:licencing-library:unspecified:26:5 
+0

Tôi không chắc chắn chính xác mà bạn phải sử dụng (thou đó là một nhận xét, không phải là một câu trả lời) , nhưng bạn có thể có được những gì bạn muốn bằng cách sử dụng một số khai báo 'tools: node' http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC- công cụ: nút đánh dấu – Budius

+0

"Kết quả hiện tại là cả hai hương vị chỉ def ines như được định nghĩa trong AndroidManifest.xml theo kiểu chuyên nghiệp. "- bạn đã xác định điều này như thế nào? – CommonsWare

+0

@CommonsWare Tôi đã cài đặt cả hai tính năng trên HTC one x và khi tôi kiểm tra quyền đối với mỗi người, cả hai đều nói "Kiểm soát giấy phép cho Google Play" (Được dịch từ điện thoại của tôi bằng ngôn ngữ Thụy Điển, có thể không được dịch chính xác Anh). Không ai trong số họ tuyên bố quyền truy cập internet. – Marcus

Trả lời

43

Tech nền:

vào liên kết này nó giải thích các kỹ thuật và các thông số có thể được sử dụng cho việc sáp nhập manifest: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-tools:node-markers

Một trong cụ thể là tools:node trỏ ra cách nào đó XML nút trên manifest nên cư xử trong khi hợp nhất.

Giải pháp:

để đạt được một số permisions trong một và khác nhau trong biểu hiện khác, thêm ALL cấp phép mà bạn cần đến main và trong hương vị Manifest loại bỏ những người bạn không cần, như ví dụ dưới đây :

free loại bỏ các giấy phép kiểm tra

<uses-permission 
    android:name="com.android.vending.CHECK_LICENSE" 
    tools:node="remove"/> 
+10

Chỉ một câu hỏi, thay vì thêm nó vào tệp kê khai chính và xóa nó khỏi phiên bản "miễn phí", tại sao chúng ta không thể thêm 'android: name =" com.android.vending.CHECK_LICENSE "' vào một phiên bản "pro" đơn manifest – Rajkiran

+0

@Budius Tôi đoán đã đến lúc thay đổi * permsision * thành * use-permission * –

18

vấn đề của bạn là đến từ một thư viện, không hương vị của bạn. Cụ thể, qwknoteGIT:licencing-library đang yêu cầu CHECK_LICENSE.

Nếu bạn không sử dụng thư viện đó trong tất cả các hương vị, hãy sử dụng câu lệnh có hương vị compile (ví dụ: proCompile) để chỉ sử dụng thư viện đó ở hương vị đó.

Nếu bạn đang sử dụng thư viện cho tất cả các hương vị, nhưng cảm thấy tự tin rằng bạn không cần sự cho phép trong một hương vị, đó là một thuộc tính tools:node có thể được sử dụng, thư viện.

Và báo cáo hợp nhất tệp kê khai là bạn của bạn. :-)

+0

Cảm ơn rất nhiều vì nỗ lực của bạn, mặc dù tôi không thể chấp nhận hai câu trả lời, bạn cung cấp giải thích tốt và giải pháp làm việc. +1 – Marcus

1

Điều này sẽ giải quyết được vấn đề, ít nhất. Tôi thấy hữu ích khi chỉ định tệp kê khai chính xác để sử dụng cho mỗi biến thể. Chúc mừng! Nó rõ ràng hướng đến tệp kê khai trong mỗi thư mục biến thể.

android { 
     productFlavors { 
     prod { 
      manifest.srcFile "prod/AndroidManifest.xml" 
     } 
     dev { 
      manifest.srcFile "dev/AndroidManifest.xml" 
     } 
     } 
     ... 

} 
+2

Không cần phải chỉ định đường dẫn của tệp 'AndroidManifest.xml', chính gradle sẽ lấy chúng từ thư mục hương vị trừ khi bạn thay đổi đường dẫn mặc định của chúng (tôi không khuyên bạn nên sử dụng). – GoRoS

+3

Tuy nhiên, hữu ích khi vẫn có bố cục kiểu dự án maven –

1

Bạn nên thay đổi mã của bạn:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="se.example.package"> 

cho:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    package="com.your.appid"> 
Các vấn đề liên quan