FCM 푸시설정

개발/Android 2024. 10. 14. 15:21
반응형

다음은 FCM 푸시 설정관련 내용을 알아보겠다.

Firebase 앱등록은 이미 완료됬다고 가정하겠다.

 

만약 아래 그림과 같이 'Product Flavors' 설정을 하지 않았다면 1번 위치에

설정을 하였다면 2번과 같이 'google-services.json'파일 복사한다.

 

프로젝트 수준 build.gradle :

 

모듈 수준 build.gradle :

 

AndroidManifest.xml에 알림 권한 추가:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

 

권한 요청 코드 (MainActivity 등에서):

안드로이드 13(API 33) 이상에서는 알림 권한이 필요하다. 

import android.Manifest
import android.content.pm.PackageManager
import androidx.core.content.ContextCompat
import androidx.core.app.ActivityCompat
import android.os.Build

class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 푸시 알림 권한 요청
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            if (ContextCompat.checkSelfPermission(
                    this,
                    Manifest.permission.POST_NOTIFICATIONS
                ) != PackageManager.PERMISSION_GRANTED
            ) {
                // 알림 권한 요청
                ActivityCompat.requestPermissions(
                    this,
                    arrayOf(Manifest.permission.POST_NOTIFICATIONS),
                    1000
                )
            }
        }

        // 그 외 FCM 설정
    }
}

 

FCM 토큰 생성 및 토큰 로그 확인

Firebase에서 푸시 메시지를 보내기 위해서는 FCM 토큰이 필요하다. 이 토큰은 앱 설치 시 자동으로 생성되며, 이를 통해 Firebase는 해당 기기에 푸시 메시지를 전송할 수 있다.

FCM 서비스 초기화 (FirebaseMessagingService 상속):

아래 코드와 같이 FirebaseMessagingService를 상속받아 FCM 토큰을 얻을 수 있다.

import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.FirebaseMessaging
import com.google.firebase.messaging.RemoteMessage
import android.util.Log

class MyFirebaseMessagingService : FirebaseMessagingService() {
	
    override fun onNewToken(token: String) {
        super.onNewToken(token)
        Log.d("FCM", "FCM 토큰 생성: $token")
        // 서버로 토큰 전송
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        super.onMessageReceived(remoteMessage)
        Log.d("FCM", "푸시 메시지 수신: ${remoteMessage.notification?.body}")
        // 알림을 처리하거나 사용자에게 알림을 표시
    }
}

 

Firebase 토큰을 가져오는 코드 (선택적, 로그 확인용):

이미 생성된 토큰을 얻는다.

FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val token = task.result
        Log.d("FCM", "FCM 토큰: $token")
    } else {
        Log.w("FCM", "FCM 토큰 생성 실패", task.exception)
    }
}

 

푸시 수신 처리

푸시 알림이 수신되면, onMessageReceived 메서드에서 이를 처리한다. FCM 서버에서 전송된 메시지의 내용을 바탕으로 푸시 알림을 처리하고, 알림을 기기에 표시할 수 있다.

알림 표시 예제 (푸시 수신 시):

import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    super.onMessageReceived(remoteMessage)

    // 메시지의 제목과 본문을 가져옴
    val title = remoteMessage.notification?.title ?: "푸시 알림"
    val message = remoteMessage.notification?.body ?: "새로운 메시지가 있습니다."

    // Android 8.0 이상에서는 알림 채널이 필요
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channelId = "default_channel"
        val channelName = "기본 알림 채널"
        val importance = NotificationManager.IMPORTANCE_DEFAULT
        val notificationChannel = NotificationChannel(channelId, channelName, importance)
        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(notificationChannel)
    }

    // 알림 생성
    val notificationBuilder = NotificationCompat.Builder(this, "default_channel")
        .setSmallIcon(android.R.drawable.ic_dialog_info)  // 알림 아이콘 설정
        .setContentTitle(title)
        .setContentText(message)
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)

    // 알림 표시
    with(NotificationManagerCompat.from(this)) {
        notify(0, notificationBuilder.build())
    }
}

 

 

반응형
블로그 이미지

SKY STORY

,
반응형

디버그 서명 인증서 Android 앱을 개발하고 테스트할 때 사용됩니다. Android 앱은 개발 중일 때와 실제 배포 시에 서명되어야 하는데, 이 두 경우에 각각 다른 인증서를 사용합니다. 디버그 서명 인증서는 앱이 아직 개발 중일 때, 주로 디버깅 테스트를 위해 사용된다.

 

디버그 서명 인증서와 릴리스 서명 인증서의 차이

용도 개발 및 테스트용 실제 배포용
생성 방법 Android Studio에서 자동 생성 개발자가 직접 생성
키스토어 위치 ~/.android/debug.keystore 개발자가 지정한 경로 (예: my-release-key.jks)
비밀번호 기본값: android 개발자가 설정한 비밀번호
서명 목적 테스트 기기에서 설치 및 실행 Google Play 스토어 또는 외부 배포
유효 기간 30년 개발자가 설정한 기간 (일반적으로 25년 이상)
보안 수준 낮음 (자동 생성된 인증서) 높음 (개발자가 관리하는 인증서)
사용 시점 개발 중, Firebase와 같은 기능 테스트 시 앱 배포 시 (Google Play 스토어 또는 외부 배포)

 

 

반응형
블로그 이미지

SKY STORY

,
반응형

디버그 서명 인증서 Android 앱을 개발하고 테스트할 때 사용된다. Android 앱은 개발 중일 때와 실제 배포 시에 서명되어야 하는데, 이 두 경우에 각각 다른 인증서를 사용한다. 디버그 서명 인증서는 앱이 아직 개발 중일 때, 주로 디버깅 테스트를 위해 사용된다.

Firebase 설정에서 디버그 서명 인증서 사용은 Firebase Authentication 또는 Firebase Cloud Messaging(FCM)과 같은 기능을 테스트할 때, 디버그 서명 인증서의 SHA-1 해시 값이 필요하다. 이는 Firebase가 디버그 빌드에서도 Firebase 기능을 사용할 수 있도록 앱을 식별하기 위해 사용된다.

 

Android 앱에 Firebase를 추가할 때, 디버그 서명 인증서의 SHA-1 정보를 등록하는 방법을 알아보자.

https://console.firebase.google.com/

 

디버그 서명 인증서 SHA-1 정보 확인하기

Android Studio를 사용하여 SHA-1 해시 값을 확인할 수 있는 방법이 두 가지 있다.


방법 1: Android Studio를 통해 SHA-1 값 확인

  1. Android Studio에서 Gradle 창을 연다.
    • 화면 우측의 Gradle 탭을 클릭. (보이지 않으면 View > Tool Windows > Gradle)
  2. Gradle Tasks 실행:
    • 프로젝트 이름을 선택한 후, Tasks > android > signingReport를 더블 클릭.
  3. SHA-1 값 확인:
    • signingReport를 실행하면 디버그 및 릴리스 키의 SHA-1  SHA-256 해시 값이 Android Studio의 Run 창에 출력된다.
    • 아래와 같은 내용 출력:
      Variant: debug 
      Config: debug 
      Store: /Users/username/.android/debug.keystore 
      Alias: AndroidDebugKey 
      MD5: A1:B2:C3:... 
      SHA1: AA:BB:CC:DD:... 
      SHA-256: AB:CD:...
  4. SHA-1 값 복사:
    • 여기서 SHA-1 값을 복사하여 Firebase 콘솔에 입력한다.

 

방법 2: 명령어로 디버그 서명 인증서 SHA-1 확인 (keytool 사용)

  1. 명령어 실행:
    • 명령어를 통해 SHA-1 값을 확인 가능하다.
    • macOS 또는 Linux에서는 터미널, Windows에서는 명령 프롬프트 사용.
    keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
     
  2. SHA-1 값 출력 확인:
    • 위 명령어를 실행하면 SHA-1 해시 값이 표시.
    SHA1: AA:BB:CC:DD:...
  3. SHA-1 값 복사:
    • SHA-1 값을 복사하여 Firebase 콘솔에 입력.

 

2:45:52 PM: Executing 'signingReport'...

Executing tasks: [signingReport] in project /Users/netcanis/projects4/TestWebview


> Task :app:signingReport
Variant: debug
Config: debug
Store: /Users/netcanis/.android/debug.keystore
Alias: AndroidDebugKey
MD5: B7:BA:15:3A:B7:E3:20:0A:5D:FE:9A:8C:21:6B:46:79
SHA1: 5D:D7:6C:1E:55:2E:20:59:15:23:81:43:F2:4D:BF:86:C7:E7:DF:2D
SHA-256: B2:A0:3A:51:2E:79:58:00:7B:C3:5A:84:F3:3B:C9:C0:75:08:94:F2:73:7C:33:6D:C6:D2:74:16:15:42:B8:BE
Valid until: Friday, June 6, 2053
----------
Variant: release
Config: null
Store: null
Alias: null
----------
Variant: debugAndroidTest
Config: debug
Store: /Users/netcanis/.android/debug.keystore
Alias: AndroidDebugKey
MD5: B7:BA:15:3A:B7:E3:20:0A:5D:FE:9A:8C:21:6B:46:79
SHA1: 5D:D7:6C:1E:55:2E:20:59:15:23:81:43:F2:4D:BF:86:C7:E7:DF:2D
SHA-256: B2:A0:3A:51:2E:79:58:00:7B:C3:5A:84:F3:3B:C9:C0:75:08:94:F2:73:7C:33:6D:C6:D2:74:16:15:42:B8:BE
Valid until: Friday, June 6, 2053
----------

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

Build Analyzer results available
2:45:53 PM: Execution finished 'signingReport'.

 

 

 

 

반응형
블로그 이미지

SKY STORY

,
반응형

Android Studio 앱서명 설정

Android Studio 열기: 프로젝트를 열고, 메뉴 바에서 Build → Generate Signed Bundle / APK...를 클릭.

 

Signed Bundle or APK 선택:

  • Android App Bundle(권장) 또는 APK 중 하나를 선택한다. Google Play 배포 시에는 App Bundle을 선택하는 것이 좋다.
  • APK 수동으로 배포할 경우에는 APK 선택할 있다.

 

키스토어 설정 화면:

  • **Create new...**을 클릭하여 새 키스토어 파일을 생성.

 

키스토어 파일 경로 설정:

  • /app폴더 아래 keystore폴더 생성후 읽기/쓰기 권한 설정)
  • Key store path: 키스토어 파일을 저장할 위치 지정.
    ex) /Users/netcanis/projects4/TestWebview/app/keystore/testwebview-release-key.jks
  • Password : keystone 비번입력.
  • Alias :  alias별칭을 입력. ex) testwebview-release-key-alias
  • Password : alias 비번 입력.

사용자 정보 입력:

  • First and Last Name: 개발자 이름을 입력.
  • Organization Unit: 부서 또는 팀 이름을 입력. (예: Engineering)
  • Organization: 회사 이름을 입력.
  • City or Locality: 도시 이름을 입력.
  • State or Province: 주 또는 도 이름을 입력.
  • Country Code (XX):  자리 국가 코드를 입력. (예: KR)

 

Release 선택하고 Create 버튼 클릭

 

생성된 keystore 파일 확인

 

 


 

 

서명된 APK파일 생성

Android Studio 열기: 프로젝트를 열고, 메뉴 바에서 Build → Generate Signed Bundle / APK... 클릭

 

APK 선택

 

keystore 비밀번호 Key alias 비밀번호를 입력

 

‘Remember passwords’ 체크하고 ‘Next’버튼 클릭

 

Release 선택하고 Create 버튼 클릭

 

생성된 APK파일 확인

 

 

 

반응형
블로그 이미지

SKY STORY

,
반응형

Android Gradle Plugin (AGP) 8.0 이상에서는 여러 가지 변화와 최적화가 이루어졌다. 이를 통해 성능 개선과 더불어 최신 Android SDK 및 Gradle 기능들을 더 잘 지원하게 되었다. Target SDK 34와 호환되며, 최적화되어 있다. Jetpack 및 라이브러리 호환성이 뛰어나며, 최신 Gradle 버전과 통합을 통해 Build 성능이 최적화 되었다. 아래는 AGP 8.0 이상에서 주목해야 할 주요 변경 사항들을 정리해 보았다.

 

1. compileSdkVersion  targetSdkVersion 변경

  • 이전: compileSdkVersion과 targetSdkVersion을 사용하여 SDK 버전을 설정.
  • AGP 8.0 이상: compileSdk와 targetSdk로 변경되었다.
android {
    compileSdk = 34
    targetSdk = 34 
}

 

2. minSdkVersion 변경

  • 이전: minSdkVersion을 사용하여 최소 SDK 버전을 설정.
  • AGP 8.0 이상: minSdk로 변경되었다.
android {
    minSdk = 21
}

 

3. buildToolsVersion 자동 관리

  • 이전: buildToolsVersion을 명시적으로 설정.
  • AGP 8.0 이상: Gradle이 자동으로 적절한 buildTools 버전을 선택하므로 buildToolsVersion을 삭제해도 된다.

 

4. tasks.register 방식 사용 권장

  • 이전: 태스크를 정의할 때 task를 사용.
  • AGP 8.0 이상: 'tasks.register' 를 사용하는 것이 권장됨. 이는 Gradle의 lazy configuration 방식을 따르기 때문에 빌드 성능이 향상된다.
tasks.register('clean', Delete) {
    delete rootProject.buildDir
}

 

5. lintOptions에서 lint로 변경

  • 이전: lintOptions 블록을 사용하여 린트 관련 설정을 구성.
  • AGP 8.0 이상: lint 블록으로 변경되었다.
android {
    lint {
    	checkDependencies true
    }
}

 

6. Kotlin과 Java 플러그인 적용

  • 이전: apply plugin 방식으로 플러그인을 적용.
  • AGP 8.0 이상: plugins {} 블록을 사용하는 것이 권장됨. apply plugin 방식도 여전히 작동하지만, 최신 방식으로는 plugins {} 블록을 사용하는 것이 더 명확하고 관리하기 쉽다.
plugins {
    id 'com.android.application'
    id 'kotlin-android' 
}

 

7. annotationProcessor 대신 kapt 사용

  • 이전: annotationProcessor를 사용하여 Annotations 프로세싱.
  • AGP 8.0 이상: Kotlin 프로젝트에서는 kapt를 사용하는 것이 권장된다.
dependencies { 
    kapt 'androidx.lifecycle:lifecycle-compiler:2.3.1' 
}

 

8. compile 의존성 구성 제거

  • 이전: compile 키워드로 의존성을 선언.
  • AGP 7.0 이상: compile은 더 이상 사용되지 않고 implementation, api, 'compileOnly' 로 대체되었다.
dependencies { 
    implementation "androidx.core:core-ktx:1.6.0" 
}

 

9. Java 8+ 기능 사용 권장

  • 이전: 프로젝트에서 Java 8 이상의 기능을 사용할 때 명시적으로 설정해야 했다.
  • AGP 8.0 이상: Java 8 이상의 기능을 사용하는 것이 기본적으로 지원됨. 추가 설정 없이 최신 Java 기능을 사용할 수 있다.

 

10. Jetpack Compose가 기본적으로 지원됨

  • 이전: Jetpack Compose를 사용하기 위해 여러 설정이 필요했다.
  • AGP 8.0 이상: Jetpack Compose가 기본적으로 지원되며, 설정이 더 간단해졌다.
android { 
    composeOptions { 
        kotlinCompilerExtensionVersion '1.5.1' 
    }
}

 

11. sourceSets 블록의 경로 변경

  • 이전: sourceSets 블록에서 경로 설정이 달랐다.
  • AGP 8.0 이상: src/main/ 경로와 관련된 경로 변경이 있을 수 있으므로, 이에 맞추어 경로를 명확하게 설정해야 한다.

 

 

반응형
블로그 이미지

SKY STORY

,
반응형

안드로이드에서 targetSdkVersion 34로 설정할 때는 몇 가지 주요 변경 사항과 주의 사항이 있습니다. 주요 사항은 다음과 같다.

 

1. 권한 처리 강화

  • 미디어 파일 권한: Android 14에서는 사진, 동영상, 오디오 파일에 대한 권한 요청이 분리되었습니다. READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO와 같은 구체적인 권한을 사용해야 합니다.
  • 알림 권한: Android 13(API 33)부터 알림 사용을 위한 권한(POST_NOTIFICATIONS)이 필수적입니다. 사용자가 명시적으로 알림을 허용해야 앱이 알림을 보낼 수 있습니다.
    • 예시:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), 100)
}

 

2. 백그라운드 작업 제한 강화

  • 정책 변경: Android 14는 백그라운드 작업에 대한 제약을 더 강화했습니다. 배터리 소모를 줄이기 위해 백그라운드에서 실행되는 작업에 대한 제한이 있으며, 특히 앱이 백그라운드에서 실행 중일 때 작업 스케줄링이 더 어려워졌습니다. 이를 해결하기 위해 JobScheduler 또는 WorkManager를 사용하는 것이 권장됩니다.

 

3. 기본 보안 정책 강화

  • SAF(Storage Access Framework) 적용 강화: 외부 저장소 접근이 더 제한적이며, 앱이 명시적으로 저장소 접근을 요청하지 않으면 사용자가 이를 거부할 수 있습니다. Scoped Storage 적용을 준비해야 하며, 파일 관리는 앱 전용 저장소나 사용자 상호작용을 통해서만 접근해야 합니다.

 

4. 암호화 및 보안

  • 암호화된 네트워크 통신: 명시적 암호화가 더 중요해졌습니다. Android 14는 더 엄격한 네트워크 보안 구성을 요구하며, 특히 비암호화된 HTTP 요청을 차단하거나 이를 명시적으로 허용하지 않으면 기본적으로 차단됩니다. 앱의 network_security_config.xml에서 설정을 확인하고 HTTPS를 권장합니다.

 

5. 개발자 옵션 사용 제한

  • Android 14에서는 디버그 앱이 아닌 경우, 앱 설치 후 개발자 옵션을 통해 설정된 일부 기능이 자동으로 차단될 수 있습니다. 따라서 개발자 전용 빌드 배포 빌드에서 설정 차이를 명확히 하고, 배포 빌드에서는 사용자 경험에 영향을 주지 않도록 주의해야 합니다.

 

6. 백그라운드 위치 접근 제한

  • 위치 서비스 관련 변경 사항으로, 백그라운드에서 위치 정보를 사용하는 경우에 대해 더 엄격한 권한 요구가 추가되었습니다. Android 10(API 29)부터 백그라운드 위치 권한(ACCESS_BACKGROUND_LOCATION)이 따로 분리되었으며, 이를 명시적으로 요청해야 합니다. 이제 위치 권한을 필요로 하는 경우, Foreground 권한 Background 권한을 각각 별도로 요청해야 합니다.

 

7. 동적 코드 로딩 제한

  • Android 14에서는 동적 코드 로딩(dynamic code loading)과 관련된 보안 정책이 더 엄격해졌습니다. APK 내에서 동적으로 코드를 로드하는 방식(예: 외부에서 다운받은 Dex 파일 로딩)을 사용한다면, 보안상의 이유로 Google Play 정책 위반이 될 수 있으므로 주의해야 합니다.

 

8. Non-SDK 인터페이스 사용 제한

  • Android 14에서는 Non-SDK 인터페이스(비공개 API) 사용을 제한하는 정책이 강화되었습니다. 이제 비공개 API에 접근하는 것은 더욱 어렵고, 이에 대한 경고나 오류가 발생할 수 있으므로, 공식 SDK를 사용하는지 점검해야 합니다.

 

 

반응형
블로그 이미지

SKY STORY

,
반응형

Gradle 8.0 이상에서는 이전 버전과 비교해 여러 사항들이 변경되었으며, 특히 안드로이드 빌드 설정에 직접적인 영향을 미치는 요소들이 많다. 몇 가지 주요 변경 사항은 다음과 같다.

 

1. namespace 선언 필수

  • 변경 사항: Gradle 8.0과 Android Gradle Plugin(AGP) 7.3.0 이상에서는 AndroidManifest.xml에서 패키지 이름을 설정하는 대신 build.gradle 파일에서 namespace 속성을 명시적으로 선언해야 합니다.
  • 이유: 이 변경 사항은 Android Gradle Plugin의 개선된 네임스페이스 지원에 따른 것으로, 더 나은 빌드 속도와 코드 분리 지원을 위해 도입되었습니다.
  • 예시:
android {
    namespace 'com.sample.test'
}

 

2. targetSdkVersion이 없어짐

  • 변경 사항: targetSdkVersion은 더 이상 Gradle 파일에서 필수적으로 선언되지 않으며, Google Play가 자동으로 최신 버전으로 간주합니다. 하지만 여전히 하위 호환성을 유지하고 싶다면 명시적으로 설정하는 것이 좋습니다.
  • 이유: 이는 구글이 최신 플랫폼 기능을 활용하도록 유도하기 위한 변화이며, 최신 SDK 버전에 대한 자동 지원을 강화합니다.
  • 예시:
android {
    compileSdkVersion 34
    defaultConfig {
        minSdkVersion 21
        // targetSdkVersion 없어짐
    }
}

 

3. 종속성 관리 변화

  • 변경 사항: Gradle 8.0에서는 jcenter() 지원이 완전히 중단되었습니다. 따라서 mavenCentral() 또는 google()로 대체해야 합니다.
  • 이유: JFrog에서 JCenter 저장소를 더 이상 업데이트하지 않기 때문에 더 이상 사용할 수 없습니다​.
  • 예시:
repositories {
    google()
    mavenCentral()
}

 

4. Java Toolchain 강화

  • 변경 사항: Gradle 8.0에서는 Java toolchain을 보다 엄격하게 관리하며, 잘못된 toolchain 설정이 더 이상 허용되지 않습니다. 또한 자동으로 toolchain을 다운로드할 때 명시적으로 저장소(Repository)를 설정하지 않으면 오류가 발생합니다.
  • 이유: 이는 빌드 환경에서 더 나은 일관성과 신뢰성을 제공하기 위해 도입되었습니다​.
  • 예시:
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(11)
    }
}

 

5. 테스트 프레임워크 설정 변경

  • 변경 사항: 테스트 태스크에서 테스트 프레임워크를 설정한 후 추가적인 옵션을 변경하는 것이 더 이상 허용되지 않습니다. 테스트 프레임워크는 먼저 설정한 후 옵션을 설정해야 합니다.
  • 이유: 테스트 프레임워크 설정 후 옵션을 변경하는 것이 이전에는 설정을 덮어쓰는 문제가 있었기 때문에 이러한 변경이 적용되었습니다​.
  • 예시:
test {
    useJUnitPlatform {
        includeTags("unit")
    }
    options {
        // 테스트 옵션
    }
}

 

반응형
블로그 이미지

SKY STORY

,
반응형

AAR파일을 프로젝트에 추가 및 설정하는 방법에 대해 알아보도록 하겠습니다.

 

AAR 파일을 프로젝트에 추가

aar파일을 프로젝트의 libs 폴더에 복사합니다. 만약 폴더가 없다면 생성합니다.

your_project/
├── app/
│   ├── build.gradle.kts
│   ├── libs/
│   │   ├── MyTest-debug.aar
│   │   └── MyTest-release.aar
│   ├── src/
│   └── ...
├── build.gradle.kts
└── settings.gradle.kts

'

 

'settings.gradle.kts' 파일 수정

'settings.gradle.kts' 파일에서 'flatDir' repositories를 추가합니다:

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        // 'libs' 폴더 설정  
        flatDir {
            dirs("libs")
        }
    }
}

rootProject.name = "your_project"
include(":app")

 

'build.gradle.kts' (Moduel :app) 파일 수정

... 생략 ...

dependencies {
    ... 생략 ...

    // AAR 파일 의존성 추가
    implementation(":MyTest-debug")
    releaseImplementation(":MyTest-release")
}

 

 

반응형
블로그 이미지

SKY STORY

,