Android

build.gradle에 정의한 manifestPlaceholders 값 주입 받기

그란. 2022. 11. 5. 12:29

build.gradle.kts 에 정의한 manifestPlaceholders을 코틀린 파일에서도 사용할수 있도록 리팩토링 하기

 

 

manifest에서도 사용하고 코틀린 파일에서도 사용하는 빌드 변수가 있다.

 

카카오 로그인시 (KAKAO_APP_KEY)

 

1. 메니페스트에 명시

<data
    android:host="oauth"
    android:scheme="kakao${KAKAO_APP_KEY}" />

2. SDK 초기화 

KakaoSdk.init(this, "${KAKAO_APP_KEY}")

 

문제점

buildConfigField로 정의하면 코틀린에서만 사용가능하고 
manifestPlaceholders로 정의하면 manifest에서만 사용가능하다.

 

기존 방법 


manifestPlaceholders["KAKAO_APP_KEY"] = "aaaaaaaaaaaaa" 


<string name="kakao_app_key">aaaaaaaaaaaaa</string>

똑같은걸 2번 정의하여 사용하였다. ( string.xml, build.gradle ) 

 


 

리팩토링

manifestPlaceholders만 남기고 string.xml 에서는 제거 

 

manifestPlaceholders["KAKAO_APP_KEY"] = "aaaaaaaaaaaaa" 
<string name="kakao_app_key">aaaaaaaaaaaaa</string>

 

 

모델 생성

data class AppMetadata(
    val kakaoNativeAppKey: String,
) {
    companion object {
        const val KAKAO_NATIVE_APP_KEY = ".MyApplication.KakaoNativeAppKey"
    }
}

 

interface PackageProvider {
    fun getPackageMetadata(): AppMetadata
}

 

@Singleton
internal class PackageProviderImpl @Inject constructor(
    @ApplicationContext
    private val applicationContext: Context,
    private val packageManager: PackageManager
) : PackageProvider {
    private val packageName = applicationContext.packageName
    private lateinit var appMetaData: AppMetadata

    @BuildCompat.PrereleaseSdkCheck
    override fun getPackageMetadata(): AppMetadata {
        if (::appMetaData.isInitialized) {
            return appMetaData
        }

        val metadata = kotlin.run {
            if (BuildCompat.isAtLeastT())
                packageManager.getApplicationInfo(
                    packageName,
                    PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA.toLong())
                )
            else
                packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
        }.metaData

        appMetaData = AppMetadata(
            kakaoNativeAppKey = metadata.getString(
                AppMetadata.KAKAO_NATIVE_APP_KEY,
                ""
            )
        )
        
        return appMetaData
    }
}

( 패키지매니저로부터 메타데이터를 갖고오는 내용이다. 티라미수(33)부터 변경점이 있어 분기 처리 )

 

 

이렇게 하면 이후에 필요한 곳에서 인터페이스를 주입하여 사용하면 된다.  (당연히 manifest 에는 변수로써 사용하면 되고) 


internal class KakaoLoginProviderImpl @Inject constructor(
    @ApplicationContext
    private val applicationContext: Context,
    packageProvider: PackageProvider
){
	init{
            KakaoSdk.init(
                applicationContext,
                packageProvider.getPackageMetadata().kakaoNativeAppKey
            )
    } 
}