내 AndroidManifest.xml 파일에서 BuildConfig 값에 어떻게 액세스 할 수 있습니까?


137

AndroidManifest.xml에서 BuildConfig 값에 액세스 할 수 있습니까?

내 build.gradle 파일에는 다음이 있습니다.

defaultConfig {
    applicationId "com.compagny.product"
    minSdkVersion 16
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"

    // Facebook app id
    buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID
}

FACEBOOK_APP_ID gradle.properties 파일에 정의되어 있습니다.

# Facebook identifier (app ID)
FACEBOOK_APP_ID=XXXXXXXXXX

내 앱에서 Facebook 연결을 사용하려면 AndroidManifest.xml에 다음 행을 추가해야합니다.

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/applicationId"/> 

다음 과 같이 gradle에 정의 된 @string/applicationIdBuildConfig 필드 FACEBOOK_APP_ID로 바꾸고 싶습니다.

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="FACEBOOK_APP_ID"/> 

BuildConfig를 사용하여 가능합니까? 그렇지 않다면 어떻게해야합니까?

답변:


190

바꾸다

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

그런 다음 프로젝트다시 빌드하십시오 (Android Studio-> 빌드-> 프로젝트 다시 빌드).

두 명령은 프로젝트 빌드 중에 첫 번째 경우 Java 상수와 두 번째 경우 Android 자원으로 구성된 생성 된 값을 생성하지만 두 번째 방법은 구문을 string사용하여 액세스 할 수 있는 자원 값을 생성 @string/FACEBOOK_APP_ID합니다. 이는 매니페스트와 코드에서 모두 사용될 수 있음을 의미합니다.


1
이것은 내가 사용하는 정확한 코드이지만 문제가 있습니다. Facebook SDK는 어떤 이유로 문자열을 정수로 읽은 다음 Integer를 String으로 캐스팅 할 수 없기 때문에 ClassCastException을 발생시킵니다. 누구 든지이 문제에 직면 했습니까?
WKS

@WKS 생성 된 리소스 파일을 보면 리소스 유형이 예상 한 것과 일치합니까 (문자열)?
stkent

문자열 :<item name="facebook_app_id" type="string">15233522...</item>
WKS

13
resValue "문자열"을 작성하고 resValue "문자열"을 작성하지 않도록하십시오
keybee

1
부울 값을 사용하려면 "boolean"대신 resValue "bool"-> tanelikorri.com/tutorial/android/set-variables-in-build-gradle
reavcn을 입력하십시오

85

AndroidManifest.xml에서 Gradle Build Config 값에 액세스하는 다른 방법은 다음과 같은 자리 표시자를 사용하는 것입니다.

android {
    defaultConfig {
        manifestPlaceholders = [ facebookAppId:"someId..."]
    }
    productFlavors {
        flavor1 {
        }
        flavor2 {
            manifestPlaceholders = [ facebookAppId:"anotherId..." ]
        }
    }
}

그리고 당신의 매니페스트에서 :

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${facebookAppId}"/> 

자세한 내용은 여기를 참조하십시오 : https://developer.android.com/studio/build/manifest-build-variables.html

(참조를 위해 이전 링크 : http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger )


2
이것은 훌륭한 솔루션입니다.
BinaryShrub

2
네, 이것은 매니페스트 전용 문자열 주입에 좋은 방법입니다!
stkent

2
Java의 manifestPlaceholders에서 어떻게 가치를 얻습니까? 이것은 자바 코드와 매니페스트 모두에서 사용되는 상수에 유용합니다.
Louis CAD

@LouisCAD 빌드 파일에서 변수를 정의한 다음이를 사용하여 자리 표시 자와 BuildConfig 필드를 정의하여 코드에서 사용할 수 있다고 가정합니다.
GregoryK

1
@LouisCAD 나는 그것을 시도하지 않았지만 다음을 시도 할 수 있습니다 : var placeholder = '귀하의 자리 표시 자'(새 줄) buildConfigField "String", "PLACEHOLDER_NAME", 자리 표시 자 (새 줄) manifestPlaceholders = [placeholderName : placholder] (new line) 그것이 당신을 위해 작동하는지 알고 기뻐할 것입니다
GregoryK

40

참고 : resValue값 을 사용 하면 문자열 리소스 파일이 실수로 재정의 할 수 있습니다 (예 : 다른 언어)

당신이 매니페스트와 자바 코드에서 사용할 수있는 진정한 상수 값을 얻으려면, 모두 사용 manifestPlaceholdersbuildConfigField: 예를

android {
    defaultConfig {
        def addConstant = {constantName, constantValue ->
            manifestPlaceholders += [ (constantName):constantValue]
            buildConfigField "String", "${constantName}", "\"${constantValue}\""
        }

        addConstant("FACEBOOK_APP_ID", "xxxxx")
    }

매니페스트 파일에서 액세스 :

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${FACEBOOK_APP_ID}"/>

자바에서 :

BuildConfig.FACEBOOK_APP_ID

상수 값이 빌드 유형에 따라 달라야하는 경우 도우미 addConstant를 조정해야합니다 (예 : Groovy Closure 시맨틱으로 작업하기 위해).

buildTypes {
    def addConstantTo = {target, constantName, constantValue ->
        target.manifestPlaceholders += [ (constantName):constantValue]
        target.buildConfigField "String", "${constantName}", "\"${constantValue}\""
    }
    debug {
        addConstantTo(owner,"FACEBOOK_APP_ID", "xxxxx-debug")
    }
    release {
        addConstantTo(owner,"FACEBOOK_APP_ID", "xxxxx-release")
    }

1
작동하지 않음 매니페스트에서 유효하지 않은 앱 ID를 표시하지만 Java에서 설정하면 작동합니다
Brajendra Pandey

상수를 두 개 이상 추가하려고하면 이것이 작동하지 않는다고 생각합니다!
Greg Ennis

1
@GregEnnis 또한 더 많은 상수가 잘 작동합니다. 예를 들어 addConstant()두 번만 호출합니다 ( constantNames물론 다릅니다 ). 어떤 오류가 발생합니까?
TmTron

1
@TmTron은 오류가 발생하지 않지만 호출 될 때마다 전체 'manifestPlaceholders'배열을 다시 할당하고 마지막으로 사용한 값만 저장합니다.
Greg Ennis

@GregEnnis 당신은 절대적으로 가까이 있습니다! 테스트 프로젝트에서 다른 코드를 사용했습니다. 나는 이미 내 대답을 업데이트했습니다 : 우리 +=는 다음과 같은 연산자 를 사용해야합니다manifestPlaceholders += [...]
TmTron

6

다음 예제와 같이 매니페스트의 build.gradle 속성에 액세스하십시오.

예를 들어 build.gradle에 "applicationId"속성이 있고 AndroidManifest에서이 속성에 액세스하려고합니다.

여기에 이미지 설명을 입력하십시오

AndroidManifest에서 "applicationId"에 액세스하십시오.

<receiver
        android:name="com.google.android.gms.gcm.GcmReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>

마찬가지로 다른 상수에 대한 문자열 리소스를 만들고 코드 파일에서 다음과 같이 간단하게 액세스 할 수 있습니다.

context.getString(R.string.GCM_SENDER_ID);

상점 비밀번호와 모두를 저장할 .properties 파일에서 facebookAppId : "anotherId ..."를 정의 할 수 있습니까? 그런 다음 AndroidManifest.xml에서 간접적으로 액세스 할 매니페스트 자리 표시 자에 액세스합니다. 내가 할 수 있습니까?
Aman Verma

3

@stkent는 좋지만 나중에 프로젝트를 다시 빌드해야한다는 것을 잊어 버립니다.

바꾸다

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

그때

Android Studio -> Build -> Rebuild Project

이것은 안드로이드가 문자열 리소스를 통해 액세스 할 수있게합니다.

R.string.FACEBOOK_APP_ID

ProductFlavor_ ...에 대한 알 수없는 특성 'FACEBOOK_APP_ID'를 가져올 수 없습니다.
f.trajkovski

2

다른 옵션 : 다른 문자열 리소스 파일을 사용하여 모든 Flavor 종속 값을 바꾸십시오.

1 단계 : "src"폴더에 플레이버 이름으로 새 폴더를 만듭니다 (내 경우 "stage").

2 단계 : 특징에 의존하는 모든 파일에 대한 자원 파일 작성

여기에 이미지 설명을 입력하십시오

3 단계 : 다른 아이콘도 사용하므로 밉맵 폴더도 볼 수 있습니다. 이 질문에는 "strings.xml"만 중요합니다. 이제 모든 중요한 문자열 리소스를 덮어 쓸 수 있습니다. 재정의하려는 항목 만 포함하면됩니다. 다른 모든 항목은 기본 "strings.xml"에서 사용되며 다음과 같이 Android Studio에 표시됩니다.

여기에 이미지 설명을 입력하십시오

4 단계 : 프로젝트에서 문자열 리소스를 사용하고 긴장을 푸십시오.

여기에 이미지 설명을 입력하십시오


좋은 대안, 특히 다른 문자열이 많을 경우 변수별로 설정해야합니다.
stkent

상점 비밀번호와 모두를 저장할 .properties 파일에서 facebookAppId : "anotherId ..."를 정의 할 수 있습니까? 그런 다음 AndroidManifest.xml에서 간접적으로 액세스 할 매니페스트 자리 표시 자에 액세스합니다. 내가 할 수 있습니까?
Aman Verma

0

아래와 같이 긴 값을 사용할 수 있습니다

buildConfigField 'long', 'FLAVOR_LONG', '11500L'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.