Sửa lỗi INSTALL_FAILED_CONFLICTING_PROVIDER Khi Cài Ứng Dụng Android

intermediate📱 Android2026-07-22| Android (API 21+), ADB, Android Studio, Gradle build system

Error Message

Installation did not succeed. The application could not be installed: INSTALL_FAILED_CONFLICTING_PROVIDER
#android#manifest#content-provider#installation

Tình huống gặp phải

Bạn nhấn nút run trong Android Studio — hoặc chạy lệnh adb install — và thiết bị trả về thông báo sau:

Installation did not succeed.
The application could not be installed: INSTALL_FAILED_CONFLICTING_PROVIDER

Không có stack trace. Không có gợi ý về nguyên nhân xung đột. Quá trình cài đặt đơn giản là thất bại.

Điều đang xảy ra: một ứng dụng khác đã được cài đặt trên thiết bị và đang chiếm dụng cùng một chuỗi authority của ContentProvider. Android xem authority của provider như một định danh duy nhất — toàn cục, trên mọi ứng dụng trong thiết bị. Hai ứng dụng không thể dùng chung một authority. Hệ thống từ chối ngay lập tức khi phát hiện trùng lặp.

Phân tích nguyên nhân gốc rễ

Mở AndroidManifest.xml và tìm thẻ <provider> bất kỳ:

<!-- Thủ phạm phổ biến: FileProvider với authority bị hardcode -->
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="com.example.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    ...
</provider>

Thấy chuỗi authority bị hardcode đó chưa? Đó chính là vấn đề. Mọi build variant — debug, release, mọi flavor — đều khai báo cùng một authority giống nhau. Cài bản debug lên thiết bị đang có bản release, và Android sẽ chặn ngay lập tức.

Thư viện bên thứ ba cũng là thủ phạm phổ biến khác. Một thư viện đi kèm ContentProvider riêng với authority hardcode sẽ gây xung đột trên mọi ứng dụng trong portfolio của bạn có tích hợp nó. Chỉ một ứng dụng có thể tồn tại trên thiết bị tại một thời điểm.

Tìm authority đang xung đột

Kiểm tra những gì ứng dụng đang cài đặt đã đăng ký:

adb shell dumpsys package | grep -A2 "com.example"

Hoặc kiểm tra manifest đã merge từ lần build gần nhất:

# Sau khi chạy ./gradlew assembleDebug
cat app/build/intermediates/merged_manifests/debug/AndroidManifest.xml | grep -A5 "provider"

Cách xử lý nhanh — Gỡ cài đặt ứng dụng đang xung đột

Cần chạy ứng dụng ngay bây giờ? Gỡ cài đặt ứng dụng đang chặn:

# Xoá ứng dụng đang giữ authority xung đột
adb uninstall com.your.package.name

# Sau đó cài APK mới
adb install app-debug.apk

Từ Android Studio, vào phần cài đặt ứng dụng trên thiết bị, gỡ cài đặt thủ công, rồi chạy lại. Cách này hoạt động được. Nhưng đây chỉ là giải pháp tạm thời — ngay khi bạn cài lại một trong hai phiên bản, vấn đề sẽ quay trở lại.

Cách xử lý triệt để — Đặt authority duy nhất

Cách 1: Dùng applicationId (Khuyên dùng)

Thay chuỗi hardcode bằng ${applicationId}:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

Vì mỗi ứng dụng có package name duy nhất, xung đột sẽ không bao giờ xảy ra. Bản debug sẽ dùng com.example.app.debug.fileprovider. Bản release dùng com.example.app.fileprovider. Không bao giờ trùng nhau.

Cập nhật code Java/Kotlin cho phù hợp:

// Trước — hardcode, gây lỗi khi có nhiều build variant
Uri fileUri = FileProvider.getUriForFile(
    context,
    "com.example.fileprovider",
    file
);

// Sau — động, luôn luôn đúng
Uri fileUri = FileProvider.getUriForFile(
    context,
    context.getPackageName() + ".fileprovider",
    file
);

Cách 2: Ghi đè authority hardcode của thư viện

Không thể sửa source của thư viện? Ghi đè nó trong manifest bằng tools:replace:

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

    <application>
        <provider
            android:name="com.thirdparty.library.SomeProvider"
            android:authorities="${applicationId}.someprovider"
            android:exported="false"
            tools:replace="android:authorities" />
    </application>
</manifest>

Thuộc tính tools:replace="android:authorities" báo cho manifest merger biết phải dùng giá trị của bạn, bỏ qua giá trị mà thư viện cung cấp. Hoạt động tốt với mọi dependency chỉ đọc có authority được nhúng cứng.

Cách 3: applicationIdSuffix cho nhiều build variant

Chạy song song các bản QA, staging và production trên cùng một thiết bị? Đặt package name riêng biệt cho từng bản ngay ở cấp độ Gradle:

// build.gradle (app)
android {
    buildTypes {
        debug {
            applicationIdSuffix ".debug"   // → com.example.app.debug
        }
        staging {
            applicationIdSuffix ".staging" // → com.example.app.staging
        }
        release {
            // không có suffix → com.example.app
        }
    }
}

Kết hợp với authority ${applicationId} trong manifest. Mỗi variant sẽ có một authority hoàn toàn duy nhất, tự động, không cần làm thêm bước nào.

Xác minh sau khi sửa

Trước khi cài đặt, kiểm tra manifest đã merge để xác nhận authority đã được phân giải đúng:

./gradlew processDebugManifest
grep -n "authorities" app/build/intermediates/merged_manifests/debug/AndroidManifest.xml

Bạn cần thấy package name đầy đủ đã được nhúng vào:

android:authorities="com.example.app.debug.fileprovider"

Sau đó cài đặt và chờ thông báo thành công:

adb install -r app/build/outputs/apk/debug/app-debug.apk
# Performing Streamed Install
# Success

Kiểm tra lại trực tiếp trên thiết bị:

adb shell dumpsys package com.example.app.debug | grep -A3 "Provider"

Nếu vẫn chưa giải quyết được

Đôi khi ứng dụng đang xung đột không dễ nhận ra — một ứng dụng hệ thống hoặc một dự án khác trong portfolio của bạn có thể đang giữ cùng authority đó. Hãy liệt kê toàn bộ provider đã đăng ký trên thiết bị và tìm kiếm theo từ khoá:

adb shell dumpsys package providers | grep "fileprovider"

Kết quả đó sẽ cho bạn biết chính xác package nào đang sở hữu authority. Gỡ cài đặt package đó, áp dụng cách xử lý triệt để, và vấn đề sẽ được giải quyết.

Related Error Notes