Công cụ: thay thế không thay thế trong bảng kê khai Android


147

Tôi đang sử dụng một dự án gradle với nhiều phụ thuộc thư viện khác nhau và sử dụng sáp nhập tệp kê khai mới. Trong <application />thẻ của tôi, tôi đã thiết lập nó như vậy:

<application tools:replace="android:icon, android:label, android:theme, android:name"
    android:name="com.example.myapp.MyApplcation"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/application_name"
    android:logo="@drawable/logo_ab"
    android:theme="@style/AppTheme"
    >
....
</application>

Tuy nhiên, tôi nhận được lỗi:

/android/MyApp/app/src/main/AndroidManifest.xml:29:9        Error:
Attribute application@icon value=(@drawable/ic_launcher) from AndroidManifest.xml:29:9
is also present at {Library Name} value=(@drawable/app_icon)
Suggestion: add 'tools:replace="android:icon"' to <application> element at AndroidManifest.xml:26:5 to override

/android/MyApp/app/src/main/AndroidManifest.xml:30:9 Error:
Attribute application@label value=(@string/application_name) from AndroidManifest.xml:30:9
is also present at {Library Name} value=(@string/app_name)
Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:26:5 to override

/android/MyApp/app/src/main/AndroidManifest.xml:27:9 Error:
Attribute application@name value=(com.example.myapp.MyApplication) from AndroidManifest.xml:27:9
is also present at {Another Library}

Suggestion: add 'tools:replace="android:name"' to <application> element at AndroidManifest.xml:26:5 to override

/android/MyApp/app/src/main/AndroidManifest.xml:32:9 Error:
Attribute application@theme value=(@style/AppTheme) from AndroidManifest.xml:32:9
is also present at {Library Name} value=(@style/AppTheme)
Suggestion: add 'tools:replace="android:theme"' to <application> element at AndroidManifest.xml:26:5 to override

1
Xem bài đăng này trong Meta về việc xóa và đăng lại câu hỏi: meta.stackoverflow.com/questions/265233/ . Làm điều này một lần sẽ không đặc biệt gây hại cho bạn, nhưng sẽ không tốt nếu bạn thực hành thường xuyên.
Scott Barta

1
Tôi đoán có <application>thẻ lặp đi lặp lại trong dự án. Xin đảm bảo chỉ có một <application>.
Panther

Có thể có nhiều thẻ <application> trong một dự án, đặc biệt nếu bạn sử dụng bất kỳ số lượng mô hình con thư viện nào.
agrosner

Tôi có ví dụ về trường hợp này hoạt động tốt. Phiên bản nào của công cụ xây dựng Android bạn đang sử dụng?
G. Blake Meike

bạn đã thêm xmlns: tools = " schemas.android.com/tools " trong thẻ kê khai chưa? tools.android.com/tech-docs/new-build-system/user-guide/iêng
TouchBoarder

Câu trả lời:


233

Khai báo tiêu đề tệp kê khai của bạn như thế này

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

Sau đó, bạn có thể thêm vào thẻ ứng dụng của mình thuộc tính sau:

<application
    tools:replace="icon, label" ../>

Ví dụ tôi cần thay thế biểu tượng và nhãn hiệu. Chúc may mắn!


1
Làm thế nào để bạn xử lý Android: tên với siêu dữ liệu? android: name = "com.orm.SugarApp"> <meta-data android: name = "DATABASE" android: value = "sv_logs.db" /> <meta-data android: name = "VERSION" android: value = " 3 "/> <meta-data android: name =" QUERY_LOG "android: value =" true "/> <meta-data android: name =" DOMAIN_PACKAGE_NAME "android: value =" com.example.app "/>
Alan

@Alan Chỉ cần thay thế toàn bộ thẻ siêu dữ liệu bằng tools:node="replace": <meta-data tools:node="replace" android:name="QUERY_LOG" android:value="true" />v.v.
Blacklight

25
Tôi bối rối. Đó không phải là chính xác những gì anh ấy làm trong câu hỏi của mình?
Jason Robinson

Tôi đã thêm vào tools:replacethẻ ứng dụng của mình nên thay thế nó và không phải là nguồn cần được thay thế. Vì vậy, bảng kê khai ứng dụng của tôi thay thế những gì được xác định trong thư viện của tôi. Bạn nói "những gì nên được thay thế" thay vì "những gì có thể được thay thế". Tôi hy vọng rằng làm sạch các câu hỏi.
WarrenFaith

1
Nếu thuộc tính được thay thế nằm trong thẻ kê khai, thẻ tools:replace="android:versionCode, android:versionName"phải nằm trong <manifest >thẻ.
Ivan Châu

42

Tôi đã sửa vấn đề tương tự. Giải pháp cho tôi:

  1. thêm xmlns:tools="http://schemas.android.com/tools"dòng trong thẻ kê khai
  2. thêm tools:replace=..vào thẻ kê khai
  3. di chuyển android:label=...trong thẻ kê khai

Thí dụ:

 <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
              tools:replace="allowBackup, label"
              android:allowBackup="false"
              android:label="@string/all_app_name"/>

1
Cảm ơn vì điều này, thêm nó <manifest>trực tiếp thay vì dưới <application>là điều duy nhất khắc phục vấn đề của tôi.
A. Sokol

1
Tôi không làm việc cho tôi, tôi nên đặt các công cụ: thay thế = "android: allowBackup, android: nhãn" cũng không chỉ các công cụ: thay thế = "allowBackup, nhãn".
jmarkstar

1
Bạn có chắc chắn điều này đang làm việc? Bởi vì đối với tôi, có vẻ như bạn đang viết allowBackup ở sai vị trí và sau khi hợp nhất, những gì Thư viện chỉ định trên bảng kê khai của anh ấy sẽ chiếm ưu thế. Bạn không có xung đột sau khi di chuyển nó lên trên, bởi vì bạn đang làm sai ( developer.android.com/guide/topics/manifest/iêu ) AllowBackup thuộc về phần tử Ứng dụng.
Reinherd

2
[... Tiếp tục từ trên] NÀY KHÔNG LÀM VIỆC. Bạn đang viết allowBackup ở sai vị trí và sau khi hợp nhất, những gì Thư viện đã chỉ định trên bảng kê khai của mình sẽ chiếm ưu thế. Bạn không có xung đột sau khi di chuyển nó lên trên, bởi vì bạn đang làm sai ( developer.android.com/guide/topics/manifest/iêu ) AllowBackup thuộc về phần tử Ứng dụng. Tôi đã kiểm tra nó bằng cách dịch ngược APK và bản kê khai cuối cùng có giá trị là TRUE thay vì FALSE như tôi đã chỉ định như bạn đề xuất
Reinherd

38

Hãy thử sắp xếp lại các phụ thuộc của bạn trong tệp gradle của bạn. Tôi đã phải chuyển thư viện vi phạm từ cuối danh sách lên đầu, và sau đó nó hoạt động.


xin vui lòng cho tôi biết một công cụ: thay thế tôi nên thêm thẻ ứng dụng bên trong bảng kê khai dự án của tôi hoặc thẻ ứng dụng bên trong thư viện của tôi xin vui lòng cho tôi biết nó sẽ thực sự hữu ích cho tôi ??
Bò tót Sudhanshu

@SudhanshuGaur Bạn chỉ cần thêm nó vào tệp AndroidManifest.xml trong dự án của bạn.
Kyle Liu

74
Nó đã làm việc. Nhưng những giải pháp như vậy có thể lấy đi niềm tin từ nhân loại.
Vinay Patil

8
#android gotchas như thế này khiến việc phát triển cho Android khá khó chịu
Taylor Halliday

1
Trong trường hợp bạn có nhiều hương vị sản phẩm như chơi và không chơi và phụ thuộc là "playReleaseCompile ______", chỉ cần di chuyển câu lệnh lên đầu có thể không hoạt động, bạn có thể phải thay đổi câu lệnh thành "biên dịch ______" và sau đó di chuyển nó sang hàng đầu. Nó nên hoạt động sau đó.
Soham

33

Tôi vừa trải qua hành vi tương tự tools:replace=...như mô tả của OP.

Hóa ra nguyên nhân gốc rễ tools:replacebị bỏ qua bởi sự hợp nhất của bảng kê khai là một lỗi được mô tả ở đây . Về cơ bản, điều đó có nghĩa là nếu bạn có một thư viện trong dự án chứa tệp kê khai có <application ...>nút chứa tools:ignore=...thuộc tính, thì có thể xảy ra rằng tools:replace=...thuộc tính trong tệp kê khai của mô-đun chính của bạn sẽ bị bỏ qua.

Điểm khó ở đây là nó có thể xảy ra, nhưng không phải như vậy. Trong trường hợp của tôi, tôi có hai thư viện, thư viện A với tools:ignore=...thuộc tính, thư viện B với các thuộc tính được thay thế trong các bảng kê khai tương ứng và tools:replace=...thuộc tính trong tệp kê khai của mô-đun chính. Nếu bảng kê khai của B được hợp nhất vào bảng kê khai chính trước khi bảng kê khai của A, mọi thứ sẽ hoạt động như mong đợi. Theo thứ tự ngược lại, lỗi xuất hiện.

Thứ tự mà những sự hợp nhất này xảy ra có vẻ hơi ngẫu nhiên. Trong trường hợp của tôi, việc thay đổi thứ tự trong phần phụ thuộc build.gradlekhông có tác dụng nhưng thay đổi tên của hương vị đã làm điều đó.

Vì vậy, cách giải quyết đáng tin cậy duy nhất dường như là giải nén thư viện gây ra sự cố, xóa tools:ignore=...thẻ (sẽ không có vấn đề gì vì đây chỉ là gợi ý cho lint) và đóng gói lại thư viện.

Và bỏ phiếu cho lỗi được sửa chữa, nguyên nhân.


Trong trường hợp của tôi, tôi đã phải xóa các công cụ: bỏ qua khỏi dự án của tôi, không phải từ một trong các thư viện
mohax

3
Đây cũng là vấn đề của tôi. Đã chuyển các công cụ: bỏ qua <manifest>nút từ <application>nút và nó đã hoạt động.
Jacob Tabak

Chỉ gặp phải vấn đề tương tự với Bazel v2.0.0 đã gửi một lỗi ở đây github.com/bazelbuild/bazel/issues/10543
Nick Korostelev

18

Giải pháp làm việc cuối cùng cho tôi (Đánh dấu các đoạn trong mã mẫu):

  1. thêm xmlns:toolsdòng trong thẻ kê khai
  2. thêm tools:replacevào thẻ ứng dụng

Thí dụ:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="pagination.yoga.com.tamiltv"
    **xmlns:tools="http://schemas.android.com/tools"**
    >

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        **tools:replace="android:icon,android:theme"**
        >

13

Phần còn thiếu đối với tôi là đây:

xmlns:tools="http://schemas.android.com/tools"

ví dụ:

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

Bạn có thể chia sẻ mã của mình chính xác như thế nào bạn có nó trong <tệp kê khai ...> không?
partizan

8

Bạn có thể thay thế những người trong thẻ ứng dụng Manifest của bạn:

<application
    tools:replace="android:icon, android:label, android:theme, android:name,android:allowBackup"
android:allowBackup="false"...>

và sẽ làm việc cho bạn.


Nó không hoạt động vì một số lý do .... Tôi cố gắng thêm tools:replace="android:label"vào ứng dụng nhưng nó không hoạt động
iKK

4

CỐ ĐỊNH ĐÃ L ERI CHÍNH XÁC, Chỉ cần thêm các công cụ này: thay thế = "android: icon, android: theme"

vào thẻ ứng dụng của bạn trong tệp kê khai của bạn, nó hoạt động tốt,


đó là điều bình thường. chủ đề về không phải là hành vi bình thường xảy ra trong một số trường hợp khi ngay cả các công cụ: thay thế được thêm vào.
David

4

Bạn có thể thay thế những người trong applicationthẻ Manifest của bạn :

<application
    ...
    tools:replace="android:label, android:icon, android:theme"/>

và sẽ làm việc cho bạn.

Giải trình

Sử dụng một thư viện / thư viện như vậy trong gradletệp của bạn có các nhãn đó trong thẻ ứng dụng của Manifest có thể gây ra vấn đề này và thay thế chúng trong Manifestgiải pháp của bạn .


1

Cách hack sau hoạt động:

  1. thêm xmlns:tools="http://schemas.android.com/tools"dòng trong thẻ kê khai
  2. thêm tools:replace="android:icon,android:theme,android:allowBackup,label" vào thẻ ứng dụng

1

Vấn đề của tôi là dự án nhiều mô-đun với mô-đun cơ sở, mô-đun ứng dụng và mô-đun tính năng. Mỗi mô-đun có AndroidManifest của riêng nó và tôi đã triển khai biến thể xây dựng để gỡ lỗi và chính. Vì vậy, chúng tôi phải chắc chắn rằng "android: name" vừa được khai báo trong Manifest của gỡ lỗi và chỉ chính, và không đặt nó trong bất kỳ Manifest nào trong mô-đun con. Vd: Bản kê khai chính:

 <application
        android:name=".App"/>

Biểu hiện trong gỡ lỗi:

<application
        tools:replace="android:name"
        android:name=".DebugApp"
        />

Không đặt "android: name" trong các tệp kê khai khác như thế này:

<application android:name=".App">

Chỉ cần xác định trong mô-đun tính năng như thế này và nó sẽ hợp nhất tốt

<application> 

0

Tôi đã nhận được một lỗi tương tự trên một dự án tôi đang nhập:

Nhiều mục có cùng khóa: android: icon = REPLACE và tools: icon = REPLACE

Đã sửa lỗi sau khi thay đổi dòng dưới đây trong thẻ ứng dụng:

tools:replace="icon, label, theme"

đến

tools:replace="android:icon, android:label, android:theme"

0

Tôi cũng đã trải qua vấn đề này và thay đổi rằng:

<application  android:debuggable="true" android:icon="@drawable/app_icon" android:label="@string/app_name" android:supportsRtl="true" android:allowBackup="false" android:fullBackupOnly="false" android:theme="@style/UnityThemeSelector">

đến

 <application tools:replace="android:allowBackup" android:debuggable="true" android:icon="@drawable/app_icon" android:label="@string/app_name" android:supportsRtl="true" android:allowBackup="false" android:fullBackupOnly="false" android:theme="@style/UnityThemeSelector">

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.