Flutter 설정이 완료되었다면 기존 앱을 하나 실행시켜도록 하겠습니다.
새로 프로젝트를 구성해서 실행하는 것도 좋지만, 이미 만들어져 있는 것을 실행시켜 발생하는 오류들을 해결해보도록 하겠습니다.
제가 사용한 프로젝트는 아래 프로젝트는 구글링 중 무료로 찾은 airbnb_redesign_ui를 사용하도록 하겠습니다.
https://github.com/olayemii/flutter-ui-kits/tree/main/airbnb_redesign_ui
GitHub - olayemii/flutter-ui-kits: Free Flutter UI Kits developed by Olayemi Garuba
Free Flutter UI Kits developed by Olayemi Garuba. Contribute to olayemii/flutter-ui-kits development by creating an account on GitHub.
github.com
프로젝트를 다운로드 후 적당한 영역에 압축을 풀어주고 VS Code를 실행시켜 줍니다.
그 후 flutter run을 입력해줍니다.
No supported devices connected. 오류 해결
flutter run을 바로 실행하게 될 경우 위와 같은 오류를 나타내는데
이는 코드가 실행될 디바이스를 선택하지 않은 것이라서 출력되는 오류입니다.
VS Code 하단을 보면 No Device 라는 부분을 눌러 줍니다.
No Device 라는 부분을 누르면 상단 이미 설정되어 있는 디바이스를 선택할 수 있습니다.
저는 Pixel을 선택하였습니다. 정상적으로 실행되었다면 실행한 화면을 볼 수 있습니다.
이 상태에서 다시 flutter run을 실행시킵니다.
Your Flutter application is created using an older version of the Android embedding 오류
이 오류는 해당 프로젝트가 flutter v1을 기준으로 생성되었기 때문에 마이그레이션을 해달라는 내용입니다.
v1과 v2의 가장 큰 차이는
io.flutter.android.FlutterActivity 와 그와 관련된 class들이 모두 deprecated 되었다는 점입니다.
해결하기 위해서는 아래 과정을 순서대로 진행하면 됩니다.
1. MainActivity.java 나 MainActivity.kt 에서 사용되고 있는 io.flutter.android.FlutterActivity 를 io.flutter.embedding.android.FlutterActivity 로 변경해어야 합니다.
2. android/app/src/main/AndroidManifest.xml 에서 appilcation tag 를 아래와 같이 수정해주어야 합니다.
수정 전
<application
android:name="io.flutter.app.FlutterApplication">
<!-- code omitted -->
</application>
수정 후
<application
android:name="${applicationName}">
<!-- code omitted -->
</application>
3. android/app/src/main/AndroidManifest.xml 에서 아래 meta-data tag 를 추가해주어야 합니다.
<meta-data
android:name="flutterEmbedding"
android:value="2" />
수정 후 다시 flutter run을 실행시킵니다.
Warning: Mapping new ns http://schemas.android.com/repository/android/common/02
to old ns http://schemas.android.com/repository/android/common/01 오류
해당 오류는 gradle 버전이 7.0.1 미만이어서 발생하는 오류입니다.
gradle-wrapper.properties에서 distributionUrl 부분을 7.0.2로 수정해줍니다.
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip
추가적으로 프로젝트 단위에서 build.gradle 파일에서도 gradle 버전을 수정해줍니다.
buildscript {
ext.kotlin_version = '1.3.50'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
수정 후 다시 flutter run을 실행시킵니다.
Error: Member not found: 'packageRoot'. io.Platform.packageRoot; // ignore: deprecated_member_use 오류
해당 오류는 현재 flutter dependencies가 버전이 낮아 발생하는 이슈입니다.
flutter pub upgrade 입력 후 flutter clean && flutter run를 입력해 줍니다.
One or more plugins require a higher Android SDK version. 오류
해당 오류는 현재 코드 내에서는 compileSdkVersion을 API 29로 되어있지만 실제 디바이스는 compileSdkVersion와 targetSdkVersion을 API 31로 설정해서 발생하는 오류입니다.
app 내의 build.gradle 파일에 들어가 수정해 줍니다.
수정 후 다시 run 해줍니다.
Error: android:exported needs to be explicitly specified for <activity>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported 오류
사실 compileSdkVersion와 targetSdkVersion을 API 31로 설정한 이유는 Android 12 환경에서 실행하려고 했었는데
그에 따라 부가적인 오류가 발생하고 있습니다.
Android 12부터 외부 응용 프로그램에서 앱에서 발생한 활동, 서비스 등에 대해 사용할 수 있도록 하는 설정할 수 있습니다.
그에 따라 해당 내용을 설정을 할 수 있도록 exported 기능이 추가되어 있는데
현재 프로젝트에서는 해당 값이 저장되어 있지 않아 발생한 오류입니다.
android/app/src/main/AndroidManifest.xml 에서 activity에서 android:exported="true"를 추가해주면 오류가 해결됩니다.
<activity
...
android:hardwareAccelerated="true"
android:exported="true"
android:windowSoftInputMode="adjustResize">
수정 후 다시 run 해줍니다.
모든 오류가 수정되었고 실행화면을 확인할 수 있습니다.
'flutter' 카테고리의 다른 글
JSON Parsing (0) | 2022.04.10 |
---|---|
Google 로그인 구현 (0) | 2022.03.27 |
Splash 이미지 생성 / 변경 / 제거하기 (flutter_native_splash) (0) | 2022.03.17 |
맥북 Apple Silicon M1에 Flutter 개발 환경 구축하기 (0) | 2022.03.12 |