program story

매니페스트 파일이 다른 Android Studio 두 가지 버전

inputbox 2021. 1. 8. 08:11
반응형

매니페스트 파일이 다른 Android Studio 두 가지 버전


Android Studio에서 내 취향에 대해 두 가지 다른 매니페스트 파일을 정의하는 데 문제가 있습니다. 이것은 내 현재 프로젝트 구조입니다.

현재 프로젝트 구조

AndroidManifest.xml에서 free같은 맛 외모 :

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

AndroidManifest.xmlmain맛을 더 사용-권한이 없지만, 모든 맛간에 공유되는 매니페스트 나머지 코드가 포함되어 있습니다.

AndroidManifest.xml에서 pro같은 맛 외모 :

<?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은 다음과 같은 두 가지 맛을 정의합니다.

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'
    }
}

내가 기대하는 결과는 다른 맛이 다른 사용 권한을 정의한다는 것입니다. 그렇지 않다. 그 결과 현재 두 가지 맛 모두 프로 버전에 <uses-permission android:name="com.android.vending.CHECK_LICENSE" />정의 된 대로만 정의 됩니다 AndroidManifest.xml.

나는 시도했다 :

  • 깨끗한 프로젝트
  • 프로젝트 재 구축
  • Android Studio 다시 시작
  • 동기화 gradle

But without success. How am I to fix this? Any help is appreciated.

EDIT 1

I changed the location of each flavors AndroidManifest.xml file from each of the res folders to free and pro folder. The result of this:

  1. Pro flavor shows Licence permission as expected.
  2. Free flavor shows permissions from both AndroidManifest.xml files, License and network permissions (Should be only network)

This feels like an issue of project structure. What to make of this?

EDIT 2

I pulled the merge reports as Commonsware hinted, these are the reports regarding uses-permissions

Free:

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

Tech background:

on this link it explains the techniques and parameters that can be use for manifest merging: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-tools:node-markers

One in specific is the tools:node that points out how certain XML nodes on the manifest should behave whilst merging.

Solution:

to achieve some permisions in one and different in other manifest, add ALL permissions you need to the main and in the flavours manifest remove the ones you don't need, like the example below:

free remove the check license

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

Your problem is coming from a library, not your flavors. Specifically, qwknoteGIT:licencing-library is requesting CHECK_LICENSE.

If you are not using that library in all flavors, use a flavored compile statement (e.g., proCompile) to only use that library in that flavor.

모든 플레이버에 라이브러리를 사용하고 있지만 하나의 플레이버에서 권한이 필요하지 않다고 확신하는 경우, 여기에서 tools:node속성을 사용하여 플레이버의 매니페스트에서 라이브러리가 제공하는 권한을 차단할 수 있습니다.

그리고 합병 보고서는 당신의 친구입니다. :-)


이것은 적어도 문제를 해결해야합니다. 각 변형에 사용할 정확한 매니페스트를 지정하는 데 유용합니다. 건배! 각 변형 폴더 아래의 매니페스트 파일을 명시 적으로 지정합니다.

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

}

코드를 변경해야합니다.

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

에 대한:

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

앱 build.gradle의 sourceSets에서 매니페스트를 독점적으로 지정하십시오.

 android {
    productFlavors {
                bizdartFlavourNoCallLog {
            minSdkVersion 16
            applicationIdSuffix '.bizdart'
            targetSdkVersion 26
            dimension "tier"
            sourceSets {
                main {
                    manifest.srcFile "src/bizdartFlavourNoCallLog/AndroidManifest.xml"
                }
            }
            copy {
                from 'src/bizdartFlavourNoCallLog/'
                include '*.json'
                into '.'
                }
            }
       }
    }

참조 URL : https://stackoverflow.com/questions/28478110/android-studio-two-flavors-with-different-manifest-files

반응형