flutter build apk --release --flavor pro
make apk file ์ ์ฌ์ฉํ์ง๋ง arm64-v8a์๋ libflutter.so file.so ์ฑ ์คํ์ด ํฌํจ๋์ง ์์ต๋๋ค.
--target-platform=android-arm64
์ถ๊ฐํ ๋ : flutter build apk --release --flavor pro --target-platform=android-arm64
, apk ํ์ผ์ ๊ทธ๋ ๊ฒ ๋ ์๊ฐ๋๋ค. ๊ทธ๋ฌ๋ 32๋นํธ CPU์์๋ ์ฑ ์คํ์ด ์คํจํฉ๋๋ค.
๋ด๊ฐ ๋ฌด์์ ํ ์ ์์ต๋๊น? apk ํ์ผ์ 64 ๋ฐ 32 cpu @mravn-google์์ ์คํํ ์ ์์ต๋๋ค.
/System.err(15263): java.lang.UnsatisfiedLinkError: Couldn't load flutter from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.jianzhibao.ka.enterprise-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.jianzhibao.ka.enterprise-1, /vendor/lib, /system/lib]]]: findLibrary returned null
์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ณ ๋๋ฒ๊ทธ ๋๋ ๋ฆด๋ฆฌ์คํ๊ณ ์ ์๋ํฉ๋๋ค. ๋ด ํ๋ก์ ํธ์ ์ ํ๋ก์ ํธ์ ๋ค๋ฅธ ์ ์ ํ์ฌ so
ํ์ผ์ ์ถ๊ฐํ๋ค๋ ๊ฒ์
๋๋ค.
์ด๋์ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
AFAIK, ํ์ฌ Flutter๋ ๋ฆด๋ฆฌ์ค APK์์ ์ ํ๋ ํ๋์ ํ๋ซํผ ํด๋์๋ง libflutter.so๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋๋ฅผ ์ํด ์ผํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ build.gradle์ด 32๋นํธ๋ง ์ํํ๋๋ก ๊ฐ์ ํ๋ ๊ฒ์ด์์ต๋๋ค(๋ชจ๋ 64๋นํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ + Intel ์ ์ธ)
release {
...
ndk{
abiFilters "armeabi-v7a"
}
}
cc @ํ์ด์
@swavkulinski apk๋ฅผ ํ๋ ์ด์คํ ์ด์ ์ด๋ป๊ฒ ์ถ์ํ์๊ฒ ์ต๋๊น?
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ง๋ง flutter.so๋ "armeabi-v7a ํด๋์ ํฌํจ๋์ด ์์ง ์์ต๋๋ค.
x86 ๋ฐ armeabi-v7a์ฉ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์๊ณ arm64๋ ์์ต๋๋ค.
"armeabi-v7a"์ ๋ํด์๋ง ํ๋ฌํฐ๋ฅผ ๋ง๋ค๊ณ ์ถ์ต๋๋ค.
ndk{
abiFilters "armeabi-v7a" // ์๋ํ์ง ์์"armeabi", "x86",
}
@mravn-google์ด android-arm์ ์ ์ํ ๋๋ก target-platform์ผ๋ก ์ค์ ํฉ๋๋ค.
์์น๋ฅผ ์ง์ ํ์ง ์๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ์ง ์๋ APK
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ณ ํ ์ฌ์์ด ์๋ APK
์์น๋ฅผ ์ง์ ํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๋ APK
์ถ๊ฐ ๋จ๊ณ๋ฅผ ๋๋ฒ๊น ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์์ด ์์ต๋๊น?
@xxseabxx ์ ๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค
๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. 32๋นํธ์ฉ์ผ๋ก ๋น๋ํ๋ฉด 64๋นํธ ์ฅ์น๊ฐ ์ ์ธ๋์ง๋ง ์คํ๋ฉ๋๋ค. --target-platform android-arm64
๋ฅผ ์ง์ ํ์ฌ 64์ฉ ๋น๋๋ 64๋นํธ ์ฅ์น์์ ์๋ํ์ง๋ง 32๋นํธ ์ฅ์น์์๋ ์ถฉ๋ํฉ๋๋ค. ๋ํ Google์ 2019๋
์ APK ์
๋ก๋๋ฅผ 64๋นํธ๋ก ์ ํํ ์์ ์
๋๋ค.
Flutter Team, ์ด ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ์ธ์!
Flutter Team, ์ด ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ์ธ์!
๊ทธ๋์ flutter๊ฐ 32๋นํธ ๋๋ 64๋นํธ์ฉ ๋ฆด๋ฆฌ์ค apk๋ง ์ง์ํ ์ ์๊ณ ๋ ๋ค ์ง์ํ ์๋ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋ชป๋ ๊ฒ์ ๋๊น?
์ฌ๊ธฐ์ ํ์ด์ด ์์ต๋๊น?
xxseabxx์ ์๊ฒฌ์ด ํจ๊ณผ๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์๋ํ์ง ์์์ต๋๋ค...
์ ๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ด ๋ชจ๋ ์ข ์์ฑ์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ํ๋ ์ด์์ ํจํค์ง๋ฅผ ๋ถ๋ฆฌํ์ผ๋ฉฐ ๊ทธ์ ๋ฐ๋ผ ๋ฒ๊ทธ ๋ณด๊ณ ์๋ฅผ ์์ฑํ์ต๋๋ค. https://github.com/azihsoyn/flutter_mlkit/issues/36
๋ฌธ์ ๋ฅผ ๋ถ๋ฆฌํ๋ ค๋ฉด ๊ฐ ์ข ์์ฑ/ํ๋ฌ๊ทธ์ธ์ ๋ํด ๋ค์์ ์ํํ์ญ์์ค.
1) ๋น ํ๋ฌํฐ ํ๋ก์ ํธ ์์ฑ
2) main.dart๋ฅผ ๋ค์์ผ๋ก ๋ฐ๊ฟ๋๋ค.
ํจํค์ง ์์ ์ฝ๋(์: https://pub.dartlang.org/packages/flutter_html_view#-example-tab-)
3) ๊ทธ์ ๋ฐ๋ผ pubspec.yaml ์ ๋ฐ์ดํธ
4) ์คํ
$ flutter build apk
์์ฑํ ๊ฒ์ด flutter_mlkit์ธ ๊ฒ์ผ๋ก ๋ฐํ์ก์ต๋๋ค.
32 ๋ฐ 64 ์ํคํ ์ฒ๋ฅผ ๋ชจ๋ ํ๊ฒํ ํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. --target-platform=android-arm64 ์๋ํ์ง๋ง Google์ด 32๋นํธ์์ ํ๋ฌ๊ทธ๋ฅผ ๋ฝ์ ๋๊น์ง 32๋นํธ๋ฅผ ์ง์ํ๊ณ ์ถ์ต๋๋ค.
Flutter Team, ์ด ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ์ธ์!
๋ง์ ์ธ ๋ฒ์งธ SDK๊ฐ ์๋ํ์ง ์์ต๋๋ค. ๊ธํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Android ์ ํ๋ฆฌ์ผ์ด์ ์ Mapbox๋ฅผ ์ถ๊ฐํ ๋ ์ด๋ฅผ ์ฌํํ ์ ์์ต๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ด ํ๋ก์ ํธ์์ baiduMap์ ์ฌ์ฉํฉ๋๋ค. bebug ๋ชจ๋ธ์ ์ ์์ด๋ฉฐ, ์ถฉ๋์ ํด์ ํฉ๋๋ค.
๋ด ํฐ์ user flutter build apk --release --target-platform=android-arm64๋ ์ ์์ด์ง๋ง 32๋นํธ ํฐ์ ์ถฉ๋ํฉ๋๋ค.Flutter ํ, ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ญ์์ค.
https://github.com/azihsoyn/flutter_mlkit/issues/36 ๊ณผ ์ ์ฌํ๊ฒ ์ ์๊ฒ ํจ๊ณผ์ ์ด๋ฉฐ apk๋ 32๋นํธ ๋ฐ 64๋นํธ ์ ํ ๋ชจ๋์์ ์คํํ ์ ์์ต๋๋ค. @peace2knowledge
์ด๊ฒ์ ๋ฆด๋ฆฌ์ค apk์์ ๋งค์ฐ ์ค์ํ ๋ฌธ์ ์ฌ์ผ ํฉ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
lib/armeabi-v7a/libflutter.so
์์ $<FLUTTER>/bin/cache/artifacts/engine/android-arm-release/flutter.jar
armeabi-v7a/libflutter.so
๋ก $<project>/android/jniLibs/armeabi-v7a/
$<project>/android/app/build.gradle
๋ฅผ ์๋์ ๊ฐ์ด ์์ ํฉ๋๋ค.android {
...
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
ndk {
abiFilters "arm"
}
}
debug {
ndk {
abiFilters "arm"
}
}
}
}
NDK์ ๊ฒฝ์ฐ 64๋นํธ ๋๊ตฌ ๋ชจ์์๋ minSdkVersion >= 21์ด ํ์ํฉ๋๋ค.
์ด๊ฒ์ ๋๋ฅผ ์ฐจ๋จ ํด์ ํ์ต๋๋ค(์ ์ ํ minSdkVersion ์ค์ ํฌํจ).
minSdk๋ฒ์ =16
flutter build apk --release --target-platform=android-arm
flutter run --release --target-platform=android-arm
์ต์ SDK ๋ฒ์ =21
flutter build apk --release --target-platform=android-arm64
flutter run --release --target-platform=android-arm64
๋ชจ๋ abiFilter๋ฅผ ์ญ์ ํ๋ฉด ํจ๊ณผ์ ์ ๋๋ค.
@zoechi @Hixie ๋ถ๋๋ฌ์ด ๋ฒํ. ๋ํ ํ์ฌ ๊ฐ์ฅ ์ค์ํ ์ฌ์ฉ ์ฌ๋ก์ธ ๊ธฐ์กด ์ฑ๊ณผ ํตํฉํ๋ ค๊ณ ํ ๋ ์ด ๋ฌธ์ ์ ์ง๋ฉดํฉ๋๋ค.
mindsdk=21, ์์ง ๋์ ํ๋ซํผ์ ์ ๋ฐ์ดํธํ์ง ์์์ต๋๋ค.
@neiljaywarner ์ฒซ ๋๊ธ์ ์์ง์๊ฐ๋ฝ์
- ์ถ์ถ
lib/armeabi-v7a/libflutter.so
์์$<FLUTTER>/bin/cache/artifacts/engine/android-arm-release/flutter.jar
- ํ์ผ ๋ณต์ฌ
armeabi-v7a/libflutter.so
๋ก$<project>/android/jniLibs/armeabi-v7a/
$<project>/android/app/build.gradle
๋ฅผ ์๋์ ๊ฐ์ด ์์ ํฉ๋๋ค.android { ... buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. signingConfig signingConfigs.debug ndk { abiFilters "arm" } } debug { ndk { abiFilters "arm" } } } }
์ด๊ฒ์ ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์์ต๋๋ค. lib ํด๋๊ฐ ๋๋ฝ๋ APK๋ฅผ ์์ฑํ์ต๋๋ค(๋ฐ๋ผ์ ์ด์ APK ํฌ๊ธฐ์ ์ ๋ฐ์ด ๋จ).
์ฐ๋ฆฌ๋ ๋ํ ์ผ๋ถ๊ฐ ๊ฒ์ํ 32๋นํธ ์ ์ฉ ์๋ฃจ์ (์: https://medium.com/flutterpub/flutter-app-couldnt-find-libflutter-so-c95ad81cbccd)์ ๊ตฌํํ๋ฉด - ๊ณ ์ฑ๋ฅ ์ฑ. ํนํ Samsung S6 ๋ฐ S9์ ๋ํ ํ ํ ์คํธ์์ ์ฐ๋ฆฌ๋ ํฐ ๋ชฉ๋ก์์ ๋งค์ฐ ๋๋ฆฐ ์คํฌ๋กค์ ๋ณด๊ณ ์์ต๋๋ค.
๋๋ ๋ฌธ์ ๊ฐ ๋๋ฝ ๋ arm64 libflutter.so
๋ง ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
arm64์ฉ์ผ๋ก ๋น๋ํ๊ณ libflutter.so
๋ณต์ฌํ ๋ค์ ๋ค์ ๋น๋ํ๊ณ arm64 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ APK์ ์๋์ผ๋ก ์ถ๊ฐํ๊ณ ์ฌ์ ๋ ฌํ๊ณ ๋ค์ ์๋ช
ํ์ฌ ๋๋ฝ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ APK์ ์ถ๊ฐํ๋ ค๊ณ ํ์ต๋๋ค.
flutter build apk --target-platform=android-arm64
mkdir -p tmp/lib/arm64-v8a
cp build/app/intermediates/transforms/mergeJniLibs/release/0/lib/arm64-v8a/libflutter.so tmp/lib/arm64-v8a/
flutter build apk
cp build/app/outputs/apk/release/app-release.apk tmp/
cd tmp
aapt add app-release.apk lib/arm64-v8a/libflutter.so
zipalign 4 app-release.apk app-release-aligned.apk
apksigner sign --ks keystore.jks app-release-aligned.apk
๊ฒฐ๊ณผ APK์๋ armeabi-v7a ๋ฐ arm64-v8a ๋ชจ๋์ ๋ํด libflutter.so๊ฐ ์์ง๋ง ์์ ์ ๋ค์ ์ค๋ฅ์ ํจ๊ป ์ถฉ๋ํฉ๋๋ค.
12-22 09:53:29.274 7457 7457 F flutter : [FATAL:flutter/runtime/dart_vm.cc(403)] Error while initializing the Dart VM: Snapshot not compatible with the current VM configuration: the snapshot requires 'product no-type_checks no-asserts no-error_on_bad_type sync_async reify_generic_functions arm-eabi softfp' but the VM has 'product no-type_checks no-asserts no-error_on_bad_type sync_async reify_generic_functions arm64-sysv'
๊ฐ ์์น์ ๋ํด ๋ณ๋์ ์ค๋ ์ท ์์ฐ๋ ๋ฐฐ์กํด์ผ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ํ์ฌ๋ก์๋ ๋ ๊ฐ์ ๊ฐ๋ณ APK๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด ์ ์๊ฒ ์ ํฉํ ์ ์ผํ ์๋ฃจ์ ์ ๋๋ค.
์ด๊ฒ์ ๋ฆด๋ฆฌ์ค๊ฐ apk๋ฅผ ์ ๋๋ก ๋น๋ํ์ง ์๋๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ๊ธฐ ์ํด ํ๋ฌํฐ๋ก ํ๋ก ํธ์๋๋ฅผ ์ค์ ๋ก ์์ฑํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋ธ ํ ๋ฐ์ํ๋ ๊ฝค ํํธ์๋ ๋ฌธ์ ์ ๋๋ค.
iOS๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ๋ฉด ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๊น?
๋ช์์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๊น?
์ด๊ฒ์ ์ฐ๋ฆฌ์ gradle ํ์ผ์ด ๋ ๋ค์ ๋ํ ๋ชจ๋ ์ฌ๋ฐ๋ฅธ ๋นํธ๋ฅผ ๋ฌถ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๊น? @jason-simmons @cbracken ์ด ์ ์ ์์๊น์?
์๋๋ฉด @FaisalAbid ๊ฐ
์ด๊ฒ์ ์ฐ๋ฆฌ์ gradle ํ์ผ์ด ๋ ๋ค์ ๋ํ ๋ชจ๋ ์ฌ๋ฐ๋ฅธ ๋นํธ๋ฅผ ๋ฌถ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๊น? @jason-simmons @cbracken ์ด ์ ์ ์์๊น์?
์๋๋ฉด @FaisalAbid ๊ฐ
์ฌ๋ฐ๋ฅธ ๋นํธ๋ก ์ด ์๊ฒฌ์ ๋ฐ๋ผ libflutter.so ์ด์์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. https://github.com/flutter/flutter/issues/18494#issuecomment -449557182
์ง๊ธ ๋น์ฅ์ ์์ ์ด ์์ ๋๊น์ง 32๋นํธ APK๋ฅผ ๋น๋ํ๋ ๊ฒ์ด ์ ์ผํ ํด๊ฒฐ์ฑ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ 32๋นํธ์์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ณด์์ต๋๋ค(ํฐ ๋ชฉ๋ก์ด ์๋ ์ต์ ์ ์ฝ๋๋ ์๋์ง๋ง).
๋ณ๋์ 64๋นํธ ๋ฐ 32๋นํธ APK๋ฅผ ๋น๋ํ๊ณ ๋ ๋ค Google์ ์ ๋ก๋ํ๋ ๊ฒ์ ์ ์๋ํฉ๋๋ค(์ฌ๋ฐ๋ฅธ ๊ธฐ๊ธฐ์ ์ฌ๋ฐ๋ฅธ APK ์ ๊ณต์ ์๋์ผ๋ก ์ฒ๋ฆฌํจ).
abiFilters
๋ฅผ armeabi-v7a
ํ๊ณ --target-platform=android-arm
ํ ๋น๋๋ฅผ ์ํํ๊ณ ํด๋น APK๋ฅผ ์
๋ก๋ํ ๋ค์ abiFilters
๋ฅผ arm64-v8a
์ค์ ํ์ฌ ๋ค๋ฅธ ๋น๋๋ฅผ ์ํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ --target-platform=android-arm64
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ๋ ์
๋ก๋ํ์ธ์.
๋ํ ๊ฐ APK์ ๋ํด ๋ค๋ฅธ ๋ฒ์ ์ฝ๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก DPI ๋๋ API ์์ค์์์ ๋ง์ฐฌ๊ฐ์ง๋ก 64๋นํธ ๋๋ 32๋นํธ์์ ๋ํ๋ด๋๋ก ๋ฒ์ ์ฝ๋์ ๋ฌด์ธ๊ฐ๋ฅผ ํฌํจํฉ๋๋ค.
ํ์ฌ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ target-platform์์ ์กฐ๊ฑด๋ถ๋ก abiFilters๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋๋ค.
ndk {
if (project.hasProperty('target-platform') &&
project.property('target-platform') == 'android-arm64') {
abiFilters 'arm64-v8a'
} else {
abiFilters 'armeabi-v7a'
}
}
๋ด๊ฐ ๊ฐ์ง ๋ฌธ์ ๋ ์ด์ ๋ฒ์ ์ฝ๋๊ฐ ๋ค๋ฅธ ๋ ๊ฐ์ APK๋ฅผ ์
๋ก๋ํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
์ด์ ๋ํ ์ค์ ์์ ์ ์ฌ๋ฌ ๋์ ํ๋ซํผ์ผ๋ก Android ๋ฒ๋ค์ ๋น๋ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. App Bundle์ ํ์ฌ ํ๋ฌํฐ ๋ง์คํฐ์ ์์ง๋ง ์ด ์์
์ ์ํํ ์ ์์ต๋๋ค.
ํ๋ ์ด ์คํ ์ด๋ 8์ 1์ผ๋ถํฐ 64๋นํธ๊ฐ ํ์ํฉ๋๋ค.
8์ 1์ผ ์ดํ์๋ ์ฑ์ ์คํํ๋ ค๋ 32๋นํธ ์ฅ์น๊ฐ ๊ณ์ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ฆด๋ฆฌ์ค ๋น๋์ 32๋นํธ ๋ฐ 64๋นํธ๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
https://android-developers.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html
_๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ํฌํจํ๋ ๋ชจ๋ ์ ์ฑ ๋ฐ ์ฑ ์ ๋ฐ์ดํธ๋ Google Play์ ๊ฒ์ํ ๋ 32๋นํธ ๋ฒ์ ์ธ์ 64๋นํธ ๋ฒ์ ์ ์ ๊ณตํด์ผ ํฉ๋๋ค._
์ด ์๊ตฌ ์ฌํญ์ 32๋นํธ ๊ธฐ๊ธฐ์ฉ๊ณผ 64๋นํธ ๊ธฐ๊ธฐ์ฉ์ผ๋ก ๊ฐ๊ฐ 2๊ฐ์ APK๋ฅผ ๋น๋ํ๊ณ ๋์ผํ ๋ฆด๋ฆฌ์ค์ ์ผ๋ถ๋ก ๋ ๋ค ์ ๋ก๋ํ๊ธฐ๋ง ํ๋ฉด Flutter ์ฑ์ผ๋ก ํ์ฌ ์ฝ๊ฒ ์ถฉ์กฑ๋ฉ๋๋ค. Google Play๋ ์ ์ ํ ๊ธฐ๊ธฐ์ ์ ์ ํ APK๋ฅผ ์๋์ผ๋ก ์ ๊ณตํฉ๋๋ค. ๋๋ ์ด๊ฒ์ํ๊ณ ์ ์๋ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด _์ด์์ _์ด์ง ์๋ค๋ ๋ค๋ฅธ ๋ ผํ์๋ค์ ์๊ฒฌ์ ๋์ํ์ง๋ง, IMO๋ ์ด ๋ถ๋ถ์ ์ํฌํ๋ก์ ์ผ๋ถ๋ก ๋ง๋๋ ๊ฒ์ด ๊ทธ๋ค์ง ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๊ฐ๊น์ด ์์ผ ๋ด์ ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๋ค์ค APK ์ ๊ทผ ๋ฐฉ์์ ๋ค๋ฅธ Android ํ๋ก์ ํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก Flutter๊ฐ ์ฌ๋ฌ .so ์ํคํ ์ฒ ๋ฒ์ ์ผ๋ก APK๋ฅผ ๋น๋ํ ๋๊น์ง ์์ ์๋ฃจ์ ์ผ ๋ฟ์ ๋๋ค.
๋ง์ ์๋ ์ฒ๋ฆฌ(๋ฒ์ ์ฝ๋, ๋น๋ ์์คํ , ์๋ํ)๊ฐ ํ์ํ๋ฉฐ Android App Bundle์ ๊ฐ๋ฐ์์ ์๋ ๋น๋ ๋จ๊ณ๋ฅผ ๋์ด์ฃผ๊ธฐ๋ก ๋์ด ์์์ต๋๋ค.
ํ์ฌ ์ด ๋ฌธ์ ๋ 32๋นํธ ๋ฐ 64๋นํธ ๋ฒ์ ๋ง ์ธ๊ธํ์ง๋ง x86, x64 ๋ฐ ์ค๊ตญ์ ์ผ๋ถ ๊ฐ๋ฐ์๋ ์ฌ์ ํ mips ์ง์์ ๋ํด ์ด์ผ๊ธฐํฉ๋๋ค.
flutter๋ ๊ฐ๋ฅํ ํ ์ต์์ apk ํฌ๊ธฐ๋ฅผ ๊ฐ์ง 7๊ฐ์ Android ์ํคํ ์ฒ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํด์ผ ํ์ง ์์ต๋๊น?
https://proandroiddev.com/reducing-apk-size-by-using-abi-filters-and-apk-split-74a68a885f4e
@MarcelEdward ๊ทธ๋์ผ ํ์ง๋ง IMHO APK ํฌ๊ธฐ๋ ๊ฐ์ฅ ์ค์ํ ์ธก๋ฉด์ด ์๋๋๋ค. Android๋ ์ด์ App Bundle(aab)์ ์๋ฒฝํ๊ฒ ์ง์ํ๊ณ ์ต์ข ์ฌ์ฉ์๋ ์ด์จ๋ ์์ ์ ํด๋์ ํ์ ์ต์ ํ๋ ๋น๋๋ฅผ ๋ค์ด๋ก๋ํ๊ฒ ๋ฉ๋๋ค.
๊ฐ๋ฅํ ํ ์ต์ ํ/์์์ผ ํ๋ ํ๋ซํผ๋ณ APK์ ํฌ๊ธฐ์ ๋๋ค.
๊ฐ๋ฐ ์ค์๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ์ ์ฒด ํฌ๊ธฐ APK๋ฅผ ๋ค์ ์ค์นํ๋ ๊ฒ์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค. ํธ๋ฆญ์ abifilter๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฒ๊ทธ ๋น๋๋ฅผ ํ ์คํธ ์ ํ์ ์ํคํ ์ฒ๋ก ์ ํํ๋ ๊ฒ์ ๋๋ค. Flutter๊ฐ ํซ ๋ฆฌ๋ก๋๋ฅผ ์ง์ํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ด๊ฒ์ด ํ์ฌ์ ๊ด๋ จ์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค.
https://github.com/flutter/flutter/issues/17829 aap ์ฑ ๋ฒ๋ค์ ๊ดํ ๊ฒ์ด์ง๋ง ์ปดํ์ผํ ๋ 32๋นํธ๋ง ์ฐพ์ ์ ์์ต๋๋ค. With flutter build apk
๋ฐ๋ผ์ Richt๋ฅผ ์ดํดํ๋ฉด ์ต์ํ 32์ 64๊ฐ ํฌํจ๋ ๋ ๊ฐ์ ๋ณ๋ ๋ฒ์ ์ ๋น๋ํด์ผ ํฉ๋๋ค. ๋ ๋ค ์ ๋ก๋ํ ๋ค์ ์ฑ stroe๋ ๊ธฐ์ ์ ์ผ๋ก aap์ ๋น๋ํ์ฌ ์๋น์๊ฐ ํน์ ์ํคํ ์ฒ์ ์ต์ ํ๋ ๋ฒ์ ์ ์ป์ ์ ์๋๋ก ํฉ๋๋ค.
@MarcelEdward ํ๋ ์ด ์คํ ์ด๋ ์ฑ ๋ฒ๋ค์ ๊ตฌ์ถํ์ง ์์ต๋๋ค. ์ฅ์น ์ํคํ ์ฒ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฅ์น์ ์ ์ ํ APK๋ฅผ ์ ๊ณตํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด๋ ์ํคํ ์ฒ๋ฟ๋ง ์๋๋ผ ํ๋ฉด ํฌ๊ธฐ/ํด์๋, API ์์ค ๋ฐ ๊ธฐํ ์ฐจ๋ณํ ์์์ ๋ํด ์ฑ ๋ฒ๋ค์ด ๋์ค๊ธฐ ํจ์ฌ ์ ๋ถํฐ ์ง์๋์์ต๋๋ค. ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ ์์ Google ์ง๋์ 13๊ฐ์ง ๋ณํ์ ์ดํด๋ณด๋ฉด ์ด์ ๋ํ ์ข์ ์๋ฅผ ๋ณผ ์ ์์ต๋๋ค(APKMirror๋ ์ฃผ์ด์ง ์ฑ์ ๋ณํ ๋ชฉ๋ก์ ์ฝ๊ฒ ์ป์ ์ ์๋ ๋ฐฉ๋ฒ ์ธ์๋ ์ด ๊ธฐ๋ฅ๊ณผ ์๋ฌด ๊ด๋ จ์ด ์์ต๋๋ค). Play ์คํ ์ด๋ ํน์ฑ์ ๋ฐ๋ผ ์ด๋ฌํ ๋ณํ์์ ์ ์ ํ APK๋ฅผ ๊ธฐ๊ธฐ์ ์ ๊ณตํฉ๋๋ค.
App Bundle์ ์ฌ์ฉํ๋ค๋ฉด ์ฌ๋ฌ APK๋ฅผ ์ ๋ก๋ํ๋ ๋์ ๋ฒ๋ค์ ํ ๋ฒ๋ง ์ ๋ก๋ํ๋ฉด ๋์ง๋ง Play ์คํ ์ด์์ ๋ค์ํ APK ๋ณํ์ ์์ฑํ๋ฏ๋ก ์ต์ข ๊ฒฐ๊ณผ๋ ๋น์ทํ์ง๋ง ์์ ๋์ด ์ ์ต๋๋ค. ์ค์ค๋ก ์๋ํํ ์ ์์ต๋๋ค. (App Bundle์ ๋์ ์ผ๋ก ๋ก๋๋๋ ์๋ก์ด ๋ชจ๋๋ ์ง์ํ์ง๋ง ์ด๋ ๋ค๋ฅธ ์ด์ผ๊ธฐ์ ๋๋ค.)
๋ฐ๋ผ์ ์ฌ๊ธฐ์ ์ํ๋ ๊ธฐ๋ฅ์ --target-platform
์ธ์ ๋ ๊ฐ๋ฅผ ์ฌ์ฉํ์ฌ flutter build
๋ฅผ ์คํํ๊ณ flutter
๊ฐ ๋ ์ํคํ
์ฒ๋ฅผ APK์ ์๋์ผ๋ก ๋ฃ๋๋ก ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ต๋๊น?
@Hixie ๋
์ ํ๊ธฐ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ํคํ ์ฒ๋ ์๋นํ ๋ฎ์ ์์ค์ ๋๋ค. ์ ๋ ์ฌ๋๋ค์ด ์ฐ๋ฆฌ ์ฑ์ ์ฌ์ฉํ๋ ์ํคํ ์ฒ์ ๋ํ ๋จ์๋ฅผ ์ป์ง ๋ชปํ์ต๋๋ค. ์ํคํ ์ฒ๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ Flutter๋ 32๋นํธ๋ฅผ ์ปดํ์ผํ๋ฏ๋ก 32๋นํธ๊ฐ ๋ชจ๋ ์ ํฉํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ํ์ง๋ง ์ง๊ธ์ ํ๋ ์ด ์คํ ์ด๋ 8์์ 64๋นํธ๊ฐ ํ์ํ๋ฏ๋ก 32๋นํธ๊ฐ ๋ชจ๋ ์ ํฉํ๊ณ 64๋นํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ด ๋ ๊ฐ์ง๊ฐ ๋ฆด๋ฆฌ์ค ๋น๋์ ๋ค์ด๊ฐ์ผ ํฉ๋๊น?
๋๋ ์๋๋ก์ด๋ ํฐ์ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฏ๋ก ์๋ฎฌ๋ ์ดํฐ์์ ์๋ํ ๋ ์๋ํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค. ์ฑ ์ฌ์ฉ์๊ฐ ๋ค๋ฅด๊ฒ ๋งํ ๋๊น์ง.
@MarcelEdward2 32๋นํธ ๋ 64๋นํธ๊ฐ ์๋๋๋ค. ์ต์ Android NDK์์ ์ง์ํ๋ ๋ค ๊ฐ์ง ์ํคํ ์ฒ๊ฐ ์์ต๋๋ค.
ํ์ฌ Flutter๋ armeabi-v7a ์ ์ฉ์ผ๋ก ์ปดํ์ผ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๊ฐ ํฌํจ๋ APK๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋ํฉ๋๋ค. ์ด๊ฒ์ arm64-v8a์์ ์ ์คํ๋์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก arm64-v8a์ฉ์ผ๋ก ์ปดํ์ผ๋ ๊ฒ๊ณผ ๋น๊ตํ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฅ์น๊ฐ ๋ฒ๋ค๋ก ์ ๊ณตํ๋ค๊ณ ๊ฐ์ ํ๋ฉด x86 ๋๋ x86_64์ ARM ์๋ฎฌ๋ ์ดํฐ์์ ์คํ๋ฉ๋๋ค. x86/x86_64 ์ฅ์น์ ARM ์๋ฎฌ๋ ์ดํฐ๊ฐ ์์ผ๋ฉด ์ ํ ์คํ๋์ง ์์ต๋๋ค.
๋ค์ ํ ๋ฒ, 8์ ์๊ตฌ ์ฌํญ์ ๋ ์ํคํ ์ฒ๋ฅผ ๋ชจ๋ ํฌํจํ๋ ํ๋์ ๋ฒ์ฉ APK ๋๋ AAB๋ฅผ ์์ฑํ๋๋ก ์๊ตฌํ์ง ์์ต๋๋ค. ๊ฐ ๋ฆด๋ฆฌ์ค์ 64๋นํธ ๊ธฐ๊ธฐ์ ์ ํฉํ APK๊ฐ (์ต์ํ) ํ๋ ์ด์ ํฌํจ๋์ด ์์ผ๋ฉด ๋ฉ๋๋ค. ์ฌ๋ฌ ์ํคํ ์ฒ๋ฅผ ์ง์ํ๋ ํ๋์ ๋ฒ์ฉ APK/AAB๋ฅผ ๋น๋ํ ์ ์๋๋ก Flutter์์ ์์ ํ๋ฉด ๊ฐ๋ฐ์ ์ํฌํ๋ก ์ธก๋ฉด์์ ์ข์ ๊ฒ์ด์ง๋ง ์ด๋ฌํ ๊ฐ์ ์ด ์๋ ์๋ ์ด ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ ์ ์์ต๋๋ค.
์ถ๊ฐํ๋๋ก ํธ์ง๋จ: ๊ฐ์ธ์ ์ผ๋ก ์ฑ ๋ฒ๋ค์ ๋ํ ์ผ๋ฅ ์ง์์ด ๋ค์ค ์ํคํ ์ฒ ์ํฉ์ ๊ฐ์ ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
appbundle์ ์์ผ๋ก์ ์๋ฃจ์ ์ฒ๋ผ ๋ณด์ ๋๋ค ... ๋ค์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. #29303
์ด ๋ฒ๊ทธ๋ฅผ ์ดํดํ๋ ํ, ์ด๋ flutter build
์ ๊ธฐ๋ณธ ์ถ๋ ฅ ํ์์ผ๋ก .aab๋ก ์ด๋ํ๊ณ .aab์ 32๋นํธ ๋ฐ 64๋นํธ ๋น๋๋ฅผ ๋ชจ๋ ํฌํจํ๋๋ก ํ๋ ๊ฒ๊ณผ ๋งค์ฐ ๊ด๋ จ์ด ์์ต๋๋ค.
https://developer.android.com/studio/projects/dynamic-delivery
๋ด ์ดํด๋ ์ด ์์ ์ ์ผ๋ถ๊ฐ ์ด๋ฏธ ์งํ ์ค์ผ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. @dnfield ๋ ์๊ณ ์์์ง๋ ๋ชจ๋ฆ ๋๋ค.
/cc @mklim
.aab๊ฐ ๋์์ด ๋ ๊ฒ ๊ฐ์ง๋ง ์ค์ ๋ก๋ ํ์ํ์ง ์์ ์ ์์ต๋๋ค. APK์ 32๋นํธ ๋ฐ 64๋นํธ arm ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ชจ๋ ์ถ๊ฐํ๋ ๊ฒ์ฒ๋ผ ๋ฌธ์ ๊ฐ ๊ฐ๋จํฉ๋๊น?
์ ์๊ฒ ๋ค. ๋์ ์์น์ ๋ํ AOT ์ค๋
์ท๋ ์ ์ฌ์ ์ผ๋ก ํฌํจํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๊ธ์ ์์ฐ ์๋์ ๋ฐฐ์นํ๊ณ ์ํคํ
์ฒ๋ณ ๋ฒ์ ์ libs
์๋์ ๋์ง ์์ต๋๋ค. AOT ์ค๋
์ท์ ์ํคํ
์ฒ๋ณ libs ํด๋์ ๋ฃ์ ์ ์๋ค๋ฉด ์๋ํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๋ฐ ์ด์ ๋ก .aab ํ์์ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒ์
๋๋ค.
์ด์จ๋ add2app ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํ .AAR ๋น๋๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ด ์์ ์ ์ํํ๋ ค๊ณ ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฐ๋ฅผ๊ฑฐ์ผ.
ndk { if (project.hasProperty('target-platform') && project.property('target-platform') == 'android-arm64') { abiFilters 'arm64-v8a' } else { abiFilters 'armeabi-v7a' } }
์ด๊ฒ์ ๋ฌธ์ ํด๊ฒฐ์ ์ผ ํ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค.
@AppleEducate์์ ๊ฒ์ํ ์๋ฃจ์ ์ด ์๋ฎฌ๋ ์ดํฐ์์ ์ฑ์ ์คํํ๋ ค๊ณ ํ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
๋ฆด๋ฆฌ์ค ์น์ ์ ๋ฃ์ด
์ด๊ฒ์ด ๋ด ์๋ฃจ์ ์ด์์ต๋๋ค.
app gradle
splits {
// Configures multiple APKs based on ABI.
abi {
// Enables building multiple APKs per ABI.
enable true
// By default all ABIs are included, so use reset() and include to specify that we only
// want APKs for armeabi-v7a and arm64-v8a.
// Resets the list of ABIs that Gradle should create APKs for to none.
reset()
// Specifies a list of ABIs that Gradle should create APKs for.
include "armeabi-v7a", "arm64-v8a"
// Specifies that we do not want to also generate a universal APK that includes all ABIs.
universalApk false
}
}
flutter build apk --release --target-platform=android-arm
ํ๋ ์ด ์คํ ์ด์ app-armeabi-v7a-release.apk
์
๋ก๋
์ฆ๊ฐ versionCode
flutter build apk --release --target-platform=android-arm64
ํ๋ ์ด ์คํ ์ด์ app-arm64-v8a-release.apk
์
๋ก๋
Google Play ์คํ ์ด๋ ๊ธฐ๊ธฐ ์ํคํ ์ฒ์ ๋ฐ๋ผ ์ฑ์ ์ ๊ณตํฉ๋๋ค. 32๋นํธ ์ฅ์น๋ ๋ง์กฑํ๊ณ 64๋นํธ ์ฅ์น๋ ๋ง์กฑํ๋ฉฐ ๋ ์ํคํ ์ฒ๋ฅผ ๋ชจ๋ ์ ๊ณตํ๋ฉด์ APK ํฌ๊ธฐ๊ฐ ์๋์ ์ผ๋ก ์๊ฒ ์ ์ง๋๋ค๋ ์ฌ์ค์ ๋ง์กฑํฉ๋๋ค.
๋์ผํ APK์ ๋ ์ํคํ ์ฒ์ ๋ํ ์ง์์ด ํฌํจ๋ ๊ฒฝ์ฐ ์ฑ ํฌ๊ธฐ๋ 10MB ์ด์์ด ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
@edTheGuy00 Play ์คํ ์ด์ ์ ๋ก๋ํ๋ ๊ฒ์ด ์ผ๋ง๋ ํฐ์ง ํฅ๋ฏธ๋ก์ด์ง ์์ฌ์ค๋ฝ์ต๋๋ค. ์๋๋ก์ด๋ ํฐ์ ์ด์จ๋ 125+ ์์ ์ฌ์ ๊ณต๊ฐ์ ์๊ตฌํ ๊ฒ์ด๊ณ ํฌ์ฅ ํ๊ธฐ๋ฅผ ์ํด ์ธ๋ถ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ฑฐ๋ถํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ด ์ฌ์ฉ์๊ฐ ์ฑ ํฌ๊ธฐ์ ๋ํด ์ ์ ์๋ ๋ชจ๋ ๊ฒ์ ๋๋ค. ์ฑ์ ์ค์นํ ํ ์ฑ์ด ์ผ๋ง๋ ๋ง์ด ์ฌ์ฉํ๋์ง๋ ์ค์ํ์ง ์์ต๋๋ค. ์ค์น๋ฅผ ์ํด 125MB ์ด์์ ์ฌ์ ๊ณต๊ฐ์ด ํ์ํฉ๋๋ค.
๊ฐ๋ฅํ ๋ชจ๋ ์ํคํ ์ฒ๋ฅผ ํฌํจํ ์ ์๋๋ก ํ์ญ์์ค. ํ๋ ์ด ์คํ ์ด์ ์ ๋ก๋๊ฐ 250MB๊ฐ ๋๋ ์๊ด์์ต๋๋ค.
ํ๋ฌํฐ๊ฐ ์๋๋ก์ด๋ ํฐ์ ์ค์นํ๊ธฐ ์ํด ์ธ๋ถ ์ ์ฅ์์ ๊ธฐ๊ฐ๋ฐ์ดํธ ๊ณต๊ฐ์ ์ฌ์ฉํ๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ฆ, ํ๋ฌํฐ๊ฐ ์๋๋ก์ด๋ ํฐ์ ์ค์น์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๊ฒฝ์ฐ์ ๋๋ค.
flutter.gradle
์คํฌ๋ฆฝํธ๋ ๋ชจ๋ ABI๋ฅผ ์ต์ข
APK(Universal APK)์ ํฌํจํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถํ APK๋ฅผ ์ผ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Android ๋๊ตฌ๋ ์ฐ๊ฒฐ๋ ์ฅ์น์ ์
๋ก๋ํ ์ฌ๋ฐ๋ฅธ APK๋ฅผ ์ ํํ๊ณ ๋ชจ๋ ๊ฒ์ด ์ ์์
๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ต์ข
๋ฒ์ฉ APK๋ฅผ ํ๋ ์ด ์คํ ์ด์ ์
๋ก๋ํ๊ฑฐ๋ ๊ฐ ABI์ ๋ํ ๋ถํ APK๋ฅผ ์
๋ก๋ํ ์ ์์ต๋๋ค.
๊ทธ ๋์ ์๋ฃจ์
์ผ๋ก android\app
๋๋ ํ ๋ฆฌ์ build.gradle
๋งจ ์๋์ ์ด๊ฒ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
// Include both 32bit and 64bit arm libflutter.so files into your APK
project.afterEvaluate {
assembleRelease.doLast {
String src
if(project.hasProperty('target-platform') &&
project.property('target-platform') == 'android-arm64') {
// If we are building the 64bit then we also want to add the 32bit libflutter.so
src = "$flutterRoot/bin/cache/artifacts/engine/android-arm-release/flutter.jar"
}else{
// If we are building the opposite (32bit), we include the 64bit libflutter.so
src = "$flutterRoot/bin/cache/artifacts/engine/android-arm64-release/flutter.jar"
}
copy {
from zipTree(src)
include 'lib/*/libflutter.so'
into "$buildDir/intermediates/jniLibs/release/0/"
}
}
}
๋ํ ์ด๊ฒ์ buildTypes > release
์น์
์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฆด๋ฆฌ์ค APK์ ๋ ABI๊ฐ ๋ชจ๋ ํฌํจ๋ฉ๋๋ค.
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
@slightfoot ๊ณผ์ ๊ณต๋ ์์ ํ์ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์๊ฐํด
project.afterEvaluate {
assembleRelease.doFirst {
String src
if(project.hasProperty('target-platform') &&
project.property('target-platform') == 'android-arm64') {
// If we are building the 64bit then we also want to add the 32bit libflutter.so
src = "$flutterRoot/bin/cache/artifacts/engine/android-arm-release/flutter.jar"
}else{
// If we are building the opposite (32bit), we include the 64bit libflutter.so
src = "$flutterRoot/bin/cache/artifacts/engine/android-arm64-release/flutter.jar"
}
copy {
from zipTree(src)
include 'lib/*/libflutter.so'
into "src/main/jniLibs/"
eachFile {
it.path = it.path.replaceFirst("lib/", "")
}
}
}
}
์
๋ฐ์ดํธ: ๊ธฐ๊ธฐ์์ ์ด APK๋ฅผ ์คํํ๋ ค๊ณ ์๋ํ๋ฉด ์คํจํ๋ฏ๋ก ์คํ ๊ฐ๋ฅํ ์๋ฃจ์
์ด ์๋๋๋ค. ์ค๋ฅ๋ "Dart VM์ ์ด๊ธฐํํ๋ ๋์ ์ค๋ฅ ๋ฐ์: ์ค๋
์ท์ด ํ์ฌ VM ๊ตฌ์ฑ๊ณผ ํธํ๋์ง ์์:
์ค๋
์ท์๋ 'product use_bare_instructions no-"asserts' causal_async_stacks arm-eabi softfp'๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ VM์๋ '์ ํ ์ฌ์ฉ_bare_instructions no-"asserts' causal_async_stacks arm64-sysv'๊ฐ ์์ต๋๋ค.
์ ์๊ฒ ๋ค. ๋์ ์์น์ ๋ํ AOT ์ค๋ ์ท๋ ์ ์ฌ์ ์ผ๋ก ํฌํจํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๊ธ์ ์์ฐ ์๋์ ๋ฐฐ์นํ๊ณ ์ํคํ ์ฒ๋ณ ๋ฒ์ ์
libs
์๋์ ๋์ง ์์ต๋๋ค. AOT ์ค๋ ์ท์ ์ํคํ ์ฒ๋ณ libs ํด๋์ ๋ฃ์ ์ ์๋ค๋ฉด ์๋ํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๋ฐ ์ด์ ๋ก .aab ํ์์ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค.์ด์จ๋ add2app ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํ .AAR ๋น๋๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ด ์์ ์ ์ํํ๋ ค๊ณ ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฐ๋ฅผ๊ฑฐ์ผ.
@dnfield ์์ง ์ฑ๊ณตํ์ จ๋์?
ํ์ฌ ํ๋ฌ๊ทธ์ธ ์กฐ๊ฐ์ ํตํด ์์ ์ค์ ๋๋ค. ์ฐ๋ฆฌ๋ Android X ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฐ์ ์์์ ์ผ๋ถ๋ฅผ ์ป์ผ๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง ๋ ๋ง์ ๊ฒ์ด ๋์ฌ ๊ฒ์ ๋๋ค.
@gerryhigh ์ ๋ ์์ ์ด
๊ทธ๋ฌ๋ ํ์ฌ๋ก์๋ ์ ์ผํ ํด๊ฒฐ์ฑ ์ ๋น๋๋ฅผ ๋ ๋ฒ ์คํํ๊ณ ์ฌ๋ฌ APK๋ฅผ Play ์คํ ์ด์ ์ ๋ก๋ํ๋ ๊ฒ์ ๋๋ค.
flutter build apk --release --target-platform=android-arm
flutter build apk --release --target-platform=android-arm64
์ด๊ฒ์ split-APK๋ฅผ ํ์ฑํํ๋ฉด ๋ ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ https://developer.android.com/studio/build/configure-apk-splits ์์ ํ์ธํ ์ ์์ต๋๋ค.
@slightfoot ์, ์ด๊ฒ์ ๋ด ์๊ฒฌ์ ์ธ๊ธ๋ ๊ฒ์ฒ๋ผ ์ง๊ธ๊น์ง ์ฐพ์ ์ต๊ณ ์ ์๋ฃจ์ ์ ๋๋ค. https://github.com/flutter/flutter/issues/18494#issuecomment -477502287
@slightfoot ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ฉด ๋์
์ํคํ
์ฒ๋ง๋ค ๋น๋๋ ์ค๋
์ท์ด ๋ค๋ฆ
๋๋ค. ๋จ์ํ libflutter.so
์์ง์ ๋ณต์ฌํ๋ฉด ์ค๋
์ท์ ์ํคํ
์ฒ๊ฐ ํ๋ฌํฐ ์์ง์ ์ํคํ
์ฒ์ ์ผ์นํ์ง ์์ผ๋ฉด ์ค๋
์ท์ ๋ก๋ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ํ์ฌ๋ก์๋ ์ค๋
์ท ํ์ผ์ ๋ถ๋ฆฌํ๊ณ ๋ชจ๋ ์ํคํ
์ฒ์ ๋ํ ์ค๋
์ท ํ์ผ์ ํฌํจํ์ง ์๋ ํ ๋ชจ๋ ์ํคํ
์ฒ๋ฅผ ํฌํจํ๋ ๋ฒ์ฉ apk๋ฅผ ๋น๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ด๊ฒ ์ ๋ฌธ์ ์ธ์ง ์กฐ๊ธ ํท๊ฐ๋ฆฝ๋๋ค.
๋๋ฒ๊ทธ ๋น๋๋ x86_64, x86, armeabi-v7a ๋ฐ arm64-v8a์์ libflutter.so๋ฅผ ์์ฑํฉ๋๋ค.
๋ฆด๋ฆฌ์ค ๋น๋๋ ์ ํํ ๋์ผํด์ผ ํฉ๋๋ค.
AGP(Android Gradle Plugin)์๋ ์ด๋ฏธ ์ํคํ ์ฒ๋ฅผ ํํฐ๋งํ๋ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ๋ฆด๋ฆฌ์ค ๋น๋์ ๋ํด ์ด๋ฅผ ์ํํ๋ ค๋ ๊ฒฝ์ฐ build.gradle์ ์์ ํ ์ ์์ต๋๋ค.
@eseidel @dnfield ์ ๋ ์ด๊ฒ์ด Android App Bundle๋ก ํด๊ฒฐ๋์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์์ง ๊ธฐ๋ณธ Android ์ถ๋ ฅ์ด ์๋๋ฉฐ IDE์์ ์คํํ ๋ apk๊ฐ ๊ฝค ์ค๋ซ๋์ ์ฌ์ฉ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
AAB๋ Flutter๊ฐ libflutter.so์ ๋ชจ๋ ์ํคํ ์ฒ๋ฅผ ํฌํจํด์ผ ํ๋ ๋ ๋ค๋ฅธ ์ด์ ์ ๋๋ค. Play ์คํ ์ด์์ ์ฅ์น์ ์ ๋ฌํ๋ ์ํคํ ์ฒ๋ฅผ ํํฐ๋งํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
@athornz ๋ฌธ์ ๋ libflutter.so
์๋๋ผ AOT snapshot
๋๋ฒ๊ทธ ๋น๋๋ก ์ปดํ์ผ๋๋ dart ์ฝ๋๊ฐ Dart VM์ ํฌํจํ๋ฏ๋ก ๋ชจ๋ dart ์ฝ๋๊ฐ VM์์ JIT
์คํ๋ฉ๋๋ค. ํ์ง๋ง ๋ฆด๋ฆฌ์ค ๋น๋๋ dart ์ฝ๋๋ฅผ ์ค๋
์ท์ผ๋ก ์ปดํ์ผํ๊ณ ํด๋น ์ค๋
์ท์ ์์ฐ ํด๋์ ๋ฃ์ต๋๋ค. ์ด์์ ์ผ๋ก๋ ๊ฐ ์ํคํ
์ฒ์ ๋ํด ์ค๋
์ท์ ์ปดํ์ผํ๊ณ libflutter.so
์์ ๋ฐฐ์นํด์ผ ํ์ง๋ง ํ์ฌ๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ์ํคํ
์ฒ์ ๋ํด libflutter.so
๋ฅผ ํฌํจํ ์ ์์ง๋ง ์ค๋
์ท์ ์ปดํ์ผ๋ ์ํคํ
์ฒ์ ๋ํด์๋ง ์๋ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ณํ์ด ์์ต๋๊น?
Google Play ์คํ ์ด๋ ๊ฐ๋ฐ์์๊ฒ 2019๋ 8์ 1์ผ ์ดํ์ 64๋นํธ ์ง์์ ์ ๊ณตํ๋๋ก ์์ฒญํฉ๋๋ค.
https://android-developers.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html
64๋นํธ ์๊ตฌ ์ฌํญ: ๊ฐ๋ฐ์์๊ฒ ์๋ฏธํ๋ ๊ฒ
2019๋ 8์ 1์ผ๋ถํฐ:
_๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ํฌํจํ๋ ๋ชจ๋ ์ ์ฑ ๋ฐ ์ฑ ์ ๋ฐ์ดํธ๋ Google Play์ ๊ฒ์ํ ๋ 32๋นํธ ๋ฒ์ ์ธ์ 64๋นํธ ๋ฒ์ ์ ์ ๊ณตํด์ผ ํฉ๋๋ค._
ํ์ฅ: Google Play๋ 2021๋ 8์๊น์ง Unity 5.6.6 ๋๋ ์ด์ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ธฐ์กด ๊ฒ์์ ๋ํ 32๋นํธ ์ ์ฉ ์ ๋ฐ์ดํธ๋ฅผ ๊ณ์ ์๋ฝํฉ๋๋ค.
2021๋ 8์ 1์ผ๋ถํฐ:
Google Play๋ 64๋นํธ ์ง์ ๊ธฐ๊ธฐ์์ 64๋นํธ ๋ฒ์ ์ด ์๋ ์ฑ ์ ๊ณต์ ์ค๋จํฉ๋๋ค. ์ฆ, ํด๋น ๊ธฐ๊ธฐ์ Play ์คํ ์ด์์ ๋ ์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์๋ Unity 5.6.6 ๋๋ ์ด์ ๋ฒ์ ์ผ๋ก ๋น๋๋ ๊ฒ์์ด ํฌํจ๋ฉ๋๋ค.
@trevorwang ์ด๋ฏธ 64๋นํธ๋ฅผ ๋น๋ํ๊ณ 32๋นํธ์ ํจ๊ป Play ์คํ ์ด์ ์ ๋ก๋ํ ์ ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
@slightfoot ๋ ๋ค๋ฅธ 64๋นํธ APK๋ฅผ ๋น๋ํ๊ณ Google Play์ ์ ๋ก๋ํด์ผ ํ๋ค๋
์์๋ค์ํผ Google Play๋ ์ค๊ตญ ๋ณธํ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ชจ๋ ํ๋ซํผ์ ์ง์ํ๋ ค๋ฉด ๋ฒ์ฉ APK๋ฅผ ์ ํธํฉ๋๋ค.
@trevorwang ๊ฝค ๋ง์ด. ์ด๊ฒ์ด ๋ด๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋๋ค https://github.com/flutter/flutter/issues/18494#issuecomment -477502287
๋ถํ ์ gradfle ํ์ผ์์ ์๋ํ์ง ์์ต๋๋ค. flutter๊ฐ ๋ค๋ฅธ ์ํคํ ์ฒ๋ฅผ ์ปดํ์ผํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์๋๋ก build.gradle ํ์ผ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ์ํํด์ผ ํฉ๋๋ค. ๋๋ Google Play์์ ๋ ๋ฒ์งธ ์ปดํ์ผ์ ๊ฑฐ๋ถํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค @edTheGuy00
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ค๊ตญ ์์ฅ์ ์ํ ๋ชจ๋ bis๋ฅผ ํฌํจํ๋ ๋ฒ์ฉ APK๊ฐ ์ ๋ง๋ก ํ์ํฉ๋๋ค.
@trevorwang ๊ฐ ๋์์ ๋ํด ๋น๋ํ๊ณ ๊ฐ APK์ ์ํคํ ์ฒ๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋๋ถ๋ถ์ APK ๋ฏธ๋ฌ ์ฌ์ดํธ์์ ์ํ๋๋ ๋ฐฉ์์ ๋๋ค.
64๋นํธ ์ ํ์ Google Play ์คํ ์ด์ ์ ํ์ผ ๋ฟ์ ๋๋ค. armeabi-v7a ์ ์ฉ APK๋ฅผ ๊ณ์ ๋ฐฐํฌํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ์ฌ๋์ด ์ฑ์ ์คํํ ์ ์์ต๋๋ค.
์ํคํ ์ฒ๋ณ๋ก ๋ณ๋์ APK๋ฅผ ๋น๋ํ๋ ๊ฒ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ฉฐ ๋ชจ๋ ์ฌ๋์ ์ํ ์๋ฃจ์ ์ ์๋๋๋ค.
Google Play 64๋นํธ ์ ํ์ด ์ ์ฉ๋๋ฉด ์ด ๋ฌธ์ ๋ ๋๋ถ๋ถ์ Flutter ๊ฐ๋ฐ์์๊ฒ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก ํ๋์ apk/๋ฒ๋ค ๋ด์์ ์ฌ๋ฌ ์ํคํ ์ฒ๋ฅผ ํ์ฉํ๋ ์๋ฃจ์ ์ด ์ ๋ง๋ก ํ์ํฉ๋๋ค.
๋น ๋ฅธ ์๋ฆผ
Flutter ํ์ GitHub ๋ฌธ์ ์ "Thumbs-up" ์๋ฅผ ์ฐ์ ์์์ ๋ํ ์ง์นจ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
์ ๋ ์ด ๋ฌธ์ ๊ฐ ์ฐ์ ์์๊ฐ ๋์์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@gerryhigh ์ @slightfoot ์ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค
๊ธฐ์กด ์ฑ์ ํ๋ฌํฐ๋ฅผ ์ถ๊ฐํ๊ณ ๋ค์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
_ํธ์คํธ ํ๋ก์ ํธ์ ์ฑ ๋ชจ๋์ ์ด๊ฒ์ ์ถ๊ฐํ์ธ์._
๋๋ฒ๊ทธ ๋ชจ๋์ฉ ์คํฌ๋ฆฝํธ์ด๋ฏ๋ก ๋ฆด๋ฆฌ์ค์ ๋ง๊ฒ ๋ณ๊ฒฝํ์ญ์์ค.
project.afterEvaluate {
assembleDebug.doLast {
def flutterRoot = System.getenv("FLUTTER_HOME")
def archTypes = ["arm", "arm64"]
archTypes.forEach { item ->
copy {
from zipTree("$flutterRoot/bin/cache/artifacts/engine/android-$item/flutter.jar")
include 'lib/*/libflutter.so'
into "$buildDir/intermediates/jniLibs/debug/"
eachFile {
it.path = it.path.replaceFirst("lib/", "")
}
}
}
}
}
์ต๊ทผ ๊ฐ๋ฐ ์ฌํญ์ด ์์ต๋๊น?
๋ด๊ฐ ์ํ๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ๊ฒฐ๊ตญ ํ ์ผ
1
๋๋ 2
๋ฒ์ ์๋๋ก ๋ฒ์ ์ฝ๋์ ๋์ 1004
๋๋ค 10041
์์๊ณผ 10042
arm64๋ฅผ ๋ค์ด.ext.platformCodes = ['android-arm': 1, 'android-arm64' : 2]
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
int code = 0
if (project.hasProperty('target-platform')) {
code = project.ext.platformCodes.get(project.property('target-platform'))
}
output.versionCodeOverride = variant.versionCode * 10 + code
}
}
flutter clean; flutter build apk --release --target-platform=android-arm; mv build/app/outputs/apk/release/app-release.apk build/app/outputs/apk/release/app-release-arm32.apk; flutter build apk --release --target-platform=android-arm64; mv build/app/outputs/apk/release/app-release.apk build/app/outputs/apk/release/app-release-arm64.apk;
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ทธ๋์ ์ด๊ฒ์ ๋ด๊ฐ ๊ฒช๊ณ ์๋ ๋ฌธ์ ์ด๊ธฐ๋ ํฉ๋๋ค. apk ๋์ ์ฑ ๋ฒ๋ค์ ๋น๋ํ๊ณ ์์ผ๋ฉฐ Google์ ์ ๋ก๋ํ ๋ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ๊ณ ์ํ ํ ์คํธ๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ํ๊ธฐ ์ํด codemagic์ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ๊ทธ๊ฒ์ ์๋ช ํ๊ณ ๊ทธ๊ฒ์ ๋ฌถ์์ ๋ฃ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๋๋ codemagic์ ์ฌ์ฉํ์ฌ ์ ์ ์ฐ์ต๋๊น?
๋๋ ์ ํ ์กด์ฌํด์๋ ์๋๋ค๊ณ ์๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํด ์์ต๋๋ค.
์ด๊ฒ์ด ์ด๋ป๊ฒ ์ด์ ํ "๋ชฉํ"์ ์๋ ๊ฒ์ ๋๊น?
P2: ์ด๊ฒ๋ค์ ์ฐ๋ฆฌ๊ฐ ํฅํ ๋ช ๋ ๋์ ๊ณ ์น ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ๋ ์์ ์ ๋๋ค. ์ฌ๊ธฐ์๋ ๊ด๋ฒ์ํ ์๋น์ ๋์ ์ฑ์ ์์ ํ ๋ฐฐ์ก์ ์ฐจ๋จํ ์ ์๋ ํ์ธ๋ ๋ฌธ์ , ์ ํ์ฑ ๋ฌธ์ , ์ธ๋ จ๋ฏธ ๋ฐ ํ์ง๊ณผ ๊ด๋ จ๋ ๋ฒ๊ทธ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ด ์ด์ ํ์ ๋ ์ง๋ ์์ ํ ์์์ ์ด๋ฉฐ ์ด์ ํ๋ฅผ ์ ์ ํ๊ฒ ์ ๋ ฌํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
์ด๋ฏธ ์ค์ํ ๋ฌธ์ ์ด๋ฉฐ Google์ด 64๋นํธ ์ ํ์ ์ ์ฉํ๋ฉด ์ฌํด ํ๋ฐ์ ์ ๋ฉด์ ์ธ ์ผ ์คํ ํผ๊ฐ ๋ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ ์ด์ ํ๋ฅผ ์ธ์ ๋ค. ์์ง ํ์คํ ๋ ์ง๊ฐ ์์ต๋๋ค.
๋ถ๋ช ํ ๊ฒ์ ์ค๋๋ ์๋ก์ด ์ง์นจ์ ์ค์ํ๋ ๊ฒ์ ๊ฐ๋ฅํ์ง๋ง ์ด๋ ต์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ณ ์ ํฉ๋๋ค.
๊ทธ๋์ @andreidiaconu ๋ฐฉ๋ฒ์ ์๋์ผ๋ก ์ฑ์ ๋น๋ํ๋ ํ ์ ์๊ฒ
ํ์ง๋ง ์ ๋ codemagic์ ์ฌ์ฉํ์ฌ ๋น๋ํ๊ณ ๋ฐฐํฌํ์ต๋๋ค.
์ด๊ฒ์ ๋ญ๋น์ ๋๋ค. Flutter๋ ์ด๊ฒ์ ๊ตฌ์ถํด์ผ ํฉ๋๋ค.
ํ์ฌ ๋๋ ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๊ฒ์ด ๋ณต์กํด๋ ๋ณ๋ก ๊ฐ์์น โโ์๋๋ค. ๋ณต์กํ ๊ฒฝ์ฐ ์คํฌ๋ฆฝํธ์ ์ํด ์๋ํ๋ฉ๋๋ค. ๋ฌธ์ ๋ ๊ทธ๊ฒ์ด ๊ฐ๋ฅํ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ Google Play Console์์ ๊ฒฝ๊ณ ํ๋์ง์ ๋๋ค.
์ด ๋ฆด๋ฆฌ์ค๋ Google Play 64๋นํธ ์๊ตฌ์ฌํญ์ ์ค์ํ์ง ์์ต๋๋ค.
๋ค์ APK ๋๋ App Bundle์ 64๋นํธ ๊ธฐ๊ธฐ์์ ์ฌ์ฉํ ์ ์์ง๋ง 32๋นํธ ๊ธฐ๋ณธ ์ฝ๋๋ง ์์ต๋๋ค. 6.
2019๋ 8์ 1์ผ๋ถํฐ ๋ชจ๋ ๋ฆด๋ฆฌ์ค๋ Google Play 64๋นํธ ์๊ตฌ ์ฌํญ์ ์ค์ํด์ผ ํฉ๋๋ค.
์ฑ์ 64๋นํธ ๋ฐ 32๋นํธ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ํฌํจํฉ๋๋ค. Android App Bundle ๊ฒ์ ํ์์ ์ฌ์ฉํ์ฌ ๊ฐ ๊ธฐ๊ธฐ ์ํคํ ์ฒ๊ฐ ํ์ํ ๊ธฐ๋ณธ ์ฝ๋๋ง ์์ ํ๋๋ก ์๋์ผ๋ก ํ์ธํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฑ์ ์ ์ฒด ํฌ๊ธฐ๊ฐ ์ปค์ง๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ๋ฒ์ ์ฝ๋๊ฐ ํ์ํ ์๋ฃจ์ ์ ์ํ์ง ์๊ณ Android App Bundle(AAB)์์ ์๋ํ๋ ์๋ฃจ์ ์ ์ํฉ๋๋ค.
๊ฒฝ๊ณ
์ด ๋ฆด๋ฆฌ์ค๋ Google Play 64๋นํธ ์๊ตฌ์ฌํญ์ ์ค์ํ์ง ์์ต๋๋ค.
๋ค์ APK ๋๋ App Bundle์ 64๋นํธ ๊ธฐ๊ธฐ์์ ์ฌ์ฉํ ์ ์์ง๋ง 32๋นํธ ๊ธฐ๋ณธ ์ฝ๋๋ง ์์ต๋๋ค. 3.
์ด๋ค ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
๋๋ ์ด๊ฒ์ ์ด์ ํ๋ฅผ ์ธ์ ๋ค. ์์ง ํ์คํ ๋ ์ง๊ฐ ์์ต๋๋ค.
๋ถ๋ช ํ ๊ฒ์ ์ค๋๋ ์๋ก์ด ์ง์นจ์ ์ค์ํ๋ ๊ฒ์ ๊ฐ๋ฅํ์ง๋ง ์ด๋ ต์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ณ ์ ํฉ๋๋ค.
apk ๋ฐ App Bundle ๋ชจ๋์ ๋ํด ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ผ๋ก ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๊น? ์ง๊ธ๊น์ง ๋ด๊ฐ ๋ณธ ๊ฒ์ ์ฝ๋์ ๊ตฌ์ฑ์ ๋ฌถ์์ผ๋ก ์ด๋์ ๋ฃ์ด์ผ ํ ์ง ์ ํํ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ํ์ฐฉ์ค๋ฅผ ๊ฑฐ์ณ์ผ ์์๋ผ ์ ์๊ฒ ์ง๋ง ์ด์์ ์ด์ง๋ ์์ต๋๋ค.
๊ฐ์ ๋ฌธ์
@gerryhigh ์ @slightfoot์ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค
๊ธฐ์กด ์ฑ์ ํ๋ฌํฐ๋ฅผ ์ถ๊ฐํ๊ณ ๋ค์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
_ํธ์คํธ ํ๋ก์ ํธ์ ์ฑ ๋ชจ๋์ ์ด๊ฒ์ ์ถ๊ฐํ์ธ์._๋๋ฒ๊ทธ ๋ชจ๋์ฉ ์คํฌ๋ฆฝํธ์ด๋ฏ๋ก ๋ฆด๋ฆฌ์ค์ ๋ง๊ฒ ๋ณ๊ฒฝํ์ญ์์ค.
project.afterEvaluate { assembleDebug.doLast { def flutterRoot = System.getenv("FLUTTER_HOME") def archTypes = ["arm", "arm64"] archTypes.forEach { item -> copy { from zipTree("$flutterRoot/bin/cache/artifacts/engine/android-$item/flutter.jar") include 'lib/*/libflutter.so' into "$buildDir/intermediates/jniLibs/debug/" eachFile { it.path = it.path.replaceFirst("lib/", "") } } } } }
์ด ์๋ฃจ์ /ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ์ ๋งํด ๋ณด์ ๋๋ค. @trevorwang ๊ฐ์ฌ
์ด ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ ์ ์์ต๋๋ค. ์๋๋ฅผ ์ฐธ์กฐํ์ธ์.
@trevorwang ๋ต๋ณ ๋ฐ @noinskit ์ ์ ๋๋ถ์ ์๋์ ํ์๋ ./android/app/build.gradle
์ฝ๊ฐ์ ์ถ๊ฐ์ ํจ๊ป ๋ฆด๋ฆฌ์ค ๋น๋์ 64๋นํธ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ ์ ์์์ต๋๋ค.
์ฌ๊ธฐ ์์ ์ ์ฒด ํ์ผ์ ๋ณผ ์๋ ์์ต๋๋ค.
afterEvaluate {
mergeReleaseJniLibFolders.doLast {
def archTypes = ["arm-release", "arm64-release"]
archTypes.forEach { item ->
copy {
from zipTree("$flutterRoot/bin/cache/artifacts/engine/android-$item/flutter.jar")
include 'lib/*/libflutter.so'
into "$buildDir/intermediates/jniLibs/release/"
eachFile {
it.path = it.path.replaceFirst("lib/", "")
}
}
}
}
}
@SPodjasek ๊ฐ์ฌํฉ๋๋ค! ๋๋ ๋น์ทํ ๊ฒ์ ๋์ฐฉํ์ต๋๋ค. ์ ๊ฒฝ์ฐ์๋ ์ค๋ํซ์ assembleRelease
๋ฅผ mergeReleaseJniLibFolders
๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ถ๊ฐ *.so ํ์ผ์ด "intermediates/..." ์๋์ ์์ง๋ง ์ต์ข
apk์๋ ์์ต๋๋ค.
@noinskit ๋ด ์ด์ ์๋ฃจ์
์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ๊ฒ ๊ฐ์ต๋๋ค. flutter clean
์คํํ ํ 32๋นํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก aab๋ฅผ ์์ฑํ์ต๋๋ค. assembleRelease
๋ฅผ mergeReleaseJniLibFolders
๊ต์ฒดํ๋ฉด ๋น๋๊ฐ true๋ก ์ ๋ฆฌ๋ ํ์๋ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@SPodjasek ๋ค๋ฅธ ์ต์ ์ ์กฐ์ ํด์ผ ํฉ๋๊น?
์ฌ๊ธฐ ๋ด app.gradle์ด ์์ต๋๋ค.
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
afterEvaluate {
mergeReleaseJniLibFolders.doLast {
def archTypes = ["arm-release", "arm64-release"]
archTypes.forEach { item ->
copy {
from zipTree("$flutterRoot/bin/cache/artifacts/engine/android-$item/flutter.jar")
include 'lib/*/libflutter.so'
into "$buildDir/intermediates/jniLibs/release/"
eachFile {
it.path = it.path.replaceFirst("lib/", "")
}
}
}
}
}
๋ด ์ค๊ฐ/jniLibs/release/ arm64-v8a ๋ฐ armeabi-v7a ๋๋ ํ ๋ฆฌ ๋ชจ๋ ์์๋๋ก libflutter.so ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ์ต์ข ๋ฆด๋ฆฌ์ค APK์๋ ์ฌ์ ํ arm64-v8a์์ libflutter.so๊ฐ ๋๋ฝ๋์ด ์์ต๋๋ค.
์ฌ๊ธฐ ์คํฌ๋ฆฐ์ท์ด ์์ต๋๋ค
@function1983 ์ฌ๊ธฐ์์ ๋ด ์ ์ฒด build.gradle
์์ต๋๋ค .
๋ด ํ๋ฌํฐ ๋ฒ์ :
[โ] Flutter (Channel beta, v1.5.4, on Linux, locale pl_PL.UTF-8)
โข Flutter version 1.5.4 at .../development/flutter
โข Framework revision b593f5167b (2 weeks ago), 2019-04-22 07:51:33 -0700
โข Engine revision ca31a7c57b
โข Dart version 2.3.0 (build 2.3.0-dev.0.1 cf4444b803)
[โ] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
โข Android SDK at .../Android/Sdk
โข Android NDK location not configured (optional; useful for native profiling support)
โข Platform android-28, build-tools 28.0.3
โข Java binary at: .../development/android-studio/jre/bin/java
โข Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1343-b16-5323222)
โข All Android licenses accepted.
[โ] Android Studio (version 3.4)
โข Android Studio at .../development/android-studio
โข Flutter plugin version 35.2.1
โข Dart plugin version 183.6270
โข Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1343-b16-5323222)
@SPodjasek ์ ์๋ฃจ์ ์ ์ฌ์ฉํ์ฌ 64๋นํธ ๋ฐ 32๋นํธ ๋ฒ์ ์ ๋ชจ๋ ํฌํจํ๋ ์ฑ ๋ฒ๋ค์ ๋น๋ํ๋ ค๊ณ ํ์ต๋๋ค. ์ฑ๊ณต์ ์ผ๋ก ๋น๋๋๊ณ Google Play Console์ ์ ๋ก๋ํ ์ ์์ผ๋ฉฐ 32๋นํธ ๋ฐ 64๋นํธ ํด๋ํฐ ๋ชจ๋์ ์ค์นํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ค ์ด์ ๋ก Android-arm64 ๊ธฐ๊ธฐ์์ ์ฑ์ ์คํํ๋ฉด ์ฑ์ด ์ถฉ๋ํฉ๋๋ค.
๋ค์์ 64๋นํธ ์ฅ์น์์ ๋ฐ์ํ๋ ์ค๋ฅ์ ๋๋ค.
์ค๋จ ๋ฉ์์ง: '[ ์น๋ช ์ :flutter/runtime/dart_vm.cc (416)] Dart VM ์ด๊ธฐํ ์ค ์ค๋ฅ: ์ค๋ ์ท์ด ํ์ฌ VM ๊ตฌ์ฑ๊ณผ ํธํ๋์ง ์์: ์ค๋ ์ท์๋ 'product use_bare_instructions no-"asserts" causal_async_stacks arm-eabi softfp๊ฐ ํ์ํฉ๋๋ค. ' ํ์ง๋ง VM์๋ '์ ํ use_bare_instructions no-"asserts' causal_async_stacks arm64-sysv'๊ฐ ์์ต๋๋ค.
๋ด๊ฐ ๋ฌด์์ ํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค... ์ง๊ธ์ 64๋นํธ ์ฅ์น๋ง ์ง์ํด์ผ ํ ์๋ ์์ต๋๋ค.
@Torrunt ํด๋น ์ค๋ฅ๋ ์์ง์ด 32๋นํธ์ฉ AOT ์ค๋ ์ท์ ๋ก๋ํ๊ณ 64๋นํธ์ฉ AOT ์ค๋ ์ท์ ์ฐพ์ผ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์์ ์์ ์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ถํ ํ ์ ์๋๋ก ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ํฌํจํ๋ AAB๋ฅผ ์์ฐํ ์ ์๋๋ก ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
@SPodjasek ์ฌ์ฉ ์ด 15.7 MB๋ก 11.1 MB์์ ๋ด ์ฑ release.apk ํ์ผ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ
@SPodjasek ์ฌ์ฉ ์ด 15.7 MB๋ก 11.1 MB์์ ๋ด ์ฑ release.apk ํ์ผ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ
์, 32 ๋ฐ 64๋นํธ์ ๋ํด libflutter.so
๋ฅผ ๊ฐ์ ๋ก ํฌํจํฉ๋๋ค. ํ์ํ์ง ์๋ค๋ฉด ํ์ฌ ๊ธฐ๋ณธ๊ฐ์ ์ ์งํ์ฌ 32๋นํธ๋ง ํฌํจํ๊ณ Flutter ํ์ด ์ด๋ฅผ ์ ์ ํ ์ฒ๋ฆฌํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ธ์.
๋ช ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
--target-platform
๋ฅผ ์ฌ์ฉํ์ฌ android-arm
๋ฐ android-arm64
๋ณ๋๋ก ๋น๋ํ๊ณ ๋ ๊ฐ์ APK๋ฅผ ์
๋ก๋ํ๋ ์ฌ๋๋ค์ ์ํ ์ฐธ๊ณ ์ฌํญ์
๋๋ค.
์ผ๋ถ ํ๋ฌ๊ทธ์ธ์ ๋ ๋ค ๋์์ผ๋ก ํ ์ ์๋ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉฐ, flutter๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋๋ฅผ ํํฐ๋งํ์ง ์์ผ๋ฏ๋ก "32๋นํธ" APK๊ฐ ์ค์ ๋ก arm64๋ ๋์์ผ๋ก ํ๊ณ libflutter.so๊ฐ ์๊ณ AOT ์ค๋
์ท์ด ์์ผ๋ฏ๋ก ์ถฉ๋ํฉ๋๋ค. armv7์ฉ์ผ๋ก ์ ์๋์์ต๋๋ค.
๋ฐ๋ผ์ build.gradle ํ์ผ์์ ๋์ abi๋ฅผ ์ค์ ๋ก ๋ช ์์ ์ผ๋ก ํํฐ๋งํด์ผ ํฉ๋๋ค.
flutter build apk --target-platform ...
๋
ผ๋ฆฌ์ ์ผ๋ก ์ด ํํฐ๋ง์ ์ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@SPodjasek ์ ์๋ฃจ์
์ ์ฌ์ฉํ์ฌ arm-eabi
๋ arm64-sysv
์ผ์น์ ๋ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋๋ฅผ ์ํด ์ผํ ์ต๊ณ ์ ์๋ฃจ์
์ ์ด๊ฒ์ด ๋ชจ๋ ์ ๋ฆฌ๋ ๋๊น์ง ๋น๋ถ๊ฐ 32๋นํธ์ฉ์ผ๋ก ๊ตฌ์ถํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค( @swavkulinski ์ ์๋ฃจ์
here ).
app
๋ ๋ฒจ build.gradle
:
android {
// ...
buildTypes {
release {
// ...
ndk {
abiFilters "armeabi-v7a"
}
}
}
}
์ฃผ์ ์ ๋ฌธ์ ์์ฝ - armeabi-v7a ๋ฐ arm64-v8a ๋ชจ๋์ ๋ํด ์ด๋ฌํ APK๋ฅผ ๋น๋ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. Flutter๋ ABI์ ์์กดํ๋ AOT ์ค๋
์ท์ ์ฌ์ฉํ๋ฏ๋ก APK์์๋ง ๊ฐ๋ฅํ ์๋ฃจ์
์ ์ฌ๋ฌ APK ๋น๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
ํด๊ฒฐ์ฑ
์ ํ์ฌ ์ผ๋ถ ๋ฌธ์ (#31922)๊ฐ ์๋ App Bundle์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
#32787์ด ๋ณํฉ๋ ํ ์ด์ App Bundle์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Android Studio๋ฅผ ํตํด Android ์ฑ ๋ฒ๋ค์ ์์ฑํ ๋ ํ๋ ์ด๋ฒ์ ๋์ ํ์ผ(์: -t lib/another_main.dart)์ ์ด๋ป๊ฒ ์ค์ ํฉ๋๊น? ์ค
์ด๊ฒ์ https://github.com/flutter/flutter/pull/32787 ์ด ๋ณํฉ๋ ํ flutter build appbundle
๋ฅผ ํตํด ์ง์๋ฉ๋๋ค!
@swavkulinski apk๋ฅผ ํ๋ ์ด์คํ ์ด์ ์ด๋ป๊ฒ ์ถ์ํ์๊ฒ ์ต๋๊น?
๊ทธ๋๋ ์ฌ์ ํ ๊ฐ๋ฅํ์ต๋๋ค. ์ด์ 64๋นํธ๋ก ์ ํํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ 32๋นํธ ์ ์ฉ์ธ ํ์ฌ NDK ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ ๊ฒผ์ต๋๋ค.
@๋ธ๋ผ์คํ
flutter build apk --release
๋ํ ์ง์๋ ์ถ๊ฐ๋ฉ๋๊น? ์๋๋ฉด ์ฅ๊ธฐ์ ์ผ๋ก ์ฑ ๋ฒ๋ค์ ์ํด APK ์ง์์ ๋จ๊ณ์ ์ผ๋ก ์ค๋จํ ๊ณํ์
๋๊น? ๋๋ ๋ฑ๋ฑํ APK์ ์๋์ ์ธ ๋จ์์ฑ์ ์์ฃผ ์ข์ํฉ๋๋ค.
@zimmi ๋ง์ต๋๋ค. App Bundle์ ์์ผ๋ก ๋์๊ฐ ๋ฐฉํฅ์ด ๋์ด์ผ ํฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ flutter build apk --release
๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. AAB์ ๋นํด ๋ฑ๋ฑํ APK์์ ๋ ๊ฐ๋จํ ๊ฒ์ ๋ฌด์์
๋๊น?
AAB์ ๋นํด ๋ฑ๋ฑํ APK์์ ๋ ๊ฐ๋จํ ๊ฒ์ ๋ฌด์์ ๋๊น?
AAB๋ ์ค์น ํ์ผ์ด ์๋๋๋ค. ์๋๋ก์ด๋ ์์ฒด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. Google Play ์คํ ์ด ์ ์ฉ ํ์ผ ํ์์ ๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ apk๊ฐ ํ์ํฉ๋๋ค.
๋ด๊ฐ ์ฐธ์กฐ. ๋ฐฐ๊ฒฝ ๊ฐ์ฌํฉ๋๋ค.
๋ํ bundletool ์ ์ฌ์ฉํ์ฌ AAB์์ APK๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค.
@๋ธ๋ผ์คํ
ํ์ธํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
๋จ์์ฑ ์ฃผ์์ ๊ดํ์ฌ: @audkar๊ฐ ๋งํ ๊ฒ. ๋ํ AAB๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ ์์ฐ ๋๋ฝ์ผ๋ก ์ธํ ์ ์ฌ์ ์คํจ ์๋๋ฆฌ์ค์ ๋ํด ์๊ฐํด์ผ ํฉ๋๋ค. ๊ฐ๋ฅํ ๋ชจ๋ ์ฅ์น ๊ตฌ์ฑ์ ๋ํ ํ
์คํธ๋ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํ๋ก๋์
ํ๊ฒฝ์ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ฑ ํฌ๊ธฐ๋ ์ผ๋ถ ์ฌ๋๋ค์ด ๋ง์์ ํํ๋ฅผ ์ํด ์ง๋ถํ ์ํฅ์ด ์๋ ๊ฐ๊ฒฉ์ผ ์ ์์ต๋๋ค.
๋๋ ์ด ๋ฌธ์ ๋ณด๋ค ๊ฐ ์ ๊ทผ ๋ฐฉ์์ ์ฅ์ ์ ๋ ผ์ํ๊ธฐ์ ๋ ์ข์ ๊ณณ์ด ์๋ค๊ณ ํ์ ํ์ง๋ง, ๋๋ ๊ทธ๊ฒ์ ํ์ ์ํค๊ณ ์ถ์ง ์์ต๋๋ค.
/cc @jonahwilliams build apk
์์ fat APK๋ฅผ ์ง์ํด์ผ ํ ์๋ ์์ต๋๋ค.
build apk
์ ๊ธฐ๋ณธ๊ฐ๋ ๋ณ๊ฒฝํด์ผ ํฉ๋๊น?
Fat apk ์ง์์ ๋ฐ๋์ ํ์ํฉ๋๋ค. ์์ง App Bundle์์ ์๋ํ์ง ์๋ ๋ง์ ๋๊ตฌ(๋ฒ ํ ๋ฐฐํฌ ๋ฑ)๊ฐ ์์ต๋๋ค.
flutter build appbundle
์ด(๊ฐ) ์ด์ ๋ง์คํฐ์
๋๋ค. ์๋ฐ์ ์ผ๋ก ์๋ํ๊ณ ์ถ์ ์ฌ๋์ด ์์ต๋๊น?
build apk
์ ํ๋ซํผ ๋ชฉ๋ก์ ์ง์ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ํ ๋ก ์ ํ์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค. flutter build apk --target-platform android-arm,android-arm64
@blasten ๋ง์คํฐ ์ฑ๋๋ก ์ ํํ๊ณ ์ฑ ๋ฒ๋ค์ ์ ๊ทธ๋ ์ด๋ํ๊ณ ๋น๋ํ๋๋ฐ ์ ์๋ํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ๋ ์ด ์ฝ์์ ์ ๋ก๋ํ๋ฉด ๋ชจ๋ ๊ฒฝ๊ณ ๊ฐ ์ฌ๋ผ์ง๋๋ค. (๋งฅOS 10.14.4)
์์ฒญ๋! ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ ํ ์ค๋ ๋ฐค ๋น๋๋ฅผ ์ปดํ์ผํฉ๋๋ค.
๋ฒ๋ค์ด ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฑ์ ๋ค์ด๋ก๋ํ ๋ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
Issue: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mattetti.sounds/com.mattetti.sounds.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.mattetti.sounds.MainActivity" on path: DexPathList[[zip file "/data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/base.apk", zip file "/data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/split_config.arm64_v8a.apk", zip file "/data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/split_config.xxhdpi.apk"],nativeLibraryDirectories=[/data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/lib/arm64, /data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/base.apk!/lib/arm64-v8a, /data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/split_config.arm64_v8a.apk!/lib/arm64-v8a, /data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/split_config.xxhdpi.apk!/lib/arm64-v8a, /system/lib64]]
com.mattetti.sounds.MainActivity
์ด ๋ฒ๋ค์ ์๋ ๊ฒ ๊ฐ์ต๋๊น?
์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ๋๋ฐ ์ ๊ฑฐ๋ ์ด์ ๋ฅผ ์ด๋ป๊ฒ ํ์ธํ ์ ์์ต๋๊น?
@mattetti Flutter ๋ชจ๋ ์ ์ฌ์ฉํ๊ณ ์์ต๋๊น? MainActivity
์ด FlutterActivity
ํฉ๋๊น?
@๋ธ๋ผ์คํ
์ฌ๊ธฐ ๋ด ์ข
์์ฑ์ด ์์ต๋๋ค.
environment:
sdk: ">=2.2.2 <3.0.0"
dependencies:
flutter:
sdk: flutter
rxdart: ^0.22.0
shared_preferences: ^0.5.2
http: ^0.12.0
cached_network_image: ^0.8.0
url_launcher: ^5.0.2
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter_launcher_icons: "^0.7.0"
dependency_overrides:
# requried for flutter_icons at this point
image: 2.0.7
๊ทธ๋ฌ๋ ๋๋ ๋ํ ๋ฐฉ๊ธ ๋ด ์ฑ ํจํค์ง์ ์ด๋ฆ์ ๋ณ๊ฒฝํ์ง๋ง ์ฌ์ ํ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ android/app/src/main/java/com/example/old_name/
MainActivity.java
ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ค๋ ๊ฒ์ ์์์ฐจ๋ ธ์ต๋๋ค. ๋ด์ผ์ ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํ๊ณ ๋ค๋ฅธ ๋ฒ๋ค์ ํธ์ํ๋ ค๊ณ ํฉ๋๋ค.
์๋ ํ์ธ์ @blasten ,
[ +48 ms] FAILURE: Build failed with an exception.
[ +3 ms] * What went wrong:
[ ] Failed to capture snapshot of input files for task ':app::flutter:package:packLibsDevRelease' property
'rootSpec$2$1' during up-to-date check.
[ ] > java.io.IOException: The filename, directory name, or volume label syntax is incorrect
[ ] * Try:
[ ] Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log
output. Run with --scan to get full insights.
[ ] * Get more help at https://help.gradle.org
[ ] Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
[ ] See https://docs.gradle.org/4.6/userguide/command_line_interface.html#sec:command_line_warnings
[ ] BUILD FAILED in 1m 28s
๋ด ํ๋ก์ ํธ๋ ํ๋ ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๊ณ ์ด๊ฒ์ ๋ด๊ฐ ์คํํ๋ ๋ช ๋ น์ ๋๋ค.
flutter build appbundle --flavor stage -t lib/main-stage.dart -v
์ฑ ๋ฒ๋ค์ mapping.txt๋ ํฌํจ๋๋์? Codemagic์ ํตํด Google Play Console์ ์ฑ ๋ฒ๋ค์ ์ ๋ก๋ํ ๋ mapping.txt๊ฐ ํฌํจ๋์ง ์์ผ๋ฏ๋ก apk๋ฅผ ์ ๋ก๋ํ ๋ ๊ฐ์ง๊ณ ์๋ ์๋ ํ ์คํธ ๋๋ ์ฌ์ ์ถ์ ๋ณด๊ณ ์๊ฐ ์์ต๋๋ค.
๊ทธ๋์ ์ง๋ฌธ์:
Flutter ํ์ด 8์ ์ด์ ์ 64๋นํธ ๋ฆด๋ฆฌ์ค์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ ๋ฐ์ดํธํ์ง ์์ Flutter๋ก ๋ง๋ ์ฑ์ ์ ๋ก๋ํ๊ณ ์ ๋ฐ์ดํธํ ์ ์์ต๋๊น?
@YazeedAlKhalaf ๋ค. ์ค๋ flutter build appbundle
๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ 32๋นํธ ๋ฐ 64๋นํธ๊ฐ ํฌํจ๋ ์ฑ ๋ฒ๋ค์ด ์ ๊ณต๋ฉ๋๋ค.
@mattetti ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๊น?
@nohli mapping.txt๋ ๊ธฐ๋ฅ ์์ฒญ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์ ๋ฒ๊ทธ๋ฅผ ์ ๊ณ ํด ์ฃผ์ธ์.
@skybur flutter doctor
์คํํ ์ ์์ต๋๊น? Flutter ํ๋ก์ ํธ๋ ์ฑ์
๋๊น ์๋๋ฉด ๋ชจ๋์
๋๊น?
@blasten ๋ด ํ๋ก์ ํธ๋ ์ฑ์ ๋๋ค.
๋ค์์ ํ๋ฌํฐ ๋ฅํฐ ๊ฒฐ๊ณผ์ ๋๋ค.
[โ] Flutter (Channel master, v1.6.1-pre.68, on Microsoft Windows [Version 10.0.17763.503], locale en-US)
โข Flutter version 1.6.1-pre.68 at D:\Devs\Flutter\testappbundle\flutter
โข Framework revision d5aae54a28 (22 hours ago), 2019-05-20 23:19:18 -0400
โข Engine revision 301f560bd8
โข Dart version 2.3.1 (build 2.3.1-dev.0.0 b48c8b1d1c)
[โ] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
โข Android SDK at D:\AndroidSDK
โข Android NDK location not configured (optional; useful for native profiling support)
โข Platform android-28, build-tools 28.0.3
โข ANDROID_HOME = D:\AndroidSDK
โข ANDROID_SDK_ROOT = D:\AndroidSDK
โข Java binary at: D:\AndroidStudio\jre\bin\java
โข Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)
โข All Android licenses accepted.
[โ] Android Studio (version 3.2)
โข Android Studio at D:\AndroidStudio
โข Flutter plugin version 31.3.1
โข Dart plugin version 181.5656
โข Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)
[โ] VS Code, 64-bit edition (version 1.33.1)
โข VS Code at C:\Program Files\Microsoft VS Code
โข Flutter extension version 3.0.2
[!] Connected device
! No devices available
! Doctor found issues in 1 category.
@blasten :
flutter build appbundle
๋ค์ ์คํ ์ด์ ์
๋ก๋ํ ๋ค์ Android ํด๋์ ํ์์ ์ฝ๋๋ค.
์ด ๋ ์ฆ์ ์ถฉ๋ํฉ๋๋ค.
adb ๋ก๊ทธ:
05-22 09:40:52.404 27305 27305 E flutter : [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
05-22 09:40:52.404 27305 27305 E flutter : [ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from.
05-22 09:40:52.404 27305 27305 E flutter : [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
05-22 09:40:52.404 27305 27305 F flutter : [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.
05-22 09:40:52.404 27305 27305 F libc : Fatal signal 6 (SIGABRT), code -6 in tid 27305 (tform.atomicdex)
05-22 09:40:52.432 27339 27339 I crash_dump64: obtaining output fd from tombstoned
05-22 09:40:52.433 1417 1417 I /system/bin/tombstoned: received crash request for pid 27305
05-22 09:40:52.434 27339 27339 I crash_dump64: performing dump of process 27305 (target tid = 27305)
05-22 09:40:52.434 27339 27339 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
05-22 09:40:52.434 27339 27339 F DEBUG : Build fingerprint: 'lge/judyln_lao_com/judyln:8.0.0/OPR1.170623.032/190501244a6e5.FGN:user/release-keys'
05-22 09:40:52.434 27339 27339 F DEBUG : Revision: '12'
05-22 09:40:52.434 27339 27339 F DEBUG : ABI: 'arm64'
05-22 09:40:52.434 27339 27339 F DEBUG : pid: 27305, tid: 27305, name: PACKAGE_NAME >>> PACKAGE_NAME <<<
05-22 09:40:52.434 27339 27339 F DEBUG : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
05-22 09:40:52.435 27339 27339 F DEBUG : Abort message: '[FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.
05-22 09:40:52.435 27339 27339 F DEBUG : '
05-22 09:40:52.435 27339 27339 F DEBUG : x0 0000000000000000 x1 0000000000006aa9 x2 0000000000000006 x3 0000000000000008
05-22 09:40:52.435 27339 27339 F DEBUG : x4 0000000007d0bf68 x5 0000000007d0bf68 x6 0000000007d0bf68 x7 0000000007d0bfd8
05-22 09:40:52.435 27339 27339 F DEBUG : x8 0000000000000083 x9 8644075c81e36b5a x10 00000077ccff6a48 x11 8644075c81e36b5a
05-22 09:40:52.435 27339 27339 F DEBUG : x12 8644075c81e36b5a x13 0000000000000020 x14 ffffffffffffffdf x15 00000077ca27ec68
05-22 09:40:52.435 27339 27339 F DEBUG : x16 00000077ca2732b8 x17 00000077ca205a44 x18 0000000000000048 x19 0000000000006aa9
05-22 09:40:52.435 27339 27339 F DEBUG : x20 0000000000006aa9 x21 0000007fe4fb81b8 x22 00000077b3dffba0 x23 00000077bd29d7a0
05-22 09:40:52.435 27339 27339 F DEBUG : x24 00000077aa79a150 x25 0000000000000000 x26 0000000000000000 x27 0000000000000002
05-22 09:40:52.435 27339 27339 F DEBUG : x28 0000000000000000 x29 0000007fe4fb81a0 x30 00000077ca1aa8e4
05-22 09:40:52.435 27339 27339 F DEBUG : sp 0000007fe4fb8160 pc 00000077ca205a4c pstate 0000000060000000
05-22 09:40:52.436 27339 27339 F DEBUG :
05-22 09:40:52.436 27339 27339 F DEBUG : backtrace:
05-22 09:40:52.436 27339 27339 F DEBUG : #00 pc 0000000000079a4c /system/lib64/libc.so (tgkill+8)
05-22 09:40:52.436 27339 27339 F DEBUG : #01 pc 000000000001e8e0 /system/lib64/libc.so (abort+88)
05-22 09:40:52.436 27339 27339 F DEBUG : #02 pc 000000000001d61c /data/app/PACKAGE_NAME-F-z4qH6HT271dk7M7oI8Uw==/split_config.arm64_v8a.apk (offset 0xea7000)
@Kiruel ์ฌ๋๋ค์ด ๊ณ์ํด์ ์ฑ ๋ฒ๋ค์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๊ณ ๋งํ๋ ์ด์ ๋ ๋งค์ฐ ๋ถ๋ถ๋ช ํฉ๋๋ค.
App Bundle์ ์๋ํ๋ ๋ถํ APK์ ๋ถ๊ณผํ๋ฉฐ ์์ฐ ํด๋์๋ ๋ถํ ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ค๋ ์ท์ ์ฌ์ ํ โโ๋จ์ผ ์ํคํ ์ฒ๋ง์ ๋์์ผ๋ก ํฉ๋๋ค.
์๋ง๋ ๋๋ฝ ๋ ๊ฒ์ด ์์ง๋ง ์ ์๊ฐ์๋ ์ด์ ์ ์ผํ ํด๊ฒฐ์ฑ ์ gradle ํ์ผ์์ ํด๋น ndk ํํฐ๋ง์ ์ฌ์ฉํ์ฌ ๊ฐ ์ํคํ ์ฒ์ ๋ํ APK๋ฅผ ๋น๋ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฌํ APK๋ฅผ ๊ฐ๊ฐ ์ ๋ก๋ํฉ๋๋ค.
APK๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค๋ฉด App Bundle๋ ์๋ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
@ndusart ๋๋ ๊ทธ๊ฒ์ด ์ฌ์ค์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. App Bundle ๋ฌธ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
res/, lib/ ๋ฐ assets/: ์ด ๋๋ ํ ๋ฆฌ๋ ์ผ๋ฐ APK์ ๋๋ ํ ๋ฆฌ์ ๋์ผํฉ๋๋ค. ์ฑ ๋ฒ๋ค์ ์ ๋ก๋ํ ๋ Google Play๋ ์ด๋ฌํ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฒ์ฌํ๊ณ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ์งํ๋ฉด์ ๋์ ์ฅ์น ๊ตฌ์ฑ์ ์ถฉ์กฑํ๋ ํ์ผ๋ง ํจํค์งํฉ๋๋ค.
๋ฐ๋ผ์ ์ด๋ป๊ฒ ๋ ์์ฐ์ ๋ถํ ํ ์ ์์ต๋๋ค.
@jereksel ์ด๊ฒ์ ์ด๋ฌํ ๋๋ ํ ๋ฆฌ๊ฐ apk์ assets/
ํด๋๊ฐ ๋ถํ ๋์ง ์์ ๊ฒ๊ณผ ์ฑ ๋ฒ๋ค์์ ์ ํํ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค๋ ๊ฒ์ ์๋ ค์ค๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ๋งค์ฐ ํน์ ํ ํ์ผ ๊ตฌ์กฐ์ ์์ฐ์ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ OS ๋๋ ๊ธฐํ ํญ๋ชฉ์์ ๊ตฌ๋ฌธ ๋ถ์์ ์๋ฏธํ์ง ์์ต๋๋ค.
๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ๋์ ABI๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด ํด๋๋ฅผ ๋ถํ ํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์ญ์์ค.
๊ทธ๋ฆฌ๊ณ ์ด ์ธ์ฉ๋ฌธ์ ๋ด๊ฐ ๋งํ ๊ฒ์ ํ์ธ์์ผ์ค๋๋ค. APK๋ก ์ด๊ฒ์ด ์ง๊ธ ๋น์ฅ ๊ฐ๋ฅํ์ง ์๋ค๋ฉด ์ด ํด๋๋ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ ํํ ๋์ผํ๊ฒ ์๋ํ๊ธฐ ๋๋ฌธ์ App Bundle์ ์ฌ์ฉํ์ฌ ๋ถ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
์์ฐ์ด ๋ถํ ๋๋ ๊ฒ์ ๋ณธ ์ ์ด ์์ง๋ง ๋ค์์ ์ฐพ์์ต๋๋ค.
https://medium.com/google-developer-experts/exploring-the-android-app-bundle-ca16846fa3d7
asset.pb โ ์ ํ๋ฆฌ์ผ์ด์ ์์ฐ์ ๋ํ ๋ฆฌ์์ค ํ ์ด๋ธ๊ณผ ๋์ผํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ง ํ์๋ฉ๋๋ค.
๋ฐ๋ผ์ Android Studio๋ ์์ฐ์ ๋ถํ ํ์ง ์์ง๋ง ์ฑ ๋ฒ๋ค ์์ฒด๋ ์ด๋ฅผ ์ง์ํฉ๋๋ค.
๊ณต์ ๋ฌธ์๊ฐ ์์ต๋๊น? ๋ชจ๋ ๊ฒ์ด ๋งค์ฐ ์ ๋ขฐํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค์ ๋ฌธ์ https://medium.com/mindorks/android-app-bundle-aab-98de6dad8ba8 ์์๋ assets/
์ ํด๋ ์ด๋ฆ ์ ๋ฏธ์ฌ๋ฅผ ์ถ๊ฐํ์ฌ ๋ถํ ํ ์ ์๋ค๊ณ ๋ช
์ํ์ง๋ง ํ์ฌ๋ ์ด ์์
๋ง ๊ฐ๋ฅํฉ๋๋ค. ์ธ์ด๋ก ์ํ๋ฉ๋๋ค.
๊ทธ๋์ ์ฌ์ ํ ์ด๊ฒ์ ์์ง ์์ ์ ์ด์ง ์์ ๊ฒ ๊ฐ์ผ๋ฉฐ ์ง๊ธ ๋น์ฅ์ ๊ธฐ์ค์ด ๋์ด์๋ ์ ๋ฉ๋๋ค. VM ์ค๋
์ท์ ๊ฐ๋ฅํ ๊ฒฝ์ฐ lib/
ํด๋๋ก ๋ด๋ณด๋ด๊ฑฐ๋ flutter
๋ช
๋ น์ ํน์ ๋์์ ๋ํ APK๋ฅผ ๋น๋ํ๋ ์์ ํ ๊ธฐ๋ฅ๊ณผ ํจ๊ป ์ ๊ณต๋์ด์ผ ํฉ๋๋ค(์์ง ํด์ผ ํ ์ผ์ด ์์ต๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ ๊ทผํ ์ ์๋๋ก ํ๊ธฐ ์ํด) ์ค๋น๊ฐ ๋์์ ๋ ์ฑ ๋ฒ๋ค์ ์์ฐ์ ์ฐ๊ธฐํฉ๋๋ค.
@๋ธ๋ผ์คํ
๋ง์คํฐ ์ฑ๋๋ก ์ ํํ์ฌ ์ฑ ๋ฒ๋ค์ ์ ๊ทธ๋ ์ด๋ํ๊ณ ๋น๋ํ์ต๋๋ค. ๋ถํํ๋ ๋ค์ logcat์ ์ฌ์ฉํ์ฌ Google Play ์คํ ์ด์์ ๋ค์ด๋ก๋ํ ํ ์ฑ์ด ์บ์๋ฉ๋๋ค.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
2019-05-22 09:42:14.824 6995-6995/? A/flutter: [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.
flutter build appbundle
์ด(๊ฐ) ์ด์ ๋ง์คํฐ์ ์์ต๋๋ค. ์๋ฐ์ ์ผ๋ก ์๋ํ๊ณ ์ถ์ ์ฌ๋์ด ์์ต๋๊น?
build apk
์์ ํ๋ซํผ ๋ชฉ๋ก์ ์ง์ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ๋ ผ์๋ฅผ ํ์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.flutter build apk --target-platform android-arm,android-arm64
@๋ธ๋ผ์คํ
๋ง์คํฐ ์ฑ๋๋ก ์ ํํ์ฌ ์ฑ ๋ฒ๋ค์ ์ ๊ทธ๋ ์ด๋ํ๊ณ ๋น๋ํ์ต๋๋ค. ๋ถํํ๋ ๋ค์ logcat์ ์ฌ์ฉํ์ฌ Google Play ์คํ ์ด์์ ๋ค์ด๋ก๋ํ ํ ์ฑ์ด ์บ์๋ฉ๋๋ค.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings. 2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from. 2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance. 2019-05-22 09:42:14.824 6995-6995/? A/flutter: [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.
flutter build appbundle
์ด(๊ฐ) ์ด์ ๋ง์คํฐ์ ์์ต๋๋ค. ์๋ฐ์ ์ผ๋ก ์๋ํ๊ณ ์ถ์ ์ฌ๋์ด ์์ต๋๊น?
build apk
์์ ํ๋ซํผ ๋ชฉ๋ก์ ์ง์ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ๋ ผ์๋ฅผ ํ์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.flutter build apk --target-platform android-arm,android-arm64
์์ง ๋ก๊ทธ๊ฐ ์์ง๋ง ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@skybur ๋ฌธ์ ๋ https://github.com/flutter/flutter/issues/33119 ์ ๊ด๋ จ์ด ์์ ์ ์์ต๋๋ค ์ด ํจ์น๋ก ํด๊ฒฐํด์ผ ํฉ๋๋ค.
@ndusart
๊ทธ๋, ๋น์ ๋ง์ด ๋ง์. ๋๋ Bundletool ์์ค ์ฝ๋๋ฅผ ํ์ธํ๊ณ ์์ฐ ๋ถํ ์ ์ค์ ๋ก ์ธ์ด๋ก๋ง ์ด๋ฃจ์ด์ง๋๋ค.
https://github.com/google/bundletool/blob/master/src/main/java/com/android/tools/build/bundletool/splitters/ModuleSplitter.java#L286
์ด๊ฒ์ด ๋ด ์๋ฃจ์ ์ด์์ต๋๋ค.
app gradle
splits { // Configures multiple APKs based on ABI. abi { // Enables building multiple APKs per ABI. enable true // By default all ABIs are included, so use reset() and include to specify that we only // want APKs for armeabi-v7a and arm64-v8a. // Resets the list of ABIs that Gradle should create APKs for to none. reset() // Specifies a list of ABIs that Gradle should create APKs for. include "armeabi-v7a", "arm64-v8a" // Specifies that we do not want to also generate a universal APK that includes all ABIs. universalApk false } }
flutter build apk --release --target-platform=android-arm
- ํ๋ ์ด ์คํ ์ด์
app-armeabi-v7a-release.apk
์ ๋ก๋- ์ฆ๊ฐ
versionCode
flutter build apk --release --target-platform=android-arm64
- ํ๋ ์ด ์คํ ์ด์
app-arm64-v8a-release.apk
์ ๋ก๋Google Play ์คํ ์ด๋ ๊ธฐ๊ธฐ ์ํคํ ์ฒ์ ๋ฐ๋ผ ์ฑ์ ์ ๊ณตํฉ๋๋ค. 32๋นํธ ์ฅ์น๋ ๋ง์กฑํ๊ณ 64๋นํธ ์ฅ์น๋ ๋ง์กฑํ๋ฉฐ ๋ ์ํคํ ์ฒ๋ฅผ ๋ชจ๋ ์ ๊ณตํ๋ฉด์ APK ํฌ๊ธฐ๊ฐ ์๋์ ์ผ๋ก ์๊ฒ ์ ์ง๋๋ค๋ ์ฌ์ค์ ๋ง์กฑํฉ๋๋ค.
๋์ผํ APK์ ๋ ์ํคํ ์ฒ์ ๋ํ ์ง์์ด ํฌํจ๋ ๊ฒฝ์ฐ ์ฑ ํฌ๊ธฐ๋ 10MB ์ด์์ด ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
์ฌ๋ฌ๋ถ๊ป ์ค์ํ ๋ง์์ด ์์ต๋๋ค. ๋ด๊ฐ ์ธ์ฉ ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ. ์ฑ์ ๊ณ์ ๋๋ฒ๊น
ํ๋ ค๋ฉด ์ค์ ์ ์ฃผ์ ์ฒ๋ฆฌํด์ผ ํ ์ ์์ต๋๋ค. ๋๋ Gradle ๋น๋๊ฐ Android ํจํค์ง๋ฅผ ์์ฑํ์ง ๋ชปํ๋ค ๋ ์ค๋ฅ์ ์ง๋ฉดํ๊ณ ๋ช ์๊ฐ ๋์ gradlew clean
...etc๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์นจ๋ด ์ด๊ฒ์ด ์ฃผ์ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค!
์ด๊ฒ์ด ๋๊ตฐ๊ฐ๊ฐ ๋ฐ์ด ๋ด๋ฆฌ๋ ๋ฐ ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
flutter build appbundle
์ด(๊ฐ) ์ด์ ๋ง์คํฐ์ ๋๋ค. ์๋ฐ์ ์ผ๋ก ์๋ํ๊ณ ์ถ์ ์ฌ๋์ด ์์ต๋๊น?
build apk
์ ํ๋ซํผ ๋ชฉ๋ก์ ์ง์ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ํ ๋ก ์ ํ์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.flutter build apk --target-platform android-arm,android-arm64
flutter build appbundle
์ด(๊ฐ) ์๋ ์ค์
๋๋ค! ํด๋น ์ค์ ์ ์ถ๊ฐํ ํ์๊ฐ ์์ผ๋ฉฐ ์ฝ๋๋ง ์ํํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ปดํ์ผํ๋ ๋ฐ ์๊ฐ์ด ์กฐ๊ธ ๊ฑธ๋ฆฌ์ง ๋ง ์ง๊ธ์ Google Play๋ฅผ ํต๊ณผํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์
๋๋ค.
@Tokenyet Play ์คํ ์ด์์ ์ฑ์ ๋ค์ด๋ก๋ํ๊ณ .aab
์
๋ก๋ ํ ์คํํ ์ ์์์ต๋๊น? ์ด ๊ฒฝ์ฐ flutter doctor
์ ์ถ๋ ฅ์ ๋ถ์ฌ๋ฃ์ผ์๊ฒ ์ต๋๊น?
@๋ธ๋ผ์คํ
๋ง์คํฐ ์ฑ๋๋ก ์ ํํ์ฌ ์ฑ ๋ฒ๋ค์ ์ ๊ทธ๋ ์ด๋ํ๊ณ ๋น๋ํ์ต๋๋ค. ๋ถํํ๋ ๋ค์ logcat์ ์ฌ์ฉํ์ฌ Google Play ์คํ ์ด์์ ๋ค์ด๋ก๋ํ ํ ์ฑ์ด ์บ์๋ฉ๋๋ค.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings. 2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from. 2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance. 2019-05-22 09:42:14.824 6995-6995/? A/flutter: [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.
flutter build appbundle
์ด(๊ฐ) ์ด์ ๋ง์คํฐ์ ์์ต๋๋ค. ์๋ฐ์ ์ผ๋ก ์๋ํ๊ณ ์ถ์ ์ฌ๋์ด ์์ต๋๊น?
build apk
์์ ํ๋ซํผ ๋ชฉ๋ก์ ์ง์ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ๋ ผ์๋ฅผ ํ์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.flutter build apk --target-platform android-arm,android-arm64
Play ์คํ ์ด(appbundle๋ก ์์ฑ)์์ ๋ด ์ฑ์ ์คํํ๋ ค๊ณ ํ ๋ ์ฌ๊ธฐ์์ ์ ํํ ๊ฐ์ ๊ฒ์ ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ด๋ค ๋ก๊ทธ๊ฐ ํ์ํฉ๋๊น?
์ด๊ฒ์ ๋์์ด ๋ ๊ฒ์ ๋๋ค:
bundletool
๋ค์ด๋ก๋flutter build appbundle
(ํ๋๊ทธ๋ฅผ ์ ๋ฌํ๋์ง ๋๋ Gradle ์คํฌ๋ฆฝํธ๋ฅผ _custom_ ๋ณ๊ฒฝํ๋์ง ํ์ํ์ธ์.)bundletool build-apks --bundle=build/app/outputs/bundle/release/app.aab --output=out.apks
๋ฅผ ์คํํ์ฌ APK ์ธํธ๋ฅผ ์ถ์ถํฉ๋๋ค.unzip -l out.apks
ํ๊ณ ๋ง์ง๋ง์ผ๋ก flutter doctor
ํ๊ณ ๋ ๋ช
๋ น์ ์ถ๋ ฅ์ ์ฃผ์์ ๋ถ์ฌ๋ฃ์ต๋๋ค.๊ฐ๋ฅํ๋ค๋ฉด:
bundletool
๋ฐ APK ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๊ธฐ์์ ๋ก์ปฌ๋ก ํ
์คํธํฉ๋๋ค. ๋ค์ ์ ๊ทํ์ ์๊ฒฌ์ logcat์ ๋ถ์ฌ๋ฃ๋
bundletool
์ฌ์ฉํ์ฌ ๋ก์ปฌ์์๋ง ํ
์คํธํ์ง๋ง ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์์ต๋๋ค.
@blasten ๊ทธ๋์ ์ด์ ์ค๋ฅ๊ฐ ์์ ๋์์ง๋ง ๋ค๋ฅธ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ด ํ๋ก์ ํธ์ ๋ฌด์ธ๊ฐ๋ก ์ธํด ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๊ฒ์ ๋๋ฒ๊น ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
[+6084 ms] Failed to execute aapt
[ +17 ms] com.android.ide.common.process.ProcessException: Failed to execute aapt
[ +1 ms] at com.android.builder.core.AndroidBuilder.processResources(AndroidBuilder.java:809)
[ +1 ms] at com.android.build.gradle.internal.res.LinkAndroidResForBundleTask.taskAction(LinkAndroidResForBundleTask.kt:128)
[ +1 ms] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ +1 ms] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ +1 ms] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ ] at java.lang.reflect.Method.invoke(Method.java:498)
[ ] at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
[ +4 ms] at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:46)
[ +1 ms] at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
[ ] at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
[ +3 ms] at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:788)
[ +29 ms] at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:755)
[ +1 ms] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:124)
[ +1 ms] at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
[ +2 ms] at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
[ +1 ms] at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
[ +9 ms] at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
[ ] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:113)
[ ] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:95)
[ +1 ms] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:73)
[ ] at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
[ +1 ms] at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
[ ] at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
[ ] at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
[ +5 ms] at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
[ ] at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
[ +1 ms] at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
[ +1 ms] at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
[ +12 ms] at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
[ +4 ms] at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
[ ] at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
[ ] at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
[ ] at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:256)
[ ] at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
[ ] at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
[ ] at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
[ ] at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
[ +1 ms] at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:249)
[ +6 ms] at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:238)
[ ] at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
[ ] at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
[ ] at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
[ +1 ms] at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
[ +1 ms] at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:663)
[ +1 ms] at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:597)
[ ] at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
[ +14 ms] at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
[ +1 ms] at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
[ +4 ms] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[ +1 ms] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[ +2 ms] at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
[ +1 ms] at java.lang.Thread.run(Thread.java:745)
[ +26 ms] Caused by: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
[ +4 ms] at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:503)
[ +1 ms] at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:482)
[ ] at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:79)
[ ] at com.android.builder.internal.aapt.AbstractAapt.link(AbstractAapt.java:34)
[ ] at com.android.builder.core.AndroidBuilder.processResources(AndroidBuilder.java:807)
[ ] ... 51 more
[ ] Caused by: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
[ +1 ms] at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:503)
[ ] at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:462)
[ ] at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:79)
[ ] at com.android.builder.internal.aapt.v2.QueueableAapt2.lambda$makeValidatedPackage$1(QueueableAapt2.java:166)
[ +4 ms] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[ +1 ms] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[ +1 ms] ... 1 more
[ +1 ms] Caused by: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
[ +1 ms] at com.android.builder.png.AaptProcess$NotifierProcessOutput.handleOutput(AaptProcess.java:443)
[ +1 ms] at com.android.builder.png.AaptProcess$NotifierProcessOutput.err(AaptProcess.java:395)
[ ] at com.android.builder.png.AaptProcess$ProcessOutputFacade.err(AaptProcess.java:312)
[ ] at com.android.utils.GrabProcessOutput$1.run(GrabProcessOutput.java:104)
[ ] FAILURE: Build failed with an exception.
[ ] * What went wrong:
[ ] Execution failed for task ':app:bundleProdReleaseResources'.
[ ] > Failed to execute aapt
[ ] * Try:
[ ] Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
[ +5 ms] * Get more help at https://help.gradle.org
[ ] BUILD FAILED in 30s
[ +324 ms] Running Gradle task 'bundleProdRelease'... (completed in 31.5s)
@blasten ๋๋ ๋น์ ์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
โ PROJECT_NAME git:(master) โ unzip -l out.apks
Archive: out.apks
Length Date Time Name
--------- ---------- ----- ----
43369811 01-01-1970 01:00 standalones/standalone-armeabi_tvdpi.apk
43327197 01-01-1970 01:00 standalones/standalone-armeabi_hdpi.apk
43319503 01-01-1970 01:00 standalones/standalone-armeabi_mdpi.apk
43320027 01-01-1970 01:00 standalones/standalone-armeabi_ldpi.apk
43346424 01-01-1970 01:00 standalones/standalone-armeabi_xxhdpi.apk
43350403 01-01-1970 01:00 standalones/standalone-armeabi_xxxhdpi.apk
43332970 01-01-1970 01:00 standalones/standalone-armeabi_xhdpi.apk
50349155 01-01-1970 01:00 standalones/standalone-armeabi_v7a_ldpi.apk
50348629 01-01-1970 01:00 standalones/standalone-armeabi_v7a_mdpi.apk
50398968 01-01-1970 01:00 standalones/standalone-armeabi_v7a_tvdpi.apk
50356358 01-01-1970 01:00 standalones/standalone-armeabi_v7a_hdpi.apk
50362126 01-01-1970 01:00 standalones/standalone-armeabi_v7a_xhdpi.apk
50375565 01-01-1970 01:00 standalones/standalone-armeabi_v7a_xxhdpi.apk
50379553 01-01-1970 01:00 standalones/standalone-armeabi_v7a_xxxhdpi.apk
50660246 01-01-1970 01:00 standalones/standalone-arm64_v8a_ldpi.apk
50659718 01-01-1970 01:00 standalones/standalone-arm64_v8a_mdpi.apk
50710027 01-01-1970 01:00 standalones/standalone-arm64_v8a_tvdpi.apk
50667415 01-01-1970 01:00 standalones/standalone-arm64_v8a_hdpi.apk
50673185 01-01-1970 01:00 standalones/standalone-arm64_v8a_xhdpi.apk
50686641 01-01-1970 01:00 standalones/standalone-arm64_v8a_xxhdpi.apk
43345757 01-01-1970 01:00 standalones/standalone-x86_mdpi.apk
43346287 01-01-1970 01:00 standalones/standalone-x86_ldpi.apk
43396086 01-01-1970 01:00 standalones/standalone-x86_tvdpi.apk
50690619 01-01-1970 01:00 standalones/standalone-arm64_v8a_xxxhdpi.apk
43359247 01-01-1970 01:00 standalones/standalone-x86_xhdpi.apk
43353470 01-01-1970 01:00 standalones/standalone-x86_hdpi.apk
43372688 01-01-1970 01:00 standalones/standalone-x86_xxhdpi.apk
43376653 01-01-1970 01:00 standalones/standalone-x86_xxxhdpi.apk
43340224 01-01-1970 01:00 standalones/standalone-x86_64_ldpi.apk
43339701 01-01-1970 01:00 standalones/standalone-x86_64_mdpi.apk
43390033 01-01-1970 01:00 standalones/standalone-x86_64_tvdpi.apk
43347418 01-01-1970 01:00 standalones/standalone-x86_64_hdpi.apk
57027 01-01-1970 01:00 splits/base-ldpi.apk
56501 01-01-1970 01:00 splits/base-mdpi.apk
61951 01-01-1970 01:00 splits/base-hdpi.apk
67741 01-01-1970 01:00 splits/base-xhdpi.apk
81187 01-01-1970 01:00 splits/base-xxhdpi.apk
85188 01-01-1970 01:00 splits/base-xxxhdpi.apk
105385 01-01-1970 01:00 splits/base-tvdpi.apk
43353194 01-01-1970 01:00 standalones/standalone-x86_64_xhdpi.apk
11313 01-01-1970 01:00 splits/base-ca.apk
11211 01-01-1970 01:00 splits/base-da.apk
12040 01-01-1970 01:00 splits/base-fa.apk
11659 01-01-1970 01:00 splits/base-ja.apk
12486 01-01-1970 01:00 splits/base-ka.apk
12511 01-01-1970 01:00 splits/base-pa.apk
12856 01-01-1970 01:00 splits/base-ta.apk
11195 01-01-1970 01:00 splits/base-nb.apk
12001 01-01-1970 01:00 splits/base-be.apk
11420 01-01-1970 01:00 splits/base-de.apk
13041 01-01-1970 01:00 splits/base-ne.apk
12674 01-01-1970 01:00 splits/base-te.apk
43366615 01-01-1970 01:00 standalones/standalone-x86_64_xxhdpi.apk
11179 01-01-1970 01:00 splits/base-af.apk
12151 01-01-1970 01:00 splits/base-bg.apk
12353 01-01-1970 01:00 splits/base-th.apk
11228 01-01-1970 01:00 splits/base-fi.apk
12537 01-01-1970 01:00 splits/base-si.apk
12551 01-01-1970 01:00 splits/base-hi.apk
11939 01-01-1970 01:00 splits/base-kk.apk
11615 01-01-1970 01:00 splits/base-vi.apk
12059 01-01-1970 01:00 splits/base-mk.apk
11440 01-01-1970 01:00 splits/base-sk.apk
11961 01-01-1970 01:00 splits/base-uk.apk
12344 01-01-1970 01:00 splits/base-el.apk
11342 01-01-1970 01:00 splits/base-gl.apk
13334 01-01-1970 01:00 splits/base-ml.apk
11350 01-01-1970 01:00 splits/base-nl.apk
11371 01-01-1970 01:00 splits/base-pl.apk
11311 01-01-1970 01:00 splits/base-sl.apk
11428 01-01-1970 01:00 splits/base-tl.apk
11825 01-01-1970 01:00 splits/base-am.apk
12685 01-01-1970 01:00 splits/base-km.apk
12615 01-01-1970 01:00 splits/base-bn.apk
11223 01-01-1970 01:00 splits/base-in.apk
12832 01-01-1970 01:00 splits/base-kn.apk
11958 01-01-1970 01:00 splits/base-mn.apk
12621 01-01-1970 01:00 splits/base-lo.apk
11425 01-01-1970 01:00 splits/base-ko.apk
11395 01-01-1970 01:00 splits/base-ro.apk
11438 01-01-1970 01:00 splits/base-sq.apk
13612 01-01-1970 01:00 splits/base-fr.apk
11647 01-01-1970 01:00 splits/base-ar.apk
11278 01-01-1970 01:00 splits/base-hr.apk
12447 01-01-1970 01:00 splits/base-mr.apk
12943 01-01-1970 01:00 splits/base-or.apk
14244 01-01-1970 01:00 splits/base-sr.apk
11316 01-01-1970 01:00 splits/base-tr.apk
11973 01-01-1970 01:00 splits/base-ur.apk
11308 01-01-1970 01:00 splits/base-bs.apk
12525 01-01-1970 01:00 splits/base-as.apk
13704 01-01-1970 01:00 splits/base-es.apk
11367 01-01-1970 01:00 splits/base-cs.apk
11222 01-01-1970 01:00 splits/base-is.apk
11360 01-01-1970 01:00 splits/base-ms.apk
11323 01-01-1970 01:00 splits/base-et.apk
11283 01-01-1970 01:00 splits/base-it.apk
11550 01-01-1970 01:00 splits/base-lt.apk
14605 01-01-1970 01:00 splits/base-pt.apk
11377 01-01-1970 01:00 splits/base-eu.apk
12409 01-01-1970 01:00 splits/base-gu.apk
11651 01-01-1970 01:00 splits/base-hu.apk
12048 01-01-1970 01:00 splits/base-ru.apk
11616 01-01-1970 01:00 splits/base-lv.apk
11314 01-01-1970 01:00 splits/base-zu.apk
11260 01-01-1970 01:00 splits/base-sv.apk
11539 01-01-1970 01:00 splits/base-iw.apk
11283 01-01-1970 01:00 splits/base-sw.apk
12110 01-01-1970 01:00 splits/base-hy.apk
43370609 01-01-1970 01:00 standalones/standalone-x86_64_xxxhdpi.apk
11904 01-01-1970 01:00 splits/base-ky.apk
11430 01-01-1970 01:00 splits/base-az.apk
13395 01-01-1970 01:00 splits/base-my.apk
11296 01-01-1970 01:00 splits/base-uz.apk
15398 01-01-1970 01:00 splits/base-zh.apk
23877 01-01-1970 01:00 splits/base-en.apk
107757 01-01-1970 01:00 splits/base-armeabi.apk
134023 01-01-1970 01:00 splits/base-x86.apk
127969 01-01-1970 01:00 splits/base-x86_64.apk
42926206 01-01-1970 01:00 splits/base-master.apk
21480838 01-01-1970 01:00 splits/base-arm64_v8a_2.apk
17508309 01-01-1970 01:00 splits/base-armeabi_v7a_2.apk
217751 01-01-1970 01:00 splits/base-armeabi_2.apk
311771 01-01-1970 01:00 splits/base-x86_2.apk
308537 01-01-1970 01:00 splits/base-x86_64_2.apk
7136923 01-01-1970 01:00 splits/base-armeabi_v7a.apk
7447993 01-01-1970 01:00 splits/base-arm64_v8a.apk
42926200 01-01-1970 01:00 splits/base-master_2.apk
16537 01-01-1970 01:00 toc.pb
--------- -------
1759809847 129 files
โ PROJECT_NAME git:(master) โ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[โ] Flutter (Channel master, v1.6.1-pre.68, on Mac OS X 10.14.5 18F132, locale en-GB)
[โ] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[โ] iOS toolchain - develop for iOS devices (Xcode 10.2.1)
[!] Android Studio (version 3.3)
โ Flutter plugin not installed; this adds Flutter specific functionality.
โ Dart plugin not installed; this adds Dart specific functionality.
[โ] VS Code (version 1.34.0)
[โ] Connected device (1 available)
! Doctor found issues in 1 category.
@jereksel @ndusart
์ค์ ๋ก ์ด๊ฒ์ Assets Targeting
๋ผ๊ณ ํ๋ฉฐ ๊ทธ๋ํฝ API, ์ธ์ด ๋ฐ ํ
์ค์ฒ ์์ถ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฐ์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋์์ผ๋ก ์ง์ /๋ถํ ํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์์ ๋ณผ ์ ์๋ฏ์ด: .../bundletool/model/targeting/TargetedDirectorySegment.java
AAB์ ํ์ฌ flutter@master
์ ๊ด๋ จํ์ฌ ๋ก์ปฌ์์ ์๋ํฉ๋๋ค. bundletool
๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ์ฅ์น์์ ํ
์คํธํ๊ณ ์ค์นํฉ๋๋ค. ๋ด build.gradle
์์ ๋ฐ๋ ๋ฐ ์ธ์ด ๋ถํ ์ ๋นํ์ฑํํ์ฌ build-apks
์ ๊ณตํฉ๋๋ค.
Length Date Time Name
--------- ---------- ----- ----
6872466 1970-01-01 01:00 splits/base-arm64_v8a.apk
6726824 1970-01-01 01:00 splits/base-master.apk
13289718 1970-01-01 01:00 standalones/standalone-armeabi_v7a.apk
13594392 1970-01-01 01:00 standalones/standalone-arm64_v8a.apk
6567785 1970-01-01 01:00 splits/base-armeabi_v7a.apk
429 1970-01-01 01:00 toc.pb
--------- -------
47051614 6 files
Test Lab์์ ํ
์คํธํด๋ณด๋ ๋ชจ๋ ๋
น์์
๋๋ค.
Play ์คํ ์ด์์ ์ด ์ฑ๋์ ํ
์คํธํ๊ธฐ ์ํด ์ด ๋ฒ์ ์ ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ๊ณ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
@Tokenyet Play ์คํ ์ด์์ ์ฑ์ ๋ค์ด๋ก๋ํ๊ณ
.aab
์ ๋ก๋ ํ ์คํํ ์ ์์์ต๋๊น? ์ด ๊ฒฝ์ฐflutter doctor
์ ์ถ๋ ฅ์ ๋ถ์ฌ๋ฃ์ผ์๊ฒ ์ต๋๊น?
Play ์คํ ์ด์์ ์ฑ์ ๋ค์ด๋ก๋ํ๊ณ ์คํํ ์ ์์ต๋๋ค. [ํ๋ฒ ์ฌ์ฉํด ๋ณด์ธ์] (https://play.google.com/store/apps/details?id=com.bumbystudio.starry_clock). (ํธ์ง: ์ฃ์กํฉ๋๋ค, ์๋ํ์ง ์์ต๋๋ค... PlayStore์์)
์๋๋ ๊ทํ๊ฐ ํ์๋ก ํ๋ flutter doctor
์
๋๋ค. ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
[โ] Flutter(์ฑ๋ ๋ง์คํฐ, v1.6.1-pre.88, Microsoft Windows [๋ฒ์ 10.0.17134.765], ๋ก์ผ์ผ zh-TW)
[โ] Android ํด์ฒด์ธ - Android ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ(Android SDK ๋ฒ์ 28.0.3)
[โ] ์๋๋ก์ด๋ ์คํ๋์ค(๋ฒ์ 3.3)
[โ] VS Code, 64๋นํธ ์๋์
(๋ฒ์ 1.30.2)
[!] ์ฐ๊ฒฐ๋ ์ฅ์น
! ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๊ธฐ ์์
์ด๊ฒ์ ๋๋ฅผ ์ํด ์ ์๋ํฉ๋๋ค!
๋น๋ ์ ํ {
ํ์ด ์ฃผ๋ค {
// TODO: ๋ฆด๋ฆฌ์ค ๋น๋์ ๋ํ ๊ณ ์ ํ ์๋ช
๊ตฌ์ฑ์ ์ถ๊ฐํฉ๋๋ค.
// ์ง๊ธ์ ๋๋ฒ๊ทธ ํค๋ก ์๋ช
ํ๋ฏ๋ก flutter run --release
์๋ํฉ๋๋ค.
์๋ช
๊ตฌ์ฑ ์๋ช
๊ตฌ์ฑ.๋๋ฒ๊ทธ
}
๋๋ฒ๊ทธ {
ndk {
abiFilters 'armeabi-v7a'
}
}
}
@SPodjasek ์ฌ์ ํ ABI๋ฅผ ๊ธฐ๋ฐ์ผ๋ก assets/
๋ฅผ ๋ถํ ํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ํ์ฌ ์ด๋ป๊ฒ ํ ์ ์์ต๋๊น?
๋ด ์ฅ์น์ ์ค์นํ๋๋ฐ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด๊ฐ ์ป์ ๊ฑด
๊ฒ์ ํ๋ฉด.
๊ฐ์ฌ ํด์,
ํธ๋ฃจ์ํ๋ง ๋ผ๋ง๋์
2019๋ 5์ 23์ผ ๋ชฉ์์ผ ์คํ 6์ 43๋ถ Tokenyet์์ ์๋ฆผ @github.com์ด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ต๋๋ค.
@Tokenyet https://github.com/Tokenyet ์ฑ์ ๋ค์ด๋ก๋ํ ์ ์์ ๋์?
Play ์คํ ์ด์์ ๋ค์ด๋ก๋ํ๊ณ .aab๋ฅผ ์ ๋ก๋ํ ํ ์คํํ์๊ฒ ์ต๋๊น? ๋ง์ฝ ์ด๊ฒ์ด
๊ฒฝ์ฐ, ํ๋ฌํฐ ๋ฅํฐ์ ์ถ๋ ฅ์ ๋ถ์ฌ๋ฃ์ด ์ฃผ์๊ฒ ์ต๋๊น?Play ์คํ ์ด์์ ์ฑ์ ๋ค์ด๋ก๋ํ๊ณ ์คํํ ์ ์์ต๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์ ์ค ์ ์์ต๋๋ค
์๋
https://play.google.com/store/apps/details?id=com.bumbystudio.starry_clock
.์๋๋ ๋น์ ์ด ํ์๋ก ํ๋ ๋์ ํ๋ฌํฐ ๋ฅํฐ์ ๋๋ค. ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
[โ] Flutter (์ฑ๋ ๋ง์คํฐ, v1.6.1-pre.88, Microsoft Windows [๋ฒ์ ]
10.0.17134.765], ๋ก์ผ์ผ zh-TW)[โ] Android ํด์ฒด์ธ - Android ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ(Android SDK ๋ฒ์
28.0.3)
[โ] ์๋๋ก์ด๋ ์คํ๋์ค(๋ฒ์ 3.3)
[โ] VS Code, 64๋นํธ ์๋์ (๋ฒ์ 1.30.2)
[!] ์ฐ๊ฒฐ๋ ์ฅ์น
! ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๊ธฐ ์์โ
์ด ์ค๋ ๋์ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/flutter/flutter/issues/18494?email_source=notifications&email_token=AAIHDZYY47H6PUQQJYEO4J3PW2J7RA5CNFSM4FFE2B7KYY3PNVWWK3TUL52HS4DFVEXG43VMXVBW
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAIHDZZXV67JCNVJYLVA3WLPW2J7RANCNFSM4FFE2B7A
.
@ndusart ํ์ฌ bundletool์ ๊ธฐ๋ฅ ์์ฒญ์
@SPodjasek ๊ทธ๋์ ์ด ๋ชจ๋ ๋ฌธ์ ๊ฐ ์๋ชป๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์์ต๋๋ค.
๋ชจ๋ ํ ๋ก ์ "๊ฑฑ์ ํ์ง ๋ง์ธ์. ์ฑ ๋ฒ๋ค์ ๋น๋ํ ์ ์์ผ๋ฉด ๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ์ ๊ฒ์
๋๋ค."๋ก ๋๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ํ์ฌ์ ๊ฐ๊น์ด ๋ฏธ๋์๋ ์ ํ ๊ทธ๋ ์ง ์์ต๋๋ค.
ํ๋ฌํฐ ํ์ด ์ฌ๋๋ค์ด ์ด๋ฐ ์์ผ๋ก ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ ์ฝ๊ฐ ์ค๋ง์ค๋ฝ์ต๋๋ค.
flutter๋ ๋ถํ ์์ฒด๋ฅผ ์ํํ๊ฑฐ๋ VM ์ค๋
์ท์ lib/
ํด๋๋ก ์ด๋ํ๊ณ ๋ถํ ์ด ์๋ํ๋๋ก ๊ด๋ฆฌํ์ฌ ๋ถํ APK๋ฅผ ์ฝ๊ฒ ๋น๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ ์ ์์ด์ผ ํฉ๋๋ค(๊ทธ๋ฐ ๋ค์ App Bundle๋ ์ฌ์ฉํ ์ ์์). )
์์ฝํ์๋ฉด:
flutter build apk ...
๋ฅผ ํตํด ํป APK๋ฅผ ์ง์ํฉ๋๋ค.flutter build appbundle
๋ฅผ ์ฌ์ฉํด ๋ณด์ธ์. ์ฑ ๋ฒ๋ค์ด ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์๋ํ์ง ์์ผ๋ฉด (1) ๋๋จธ์ง ์ฌ๋ก๋ฅผ ๋ค๋ฃจ์ด์ผ ํฉ๋๋ค.์ข์ @blasten ๋ง์คํฐ ์ฝ๋๋ฅผ ์ดํด๋ณด์๊ณ ์ค๋
์ท์ด lib ํด๋๋ก ์ด๋๋์์ต๋๋ค.
https://github.com/flutter/flutter/blob/dc28ba8919604ff19ea7cbad8d9400516347b08a/packages/flutter_tools/gradle/flutter.gradle#L470 -L481
๋ฐ๋ผ์ ๋จ์ํ ์ฑ ๋ฒ๋ค ์ง์์ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋๋๋ค. ์ด์ ๋ ๋ช
ํํด์ก์ต๋๋ค.
๋ฌธ์ ๋ ์์ฐ ํด๋์ด๊ณ ์ด ๋ฌธ์ ์ ์ฑ ๋ฒ๋ค ์ง์์ ๋งค์ฐ ๋
๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉํฅ์ผ๋ก ์์
์ด ์ํ๋์ง ์์ ์ ๋ณด๊ฐ ์ ๊ณต๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ์ ์ค๋ช
์ ๊ฐ์ฌํ ์ ์์ต๋๋ค.
์์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@ndusart - @blasten ์ Android ์๋ฒ ๋ฉ์ ๋ณ๊ฒฝํ์ฌ lib
ํด๋์์ ๋ฐ์ด๋๋ฆฌ blob์ ์ฐพ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค. ๊ทธ๋์ ์ ๊ฐ ์ค์ํ์ง ์๋๋ค๋ฉด ๋ ์ ํ ๋ชจ๋์์ ๋ฒ๋ค๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค...
์ค๋ ์ท์ lib๋ก ์ฎ๊ธฐ๋ฉด #30846๋ ์์ ๋ ๊น์?
@๋ธ๋ผ์คํ
๋ง์คํฐ ์ฑ๋๋ก ์ ํํ์ฌ ์ฑ ๋ฒ๋ค์ ์ ๊ทธ๋ ์ด๋ํ๊ณ ๋น๋ํ์ต๋๋ค. ๋ถํํ๋ ๋ค์ logcat์ ์ฌ์ฉํ์ฌ Google Play ์คํ ์ด์์ ๋ค์ด๋ก๋ํ ํ ์ฑ์ด ์บ์๋ฉ๋๋ค.2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings. 2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from. 2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance. 2019-05-22 09:42:14.824 6995-6995/? A/flutter: [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.
flutter build appbundle
์ด(๊ฐ) ์ด์ ๋ง์คํฐ์ ์์ต๋๋ค. ์๋ฐ์ ์ผ๋ก ์๋ํ๊ณ ์ถ์ ์ฌ๋์ด ์์ต๋๊น?
build apk
์์ ํ๋ซํผ ๋ชฉ๋ก์ ์ง์ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ๋ ผ์๋ฅผ ํ์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.flutter build apk --target-platform android-arm,android-arm64
์์ง ๋ก๊ทธ๊ฐ ์์ง๋ง ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ง์คํฐ๋ฅผ ์
๊ทธ๋ ์ด๋ํ๊ณ flutter build appbundle
. ์ค๋ฅ๋ฅผ ์ ๊ฑฐํ์ง๋ง ์ฑ์ ์ด๋ฉด ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
์ต์ ํ๋ฌํฐ ๋ง์คํฐ ๋ฒ์ ์ ์ฌ์ฉํ์ฌ ์ฑ ๋ฒ๋ค์ ์ต์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ์ฑ ์คํ ์ด์ ์ ๋ก๋ํ๋ ค๊ณ ํ์ต๋๋ค. 64๋นํธ ์ค๋ฅ๋ ์ด์ ์ฌ๋ผ์ก์ง๋ง ๋ด ์ฑ์ ์ฆ์ ์ถฉ๋ํฉ๋๋ค.
์ ๋ง ์ด์ํ ์ ์ ์๋ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ 64๋นํธ ๋ฒ์ ์ ์คํํ๋ฉด ์ ์๋ํ๋ค๋ ๊ฒ์
๋๋ค.
ํ๋ฌํฐ ๋น๋ apk --target-platform android-arm64
ํ๋ฌํฐ ์ค์น API
์ฑ ์คํ ์ด์ ์ฑ ๋ฒ๋ค์ ํตํด ์ฑ์ ์ค์นํ ๋๋ง ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค. ์ง๊ธ์ ์ฑ์คํ ์ด๋ฅผ 32๋นํธ APK๋ก ๋๋๋ ธ์ต๋๋ค.
๋ด gradle.build์๋ ํน๋ณํ ๊ฒ์ด ์์ต๋๋ค.
minSdk๋ฒ์ 21
targetSdk๋ฒ์ 28
versionCode flutterVersionCode.toInteger()
๋ฒ์ ์ด๋ฆ ํ๋ฌํฐ ๋ฒ์ ์ด๋ฆ
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
Flutter๋ฅผ ์คํ ์ค์ ๋๋ค(Mac OS X 10.14.5 18F132, ๋ก์ผ์ผ en-US์์ ์ฑ๋ ๋ง์คํฐ, v1.6.4-pre.13).
์ฑ์คํ ์ด์ ์ ๋ก๋ํ๊ธฐ ์ ์ ์ด๋ฌํ ๋ฒ๋ค์ ํ ์คํธํ ์ ์์ต๋๊น? ์ด๊ฒ์ Google์์ ์์ ์ค์ธ ์๋ ค์ง ๋ฌธ์ ์ ๋๊น ์๋๋ฉด gradle ํ์ผ์ ์ผ๋ถ ๋ณ๊ฒฝํด์ผ ํฉ๋๊น?
@chitwoob ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์: https://github.com/flutter/flutter/issues/18494#issuecomment -495049530
@blasten ์ด ๋ฌธ์ ์ ๊ด๋ จ ์๋ ๋ฒ๋ค ๋๊ตฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋๋ ์ป๋ค
์ค๋ฅ: ADB ์๋ฒ๋ฅผ ์์ํ์ง ๋ชปํ์ต๋๋ค.
์คํํ ๋
๋น๋-apks --connected-device --bundle=./app.aab --output=./my_app.apks --adb
db๊ฐ ์ ๋๋ก ์ค์น๋์ด ์์ต๋๋ค. adb logcat์ ์๋ํ๋ฉด ์ ์๋ํฉ๋๋ค.
์ด๊ฒ์ด ๋ด ์๋ฃจ์ ์ด์์ต๋๋ค.
app gradle
splits { // Configures multiple APKs based on ABI. abi { // Enables building multiple APKs per ABI. enable true // By default all ABIs are included, so use reset() and include to specify that we only // want APKs for armeabi-v7a and arm64-v8a. // Resets the list of ABIs that Gradle should create APKs for to none. reset() // Specifies a list of ABIs that Gradle should create APKs for. include "armeabi-v7a", "arm64-v8a" // Specifies that we do not want to also generate a universal APK that includes all ABIs. universalApk false } }
flutter build apk --release --target-platform=android-arm
- ํ๋ ์ด ์คํ ์ด์
app-armeabi-v7a-release.apk
์ ๋ก๋- ์ฆ๊ฐ
versionCode
flutter build apk --release --target-platform=android-arm64
- ํ๋ ์ด ์คํ ์ด์
app-arm64-v8a-release.apk
์ ๋ก๋Google Play ์คํ ์ด๋ ๊ธฐ๊ธฐ ์ํคํ ์ฒ์ ๋ฐ๋ผ ์ฑ์ ์ ๊ณตํฉ๋๋ค. 32๋นํธ ์ฅ์น๋ ๋ง์กฑํ๊ณ 64๋นํธ ์ฅ์น๋ ๋ง์กฑํ๋ฉฐ ๋ ์ํคํ ์ฒ๋ฅผ ๋ชจ๋ ์ ๊ณตํ๋ฉด์ APK ํฌ๊ธฐ๊ฐ ์๋์ ์ผ๋ก ์๊ฒ ์ ์ง๋๋ค๋ ์ฌ์ค์ ๋ง์กฑํฉ๋๋ค.
๋์ผํ APK์ ๋ ์ํคํ ์ฒ์ ๋ํ ์ง์์ด ํฌํจ๋ ๊ฒฝ์ฐ ์ฑ ํฌ๊ธฐ๋ 10MB ์ด์์ด ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
์ด ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๋ฉด "Gradle ๋น๋์์ Android ํจํค์ง๋ฅผ ์์ฑํ์ง ๋ชปํ์ต๋๋ค."๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋์์ต๋๋ค. ์ค๋ฅ
_ ํ ์๊ฐ์ ๋๋ฒ๊น
๋์ ์์ ์ฌํญ์ ์ฐพ์์ต๋๋ค. _
x86 ๋ฐ x64์ฉ์ผ๋ก ๋ค๋ฅธ ์ฑ์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
1๋จ๊ณ: app/build.gradle
ํ์ผ์ ์ฝ๋ ์กฐ๊ฐ์ ํฌํจํฉ๋๋ค. ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
....
lintOptions {
disable 'InvalidPackage'
}
splits {
// Configures multiple APKs based on ABI.
abi {
// Enables building multiple APKs per ABI.
enable true
// By default all ABIs are included, so use reset() and include to specify that we only
// want APKs for armeabi-v7a and arm64-v8a.
// Resets the list of ABIs that Gradle should create APKs for to none.
reset()
// Specifies a list of ABIs that Gradle should create APKs for.
include "armeabi-v7a", "arm64-v8a"
// Specifies that we do not want to also generate a universal APK that includes all ABIs.
universalApk false
}
}
defaultConfig {
....
2๋จ๊ณ: flutter build apk --release
์ฌ์ฉํ์ฌ ๋ฆด๋ฆฌ์ค APK ๋ง๋ค๊ธฐ
build/app/outputs/apk/app.apk
ํด๋์ x86 ๊ธฐ๋ฐ APK๊ฐ ์์ฑ๋ฉ๋๋ค.
์ด APK๋ฅผ Google Play ์คํ ์ด์ ์
๋ก๋ํ์ธ์.
์ง๊ธ๊น์ง x86 ์๋ฃ
์ด ์์ ์์ flutter clean
์คํํ์ง ๋ง์ญ์์ค.
์ด ์์
์ ์ํํ๊ณ x64 APK๋ฅผ ๋น๋ํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
3 ๋จ๊ณ : ์ด์ ์ด pubspec.yaml
ํ๊ณ ๋ณ๊ฒฝ version
์๋ฅผ
version: 1.0.0+1
~ version: 1.0.0+2
+ ์์ ์ซ์๋ ๋ฒ์ ์ฝ๋์ ๋๋ค.
4๋จ๊ณ: ์ด์ ๋ช
๋ น์ ์คํํฉ๋๋ค.
flutter build apk --release --target-platform=android-arm64
์ด ๋ช
๋ น์ด ์๋ฃ๋๋ฉด build/app/outputs/apk/release/
ํฉ๋๋ค. ๊ฑฐ๊ธฐ์์ ์ด๋ฆ์ด app-arm64-v8a-release.apk
์ธ apk๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฒ์ ์ฝ๋๊ฐ ๋ค๋ฅธ 64๋นํธ apk ํ์ผ์
๋๋ค.
์ด์ ์ด x64 apk๋ฅผ ํ๋ ์ด ์คํ ์ด์ ์ ๋ก๋ํ์ธ์.... ์ฌ๊ธฐ ์์ต๋๋ค. x86 ๋ฐ x64 ์ฑ์ ๋ชจ๋ Play ์คํ ์ด์ ์ ๋ก๋ํ์ต๋๋ค.
๊ธด ์ค๋ช ์ด ๋ ๊ฒ์ด์ง๋ง ์ด๊ฒ์ ๋ฌธ์ ๋ฅผ ์์ ํ ํด๊ฒฐํ์ต๋๋ค.
[...]
x86 ๋ฐ x64์ฉ์ผ๋ก ๋ค๋ฅธ ์ฑ์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.1๋จ๊ณ:
app/build.gradle
ํ์ผ์ ์ฝ๋ ์กฐ๊ฐ์ ํฌํจํฉ๋๋ค. ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค..... lintOptions { disable 'InvalidPackage' } splits { // Configures multiple APKs based on ABI. abi { // Enables building multiple APKs per ABI. enable true // By default all ABIs are included, so use reset() and include to specify that we only // want APKs for armeabi-v7a and arm64-v8a. // Resets the list of ABIs that Gradle should create APKs for to none. reset() // Specifies a list of ABIs that Gradle should create APKs for. include "armeabi-v7a", "arm64-v8a" // Specifies that we do not want to also generate a universal APK that includes all ABIs. universalApk false } } defaultConfig { ....
2๋จ๊ณ:
flutter build apk --release
์ฌ์ฉํ์ฌ ๋ฆด๋ฆฌ์ค APK ๋ง๋ค๊ธฐ
[...]
๊ทํ์ ๋ต๋ณ์ ๋์ํฉ๋๋ค. 1๋จ๊ณ๋ฅผ ๋ฐ๋ฅผ ํ์๊ฐ ์์์์๋ ๋ถ๊ตฌํ๊ณ ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค(๊ธฐ๋ณธ build.gradle ์ฌ์ฉ).
๊ทธ๋ฐ ๋ค์ Google Play์์ ์น์ธํ ์ ์๋๋ก ๋น๋ ๋ฒํธ์ ๋ฒ์ ์ ์ฆ๊ฐ์ํค๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ฌ์ ํ flutter build appbundle
์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ธด ์ค๋ช ์ด ๋ ๊ฒ์ด์ง๋ง ์ด๊ฒ์ ๋ฌธ์ ๋ฅผ ์์ ํ ํด๊ฒฐํ์ต๋๋ค.
[...]
x86 ๋ฐ x64์ฉ์ผ๋ก ๋ค๋ฅธ ์ฑ์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
1๋จ๊ณ:app/build.gradle
ํ์ผ์ ์ฝ๋ ์กฐ๊ฐ์ ํฌํจํฉ๋๋ค. ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค..... lintOptions { disable 'InvalidPackage' } splits { // Configures multiple APKs based on ABI. abi { // Enables building multiple APKs per ABI. enable true // By default all ABIs are included, so use reset() and include to specify that we only // want APKs for armeabi-v7a and arm64-v8a. // Resets the list of ABIs that Gradle should create APKs for to none. reset() // Specifies a list of ABIs that Gradle should create APKs for. include "armeabi-v7a", "arm64-v8a" // Specifies that we do not want to also generate a universal APK that includes all ABIs. universalApk false } } defaultConfig { ....
2๋จ๊ณ:
flutter build apk --release
์ฌ์ฉํ์ฌ ๋ฆด๋ฆฌ์ค APK ๋ง๋ค๊ธฐ
[...]๊ทํ์ ๋ต๋ณ์ ๋์ํฉ๋๋ค. 1๋จ๊ณ๋ฅผ ๋ฐ๋ฅผ ํ์๊ฐ ์์์์๋ ๋ถ๊ตฌํ๊ณ ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค(๊ธฐ๋ณธ build.gradle ์ฌ์ฉ).
๊ทธ๋ฐ ๋ค์ Google Play์์ ์น์ธํ ์ ์๋๋ก ๋น๋ ๋ฒํธ์ ๋ฒ์ ์ ์ฆ๊ฐ์ํค๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ฌ์ ํ
flutter build appbundle
์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์๋ ์ํจ. ๋๋ฌด ํ๊ฐ ๋๋ค. x86 ์๋ฎฌ๋ ์ดํฐ์ ์ค์ ํ ์ฅ์น์ ๋ฐฐํฌํ๋ ค๊ณ ํ๋ฉด ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ถฉ๋ํ์ต๋๋ค. ๋ง์คํฐ/๋ฒ ํ/์์ ์ฑ๋๋ก ์๋ํ์ต๋๋ค. ์ถ์ ์ค๋น๊ฐ ๋์ง ์์์ต๋๋ค. ์ฐ๋ฆฌ์๊ฒ๋ ์ฌ์ ํ ์ผ ์คํ ํผ์ ๋๋ค. Appbundle ๋ช ๋ น์ ์ฌ์์ ์ํด ์ค์น ๊ฐ๋ฅํ ๋ฒ๋ค์ ์์ฑํ์ง๋ง ๋ฐํ์ ๋์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ ํ๋ฉด๋ง ํ์ํ ๋ค์ ์ ์งํฉ๋๋ค. Flutter ํ์ ๋ช ํํ ์๋ฃจ์ ๋๋ WA๋ฅผ ์ ๊ณตํ์ญ์์ค.
@mormih ๊ธฐ๋ค๋ ค ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ฌ์์ฐ ์์ ์ ํ๊ณ ์์ต๋๋ค. ๊ด์ฐฎ์ผ์๋ค๋ฉด ๋ค์์ ํฌํจํ ์ด๋ฉ์ผ([email protected])์ ๋ณด๋ด์ฃผ์๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
--bug-report
(์: flutter build appbundle --bug-report
)๋ก ๋น๋ ๋ช
๋ น์ ์คํํ๊ณ ๊ด๋ จ bugreport.zip
ํ์ผ์ ์ฒจ๋ถํฉ๋๋ค.adb bugreport
๊ฒฐ๊ณผ๋ฅผ ์ฒจ๋ถํฉ๋๋ค.๊ฐ์ฌ ํด์!
@tvolkert ๋ํ ๋ค์ ๋ฉ์์ง์ ํจ๊ป ์ถฉ๋ํ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ํ์ธ ์คํจ: vm. VM์ ์ด๊ธฐํํ ์ ์์ด์ผ ํฉ๋๋ค.
๋ด ํธ์คํธ ํ๋ซํผ์ Mac ๋ฐ macOS 10.14.5์ ๋๋ค. ๊ทธ๊ฒ์ ์ฌํํ ์ ์์์ต๋๊น, ์๋๋ฉด ์์์ ์์ฑํ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๊ธฐ๋ฅผ ์ํ์ญ๋๊น? ๋ํ OP์๋ ๋ณ๊ฐ์ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฉ ํฐ์ผ์ด ์์ด์ผ ํ ์๋ ์์ต๋๋ค. ๊ฑด๋ฐฐ
@mormih ํ์คํ์ง ์์ง๋ง abi ๋ชฉ๋ก์ x86
๋ ํฌํจํด ๋ณด์
จ์ต๋๊น?
include "armeabi-v7a", "arm64-v8a", "x86"
flutter build appbundle
(๋ง์คํฐ์์)๋ ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ง์ ํ ๊ฒ์ฒ๋ผ ์คํ๋์ ํ๋ฉด์ด ๋ฉ์ถ๊ฒํ์ญ์์ค ...
์ง๊ธ๊น์ง 32๋นํธ ๋ฐ 64๋นํธ ๋ชจ๋์ ๋ํด (Play ์คํ ์ด์์) ์ถ์ํ๊ธฐ ์ํด ์ฐพ์ ์ ์ผํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. (์ค์์ ๋ถ๋ถ์ ์ผ๋ก ๋ค๋ฃจ์์ง๋ง ๋๊ตฐ๊ฐ๋ฅผ ๋์ธ ์ ์์):
v7 ํํฐ๋ฅผ ์ผ๊ณ ๊ธฐ๋ณธ ๋น๋ apk ๋ช
๋ น์ ์ฌ์ฉํ์ฌ apk๋ฅผ ๋ง๋ญ๋๋ค.
app/build.gradle ํ์ผ์์:
defaultConfig {
...
ndk{ abiFilters "armeabi-v7a" }
}
๊ทธ๋ฆฌ๊ณ ์คํ
flutter build apk
(๊ธฐ๋ณธ๊ฐ์ --release)
pubspec.yaml์์ ๋น๋ ๋ฒํธ๋ฅผ ๋ฒํํ์ญ์์ค.
์: version: 1.1.0+6
์์ version: 1.1.0+7
v8 ํํฐ๋ฅผ ์ฌ์ฉํ์ฌ apk๋ฅผ ๋ง๋ค๊ณ arm64๋ฅผ ๋์ ํ๋ซํผ์ผ๋ก ์ฌ์ฉํ์ฌ ๋น๋ํฉ๋๋ค.
์ด์ ๋ค์๊ณผ ๊ฐ์ด build.gradle์ ์
๋ฐ์ดํธํ์ญ์์ค.
defaultConfig {
...
ndk{ abiFilters "arm64-v8a" }
}
๊ทธ๋ฆฌ๊ณ ์คํ
flutter build apk --release --target-platform android-arm64
2๊ฐ์ apk๋ฅผ ์ ๋ก๋ํด์ผ ํ๋ ์ค๋ฒํค๋(๋ฐ๋ผ์ 2๊ฐ์ ๋น๋ ๋ฒํธ ์์ฑ)๊ฐ ํฌํจ๋์ง๋ง ์ ์ด๋ ์์ ์ ์ํํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ 32๋นํธ ๋ฐ 64๋นํธ ์ฅ์น ๋ชจ๋์ ๋ํด ๋ฆด๋ฆฌ์คํ ์ ์์ต๋๋ค...
์ฐธ๊ณ : x86์ ์์ฃผ ์์ ๊ทธ๋ฃน์ ๋ชจ๋ฐ์ผ ์ฅ์น(๋ด ์ฌ์ฉ์๋ ํฌํจํ์ง ์์ ์ ์์)๋ง ํฌํจํ๊ณ ์๋ฎฌ๋ ์ดํฐ์์ ๋ฆด๋ฆฌ์ค ๋น๋๊ฐ ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ํฌ๊ธฐํ์ต๋๋ค(๋๋ฒ๊ทธ๋ ํ ์คํธ์ ์ถฉ๋ถํจ). ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ฌผ๋ก ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ๊ทธ๋ ์ง ์์ ์๋ ์์ต๋๋ค.
@ezmegy ๋ฐฉ๋ฒ์ ๋๋ฅผ ์ํด ์ผํ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ฐ์ฌ ํด์
๋๊ธ ์ด๋๊ฐ์ ๋๊ตฐ๊ฐ๊ฐ ์ด๊ฒ์ ๋จ๊ฒผ์ต๋๋ค.
์ด๊ฒ์ ์ ์ ์ ์ผํ 1 ํฐ๋ฏธ๋ ์ฝ๋์์ ์๋ํ์ต๋๋ค.
๋ด๊ฐ ์ซ์ดํ๋ 2๊ฐ์ ํ์ผ์ ์ถ๋ ฅํ๊ณ 2๊ฐ์ ๋ฒ์ ์ ์์ฑํฉ๋๋ค.
@ezmegy ๊ฐ์ฌํฉ๋๋ค! ๋น์ ์ ๋ด ํ๋ฃจ๋ฅผ ์ ์ฅ
๊ฐ์ฌํฉ๋๋ค @ezmegy , ๋น์ ์ "ํธ๋ฆญ"์ด ์๋ํฉ๋๋ค!
@ezmegy ๊ฐ์ฌ
๋์์ด ๋ ์ ์๋ ํ์ฌ ์ํฌํ๋ก๋ฅผ ๊ณต์ ํ๊ณ ์ถ์ต๋๋ค.
์ํคํ
์ฒ๋น app/build.gradle
์ ๋ช ๊ฐ์ง ๋น๋ ๋ฒ์ ๋ง๋ค๊ธฐ
flavorDimensions 'arch'
productFlavors {
arm32 {
dimension 'arch'
ndk {
abiFilters 'armeabi-v7a'
}
}
arm64 {
dimension 'arch'
ndk {
abiFilters 'arm64-v8a'
}
}
๊ทธ๋ฐ ๋ค์ ๋ค์์ ์ฌ์ฉํ์ฌ ๋ ๋ค ๋ง๋ค ์ ์์ต๋๋ค.
flutter build apk --flavor arm32
๊ทธ๋ฆฌ๊ณ
flutter build apk --flavor arm64 --target-platform android-arm64
๋ชจ๋ ๋น๋์์ gradle์ ์์ ํ์ง ์๊ณ
๋ฒ์ ์ฝ๋์ ๊ด๋ จํ์ฌ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋๋ฅผ ์ค์ ํ๊ณ ํด๋น ์ฝ๋์์ ๋ค๋ฅธ ํ๋๋ฅผ ํ์์ํค๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
์๋ฅผ ๋ค์ด arm32
๋ฅผ 1.0.0+10000์ผ๋ก ์ค์ ํ๊ณ 1.0.0+10001์ธ arm64
๋ํ ๋ฒ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
์ด๊ฒ์ bash๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ๊ธฐ ์ฌ์์ผ ํฉ๋๋ค(๋๋ fastlane์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ fastfile ๋ด์์).
--build-number
์ธ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ fastlane์ ํตํด ๋น๋ ๋ฒํธ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
์ด ๋ฒ์ ์ฝ๋ ์คํฌ๋ฆฝํ ์ CI/CD์์ ์ ์๊ฒ ๋์์ด ๋ฉ๋๋ค ๐
CMIIW
๋๋ฅผ ์ํด ์ด๊ฒ์ ๊ฝค ์ ์๋ํ์ต๋๋ค.
https://github.com/flutter/flutter/issues/10728#issuecomment -461375218
๊ธด ์ค๋ช ์ด ๋ ๊ฒ์ด์ง๋ง ์ด๊ฒ์ ๋ฌธ์ ๋ฅผ ์์ ํ ํด๊ฒฐํ์ต๋๋ค.
์ด๊ฒ์ด ๋ด ์๋ฃจ์ ์ด์์ต๋๋ค.
app gradle
splits { // Configures multiple APKs based on ABI. abi { // Enables building multiple APKs per ABI. enable true // By default all ABIs are included, so use reset() and include to specify that we only // want APKs for armeabi-v7a and arm64-v8a. // Resets the list of ABIs that Gradle should create APKs for to none. reset() // Specifies a list of ABIs that Gradle should create APKs for. include "armeabi-v7a", "arm64-v8a" // Specifies that we do not want to also generate a universal APK that includes all ABIs. universalApk false } }
flutter build apk --release --target-platform=android-arm
- ํ๋ ์ด ์คํ ์ด์
app-armeabi-v7a-release.apk
์ ๋ก๋- ์ฆ๊ฐ
versionCode
flutter build apk --release --target-platform=android-arm64
- ํ๋ ์ด ์คํ ์ด์
app-arm64-v8a-release.apk
์ ๋ก๋Google Play ์คํ ์ด๋ ๊ธฐ๊ธฐ ์ํคํ ์ฒ์ ๋ฐ๋ผ ์ฑ์ ์ ๊ณตํฉ๋๋ค. 32๋นํธ ์ฅ์น๋ ๋ง์กฑํ๊ณ 64๋นํธ ์ฅ์น๋ ๋ง์กฑํ๋ฉฐ ๋ ์ํคํ ์ฒ๋ฅผ ๋ชจ๋ ์ ๊ณตํ๋ฉด์ APK ํฌ๊ธฐ๊ฐ ์๋์ ์ผ๋ก ์๊ฒ ์ ์ง๋๋ค๋ ์ฌ์ค์ ๋ง์กฑํฉ๋๋ค.
๋์ผํ APK์ ๋ ์ํคํ ์ฒ์ ๋ํ ์ง์์ด ํฌํจ๋ ๊ฒฝ์ฐ ์ฑ ํฌ๊ธฐ๋ 10MB ์ด์์ด ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.์ด ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๋ฉด "Gradle ๋น๋์์ Android ํจํค์ง๋ฅผ ์์ฑํ์ง ๋ชปํ์ต๋๋ค."๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋์์ต๋๋ค. ์ค๋ฅ
_ ํ ์๊ฐ์ ๋๋ฒ๊น ๋์ ์์ ์ฌํญ์ ์ฐพ์์ต๋๋ค. _x86 ๋ฐ x64์ฉ์ผ๋ก ๋ค๋ฅธ ์ฑ์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
1๋จ๊ณ:
app/build.gradle
ํ์ผ์ ์ฝ๋ ์กฐ๊ฐ์ ํฌํจํฉ๋๋ค. ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค..... lintOptions { disable 'InvalidPackage' } splits { // Configures multiple APKs based on ABI. abi { // Enables building multiple APKs per ABI. enable true // By default all ABIs are included, so use reset() and include to specify that we only // want APKs for armeabi-v7a and arm64-v8a. // Resets the list of ABIs that Gradle should create APKs for to none. reset() // Specifies a list of ABIs that Gradle should create APKs for. include "armeabi-v7a", "arm64-v8a" // Specifies that we do not want to also generate a universal APK that includes all ABIs. universalApk false } } defaultConfig { ....
2๋จ๊ณ:
flutter build apk --release
์ฌ์ฉํ์ฌ ๋ฆด๋ฆฌ์ค APK ๋ง๋ค๊ธฐ
build/app/outputs/apk/app.apk
ํด๋์ x86 ๊ธฐ๋ฐ APK๊ฐ ์์ฑ๋ฉ๋๋ค.
์ด APK๋ฅผ Google Play ์คํ ์ด์ ์ ๋ก๋ํ์ธ์.
์ง๊ธ๊น์ง x86 ์๋ฃ์ด ์์ ์์
flutter clean
์คํํ์ง ๋ง์ญ์์ค.
์ด ์์ ์ ์ํํ๊ณ x64 APK๋ฅผ ๋น๋ํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.3 ๋จ๊ณ : ์ด์ ์ด
pubspec.yaml
ํ๊ณ ๋ณ๊ฒฝversion
์๋ฅผ
version: 1.0.0+1
~version: 1.0.0+2
+ ์์ ์ซ์๋ ๋ฒ์ ์ฝ๋์ ๋๋ค.
4๋จ๊ณ: ์ด์ ๋ช ๋ น์ ์คํํฉ๋๋ค.
flutter build apk --release --target-platform=android-arm64
์ด ๋ช ๋ น์ด ์๋ฃ๋๋ฉด
build/app/outputs/apk/release/
ํฉ๋๋ค. ๊ฑฐ๊ธฐ์์ ์ด๋ฆ์ดapp-arm64-v8a-release.apk
์ธ apk๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฒ์ ์ฝ๋๊ฐ ๋ค๋ฅธ 64๋นํธ apk ํ์ผ์ ๋๋ค.์ด์ ์ด x64 apk๋ฅผ ํ๋ ์ด ์คํ ์ด์ ์ ๋ก๋ํ์ธ์.... ์ฌ๊ธฐ ์์ต๋๋ค. x86 ๋ฐ x64 ์ฑ์ ๋ชจ๋ Play ์คํ ์ด์ ์ ๋ก๋ํ์ต๋๋ค.
๊ทธ๊ฒ์ 1 ๋จ๊ณ์์ด ๋์๊ฒ๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค. ๋ชจ๋ ์ฌ๋์๊ฒ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ndk ํํฐ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ndk {
abiFilters "armeabi-v7a", "x86"
}
๋น๋ gradle ํ์ผ์์ ํ์์ธ์ง ์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ ์ธ์๋ 2๋จ๊ณ์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์ํํ๊ณ 32๋นํธ์ฉ๊ณผ 64๋นํธ์ฉ ๋ ๊ฐ์ APK๋ฅผ ์
๋ก๋ํ์ต๋๋ค.
์ด์ ์ appbundle์ ์ ๋ก๋ํ๋๋ฐ ์ด๋ฒ์๋ apk ํ์ผ์ ์ ๋ก๋ํ์ต๋๋ค. ์ ์๋ํฉ๋๋ค. ๋๋ appbundle๋ก ํ์ธํ๊ณ ๋ ๊ฐ์ APK๋ฅผ ์ ๋ก๋ํ์ง ์๊ณ ์์ ํ๋ ค๊ณ ๋ ธ๋ ฅํด์ผํฉ๋๋ค.
๋ฉ๋ชจ :
์ด ํ๋ก์ธ์ค๋ฅผ ์ํํ๊ธฐ ์ ์ ๋ด ์ฑ์ด ๋ค์ arm-64๋นํธ ๊ธฐ๊ธฐ์์ ์ถฉ๋ํ์ต๋๋ค.
ํ๋ฏธ ๋ฏธ,
ํ๋ฏธ 3S ํ๋ผ์
๋ช
์ 8๋ฐฐ
๋ค์ arm-64๋นํธ ์ฅ์น์์ ์์
์ผ์ฑ ๊ฐค๋ญ์ J4
์ผ์ฑ ์จ8
์๋ ํ์ธ์ ํ๋ฌํฐํ์ ๋๋ค.
์ ๋ฐ. ์ค๊ตญ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ฑ ์์ฅ๋ ๊ณ ๋ คํ์ญ์์ค. ์ค๊ตญ์์๋ Google Play ์คํ ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋์ XiaoMi's, HuaWei's ๋ฐ Ali's...๋ฑ๊ณผ ๊ฐ์ ๋ง์ ์ฑ ์์ฅ์ด ์์ต๋๋ค.
์ด๋ฌํ ์ฑ ์์ฅ์์๋ ๋ค๋ฅธ ์ํคํ ์ฒ์ apk ๋ฆด๋ฆฌ์ค๋ฅผ ์ ๊ณตํ ์ ์์ผ๋ฉฐ ๋ฆด๋ฆฌ์ค๋น ํ๋์ apk๋ง ์ ๋ก๋ํ ์ ์์ผ๋ฉฐ ํด๋น ๋ฆด๋ฆฌ์ค๋ ์ด์ ๋ฆด๋ฆฌ์ค์ apk๋ณด๋ค ์ฐ์ ์ ์ฉ๋ฉ๋๋ค. ์ฆ, ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ "armeabi-v7a"๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์ ์ ํด ์ฃผ์ธ์. "armeabi-v7a"๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ 64๋นํธ ์ฅ์น๊ฐ 32๋นํธ libflutter.so๋ฅผ ์คํํ๊ณ ์๋๊ฐ ๋๋ ค์ง ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋์ ํ๋ฌํฐ ํ์ด 32๋นํธ์ 64๋นํธ libflutter.so๋ฅผ ๋ชจ๋ ํฌํจํ๋ apk๋ฅผ ๋น๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ ์ ์๋ค๋ฉด ์ ์ํ๊ณ ์ถ์ต๋๋ค. ํ์ง๋ง apk์ ํฌ๊ธฐ๋ ๋ ์ปค์ง ๊ฒ์ ๋๋ค. (์ค๊ตญ์์๋ ๋ณดํต ์ธํฐ๋ท ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ฉฐ 4G ์ฌ์ฉ ์๊ธ์ ๋ฅผ ๋ฌด์ ํ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๊ฑฐ์ ์ง๋ถํ์ง ์์ผ๋ฉฐ ์ฌ๋๋ค์ ์ผ๋ฐ์ ์ผ๋ก apk์ ํฌ๊ธฐ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.)
์๋ ํ์ธ์ ํ๋ฌํฐํ์ ๋๋ค.
์ ๋ฐ. ์ค๊ตญ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ฑ ์์ฅ๋ ๊ณ ๋ คํ์ญ์์ค. ์ค๊ตญ์์๋ Google Play ์คํ ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋์ XiaoMi's, HuaWei's ๋ฐ Ali's...๋ฑ๊ณผ ๊ฐ์ ๋ง์ ์ฑ ์์ฅ์ด ์์ต๋๋ค.
์ด๋ฌํ ์ฑ ์์ฅ์์๋ ๋ค๋ฅธ ์ํคํ ์ฒ์ apk ๋ฆด๋ฆฌ์ค๋ฅผ ์ ๊ณตํ ์ ์์ผ๋ฉฐ ๋ฆด๋ฆฌ์ค๋น ํ๋์ apk๋ง ์ ๋ก๋ํ ์ ์์ผ๋ฉฐ ํด๋น ๋ฆด๋ฆฌ์ค๋ ์ด์ ๋ฆด๋ฆฌ์ค์ apk๋ณด๋ค ์ฐ์ ์ ์ฉ๋ฉ๋๋ค. ์ฆ, ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ "armeabi-v7a"๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์ ์ ํด ์ฃผ์ธ์. "armeabi-v7a"๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ 64๋นํธ ์ฅ์น๊ฐ 32๋นํธ libflutter.so๋ฅผ ์คํํ๊ณ ์๋๊ฐ ๋๋ ค์ง ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋์ ํ๋ฌํฐ ํ์ด 32๋นํธ์ 64๋นํธ libflutter.so๋ฅผ ๋ชจ๋ ํฌํจํ๋ apk๋ฅผ ๋น๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ ์ ์๋ค๋ฉด ์ ์ํ๊ณ ์ถ์ต๋๋ค. ํ์ง๋ง apk์ ํฌ๊ธฐ๋ ๋ ์ปค์ง ๊ฒ์ ๋๋ค. (์ค๊ตญ์์๋ ๋ณดํต ์ธํฐ๋ท ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ฉฐ 4G ์ฌ์ฉ ์๊ธ์ ๋ฅผ ๋ฌด์ ํ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๊ฑฐ์ ์ง๋ถํ์ง ์์ผ๋ฉฐ ์ฌ๋๋ค์ ์ผ๋ฐ์ ์ผ๋ก apk์ ํฌ๊ธฐ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.)
๊ทํ์ ๊ฒฝ์ฐ ํ์ค 32๋นํธ๋ฅผ ์ ๊ณตํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๊ฒ์ด ์ ๋ ๊ฒ์
๋๋ค. ๋ง์ต๋๊น?
64๋นํธ ๊ฒฝ๊ณ ๋ Google Play์๋ง ํด๋น๋ฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ์ค๊ตญ์ ๋ฌธ์ ๊ฐ ์๋๋ผ๊ณ ๋ฏฟ๋๋ค.
(์ ๊ฐ ํ๋ ธ๋ค๋ฉด ์ง์ ํด์ฃผ์ธ์.)
@ KunalT6569 ๊ทํ๊ฐ ๋งํ๋๋ก 3 ๋จ๊ณ๋ฅผ ์ถ์ธกํฉ๋๋ค.
3๋จ๊ณ: ์ด์ pubspec.yaml์ ์ด๊ณ ๋ค์์์ ๋ฒ์ ์ ๋ณ๊ฒฝํฉ๋๋ค.
๋ฒ์ : 1.0.0+1 ~ ๋ฒ์ : 1.0.0+2
๋ apk ํ์ผ์ ๋ชจ๋ Google Play ์ฝ์์ ์ ๋ก๋ํ๋ ค๋ฉด ํ์ํ์ง ์์ต๋๊น?
์ง๋ฌธ์ด ํ๋ ๋ ์์ต๋๋ค. ๋ apk ํ์ผ์ด ๋ชจ๋ ์ค๋น๋๋ฉด App releases\New Release\Browse Files
์น์
์ ํตํด ์
๋ก๋ํ๊ธฐ
@angel1st ์, Google Play ์์๋ ๋ฒ์ ์ฝ๋๊ฐ ๋์ผํ ๋ ๊ฐ์ APK๋ฅผ ์ ๋ก๋ํ ์ ์์ผ๋ฏ๋ก 3๋จ๊ณ ๊ฐ ํ์ํฉ๋๋ค.
Google Play์ ์ฌ๋ฌ ๊ฐ์ APK๋ฅผ ์
๋ก๋ํ๊ธฐ ์ํด ์ด ๋์์์ ์ฐธ์กฐํ์ต๋๋ค.
https://www.youtube.com/watch?v=rMl_oLlf_g0
์ฐธ๊ณ ๋ก:
ํ์ฌ ๊ณํ์ ํฅํ 10์ผ ์ด๋ด์ ์ต๊ทผ ๊ฐ๋ฐ ๋ฆด๋ฆฌ์ค ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ ํ๋ฅผ ๋ฆด๋ฆฌ์คํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฐ๋ฆฌ ๊ณํ์ Play ์คํ ์ด์์ 64๋นํธ ๋น๋์ ๋ํ ๊ฒฝ๊ณ ๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ง ์๋ Android์์ ๋ฐฐ์กํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ๋ฐ์ดํธ๋ ๋ฌธ์ํ๋ ํ๋ก์ธ์ค๊ฐ ์์ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ 64๋นํธ๋ฅผ ์ง์ํ๋ APK๋ฅผ ํจํค์งํ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐค๋ฌ๋ฆฌ๋ฅผ ๋ฆด๋ฆฌ์คํ ์ ์์ผ๋ฉฐ, ๊ทธ๋ ๊ฒ ํ๋ ์ฆ์ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ผ ์ ๋ฒ ํ๋ฅผ ๋ฆด๋ฆฌ์คํ ๋ค์ ์ผ์ฃผ์ผ ์ ๋ ํ์ ์์ ํ ๋ฒ์ ์ผ๋ก ํธ์ํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ 6์ ์ด์ ๋ฒ ํ๋ฅผ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์๊ณ , 6์ ๋ง์ด๋ 7์ ์ด์ ๋ฒ ํ๊ฐ ์์ ๊ฒ์ด๋ฉฐ ๊ทธ ํ ๊ณง ์์ ๋ ๊ฒ์์ ์๋ฏธํฉ๋๋ค.
@Hixie ์ฌ๊ธฐ์ ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ต์ ํ๋ฌํฐ(ํ์ฌ ๋ง์คํฐ)์ ์ฑ ๋ฒ๋ค์ x86, x86_64 ๋ฒ์ ์ ์์ฑํ์ง ์์
๋ง์คํฐ ๋ธ๋์น์์ ์์ฑ๋ ํ์ผ
Android Studio๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ๋ฒ์ ์์ ์์ฑ๋ ํ์ผ
์์๋๋ ๋์์ x86 , x86_64 ๋ฒ์ ๊ณผ ์ ๋ฒ์ ์์ ์์ฑ๋ ํ์ผ์ ํฌํจํ๋ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ์ ๋ ๋ฆฝ์ ์ธ @canewsin, ์ฐ๋ฆฌ๋ 86 ๊ฐ ๋ฆด๋ฆฌ์ค ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค (https://github.com/flutter/flutter/issues/9253) - "์ด์ ๋ฒ์ "์ https://github.com/flutter/ flutter/issues/18494#issuecomment -497118805 ๋๋ฒ๊ทธ ๋น๋๋ฅผ ์ฐธ์กฐํฉ๋๊น?
๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. 32๋นํธ์ฉ์ผ๋ก ๋น๋ํ๋ฉด 64๋นํธ ์ฅ์น๊ฐ ์ ์ธ๋์ง๋ง ์คํ๋ฉ๋๋ค.
--target-platform android-arm64
๋ฅผ ์ง์ ํ์ฌ 64์ฉ ๋น๋๋ 64๋นํธ ์ฅ์น์์ ์๋ํ์ง๋ง 32๋นํธ ์ฅ์น์์๋ ์ถฉ๋ํฉ๋๋ค. ๋ํ Google์ 2019๋ ์ APK ์ ๋ก๋๋ฅผ 64๋นํธ๋ก ์ ํํ ์์ ์ ๋๋ค.Flutter Team, ์ด ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ์ธ์!
๊ธฐ๋ณธ ๊ตฌ์ฑ {
....
๋ฒ์ ์ด๋ฆ ํ๋ฌํฐ ๋ฒ์ ์ด๋ฆ
ndk.abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
// ์ค๋น๊ฐ ๋!
์ต์ ํ๋ฌํฐ ๋ง์คํฐ ๋ถ๊ธฐ๋ก ๋ด ์ฑ์ ์ปดํ์ผํ๊ณ ์ฑ ๋ฒ๋ค๋ก ํ๋ ์ด ์คํ ์ด์ ์ ๋ก๋ํ์ง๋ง ์ฑ์ด ๊ธฐ๊ธฐ์์ ์ถฉ๋ํฉ๋๋ค. ์ด ๋ก๊ทธ๋ ํ ์คํธ ๋ฉ์์ ๊ฐ์ ธ์์ต๋๋ค.
05-31 07:50:28.384: D/AndroidRuntime(11036): --------- beginning of crash
05-31 07:50:28.384: E/AndroidRuntime(11036): FATAL EXCEPTION: main
05-31 07:50:28.384: E/AndroidRuntime(11036): Process: in.canews.social, PID: 11036
05-31 07:50:28.384: E/AndroidRuntime(11036): java.lang.RuntimeException: Unable to create application in.canews.social.App: java.lang.NullPointerException: Attempt to get length of null array
05-31 07:50:28.384: E/AndroidRuntime(11036): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5794)
05-31 07:50:28.384: E/AndroidRuntime(11036): at android.app.ActivityThread.-wrap1(Unknown Source:0)
05-31 07:50:28.384: E/AndroidRuntime(11036): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
05-31 07:50:28.384: E/AndroidRuntime(11036): at android.os.Handler.dispatchMessage(Handler.java:105)
05-31 07:50:28.384: E/AndroidRuntime(11036): at android.os.Looper.loop(Looper.java:164)
05-31 07:50:28.384: E/AndroidRuntime(11036): at android.app.ActivityThread.main(ActivityThread.java:6541)
05-31 07:50:28.384: E/AndroidRuntime(11036): at java.lang.reflect.Method.invoke(Native Method)
05-31 07:50:28.384: E/AndroidRuntime(11036): at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
05-31 07:50:28.384: E/AndroidRuntime(11036): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
05-31 07:50:28.384: E/AndroidRuntime(11036): Caused by: java.lang.NullPointerException: Attempt to get length of null array
05-31 07:50:28.384: E/AndroidRuntime(11036): at io.flutter.view.FlutterMain.listLibs(FlutterMain.java:381)
05-31 07:50:28.384: E/AndroidRuntime(11036): at io.flutter.view.FlutterMain.initAot(FlutterMain.java:412)
05-31 07:50:28.384: E/AndroidRuntime(11036): at io.flutter.view.FlutterMain.startInitialization(FlutterMain.java:164)
05-31 07:50:28.384: E/AndroidRuntime(11036): at io.flutter.view.FlutterMain.startInitialization(FlutterMain.java:143)
05-31 07:50:28.384: E/AndroidRuntime(11036): at io.flutter.app.FlutterApplication.onCreate(FlutterApplication.java:22)
05-31 07:50:28.384: E/AndroidRuntime(11036): at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1118)
05-31 07:50:28.384: E/AndroidRuntime(11036): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5791)
05-31 07:50:28.384: E/AndroidRuntime(11036): ... 8 more
05-31 07:50:28.392: W/ActivityManager(897): Force finishing activity in.canews.social/.MainActivity
ํ๋ฌํฐ ๋ฅํฐ -v
C:\flutter\flutter\bin>flutter doctor -v
[โ] Flutter (Channel master, v1.6.7-pre.7, on Microsoft Windows [Version 10.0.17763.503], locale en-IN)
โข Flutter version 1.6.7-pre.7 at C:\flutter\flutter
โข Framework revision 6884146925 (2 days ago), 2019-05-29 12:52:05 -0700
โข Engine revision 8dc3a4cde2
โข Dart version 2.3.2 (build 2.3.2-dev.0.0 e3edfd36b2)
[โ] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
โข Android SDK at C:\Users\PramUkesh\AppData\Local\Android\sdk
โข Android NDK location not configured (optional; useful for native profiling support)
โข Platform android-28, build-tools 28.0.3
โข Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
โข Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1343-b01)
โข All Android licenses accepted.
[โ] Android Studio (version 3.4)
โข Android Studio at C:\Program Files\Android\Android Studio
โข Flutter plugin version 35.3.1
โข Dart plugin version 183.6270
โข Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1343-b01)
[โ] VS Code (version 1.34.0)
โข VS Code at C:\Users\PramUkesh\AppData\Local\Programs\Microsoft VS Code
โข Flutter extension version 3.0.2
[โ] Connected device (1 available)
โข Z2 Plus โข 2e9087c2 โข android-arm64 โข Android 9 (API 28)
โข No issues found!
@canewsin ์ ์ด ๋ฌธ์ ๊ฐ https://github.com/flutter/engine/pull/9078 ์์ ์์ ๋ ๊ฒ ๊ฐ์ต๋๋ค git fetch upstream
&& git merge upstream/master
์ด์ ๋๊ธ์์ ์ด๋ฏธ ๋ต๋ณํ ๋ฐ๋ณต๋๋ ์ง๋ฌธ์ ๋ณธ ํ, ์ ๋ ํ์ฌ ์ด๋ค ์ต์
์ด ์๋์ง ๋ฌธ์ํํ๋ ์งง์ ๊ธฐ์ฌ๋ฅผ ์์ฑํ์ต๋๋ค. https://medium.com/@truongsinh/flutter -android-64-bit-so-what-the-fuss -15da6f8e3a46. TLDR์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@truongsinh , Play ์คํ ์ด์ ๋ฐฐํฌํ 32๋นํธ ๋ฐ 64๋นํธ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ชจ๋ ํฌํจํ๋ ์ฑ ๋ฒ๋ค์ ๋น๋ํ๊ธฐ ์ํด flutter build appbundle
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ์ง์๋ ๋ง๋ฌด๋ฆฌ ์ค์
๋๋ค. ์์ธํ ๋ด์ฉ์ https://github.com/flutter/flutter/issues/31922 ๋ฅผ ์ฐธ์กฐํ์ธ์. ์ฌ์ฉํด ๋ณด์๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์๋ ค์ฃผ์ญ์์ค.
@truongsinh , Play ์คํ ์ด์ ๋ฐฐํฌํ 32๋นํธ ๋ฐ 64๋นํธ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ชจ๋ ํฌํจํ๋ ์ฑ ๋ฒ๋ค์ ๋น๋ํ๊ธฐ ์ํด
flutter build appbundle
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ์ง์๋ ๋ง๋ฌด๋ฆฌ ์ค์ ๋๋ค. ์์ธํ ๋ด์ฉ์ #31922๋ฅผ ์ฐธ์กฐํ์ธ์. ์ฌ์ฉํด ๋ณด์๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์๋ ค์ฃผ์ญ์์ค.
์, ์ฌ์ ํ flutter build appbundle
๊ฐ ์ฑ์ ์์ฑํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ์ฑ์ด ๋ฉ์ถ๊ฑฐ๋ ์ถฉ๋ํ์ง ์์ต๋๋ค :D
๋ค, ์ฌ์ ํ ํ๋ฌํฐ ๋น๋ ์ฑ๋ฒ๋ค์ด ๋ฉ์ถ๊ฑฐ๋ ์ถฉ๋ํ์ง ์๋ ์ฑ์ โโ์์ฑํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. :D
์ธ์ ๐ . ์ฐ๋ฆฌ๊ฐ ์ดํด๋ณผ ์ ์๋ ์ฌํ ๊ฐ๋ฅํ ์ฌ๋ก๊ฐ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. 1.7.1 ๋ฆด๋ฆฌ์ค์์ ์๋ช ๋์ง ์์ .aab ํ์ผ์ ๋น๋ํ์ฌ ์ด๋ฉ์ผ([email protected])์ ํตํด ์ ์๊ฒ ๋ณด๋ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
์ฐธ๊ณ ๋ก 64๋นํธ ์ง์๊ณผ ๊ด๋ จํ์ฌ ๋ค์ ๋ฐํ๊ฐ [email protected] ์ผ๋ก ์ ์ก๋์์ต๋๋ค.
https://groups.google.com/forum/#!topic/flutter -announce/oIzwT9EDczc
์ ๋ ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
Android Studios์์ ์ฑ ๋ฒ๋ค์ ๋น๋ํ๋ฉด ์๋ฎฌ๋ ์ดํฐ์์ ์ ๋๋ก ๋ก๋ํ ์ ์์ง๋ง ํ๋ ์ด ์คํ ์ด์์ ๋ค์ด๋ก๋ํ๋ฉด ์ฑ์ด ์ถฉ๋ํฉ๋๋ค.
์๋
ํ์ธ์ ํ๋ฌํฐ ๋ง์คํฐ ๋ธ๋์น๋ฅผ ์ฌ์ฉํ๊ณ ์ฑ ๋ฒ๋ค์ ๊ตฌ์ถํ๋ ์ฌ๋๋ค์
๋๋ค.
์ฑ์ ๋๋ฒ๊น
ํ๋ ๊ฒฝ์ฐ ์ฑ์ด ์ ๋๋ก ์คํ๋ฉ๋๋ค.
๋๋ฒ๊ทธ ๋ชจ๋๊ฐ JIT ๋ฐ์ด๋๋ฆฌ๋ฅผ ์์ฑํ๊ณ ๋ฆด๋ฆฌ์ค ๋ชจ๋๊ฐ AOT ๋ฐ์ด๋๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด Play ์คํ ์ด์์ ๋ค์ด๋ก๋ํ ๋ ์ผ๋ถ ์ผ๊ตด์ด ์ถฉ๋ํฉ๋๋ค. ์ฑ ๋ฒ๋ค์ด ๊ธฐ๊ธฐ์์ ์๋ํ๋์ง ํ์ธํ์ต๋๋ค.
๊ธฐ๊ธฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํน์ ๊ตฌ์ฑ์ ๋ํด์๋ง ์ฑ ๋ฒ๋ค์์ apk๋ฅผ ์์ฑํ๊ณ ๊ธฐ๊ธฐ์์ ๋๋ฒ๊ทธ ์ฑ์ ์์ ํ ์ ๊ฑฐํ๊ณ ์ฑ ๋ฒ๋ค์์ ์ด ์๋ก์ด ์ถ๋ ฅ ์ฑ์ ์ค์นํ์ธ์. ์ถฉ๋ํ๋ ๊ฒฝ์ฐ ํ๋ ์ด ์คํ ์ด์์ ๋ค์ด๋ก๋ํ๊ฑฐ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ค์ด๋ก๋ํ ๋ ์ถฉ๋ํฉ๋๋ค. ์ด๊ฒ์ด ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. .
cmd ๋ผ์ธ์ ์ฑ ๋ฒ๋ค์์ APK๋ก์ ์ถ๋ ฅ ์ฐธ์กฐ
https://developer.android.com/studio/command-line/bundletool
์ฐธ๊ณ ๋ก ์ฑ ๋ฒ๋ค์ ์ถฉ๋์ https://github.com/flutter/flutter/issues/31922 ์์ ๋ ์ ์ถ์ ๋ฉ๋๋ค
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
TLDR:
Play ์คํ ์ด์์ ๋ค์ด๋ก๋ํ ๋ ๋ฐ์ํ๋ ์ถฉ๋ ๋ฌธ์ ๋ฅผ ํ์ธํ์ผ๋ฉฐ ์์ https://github.com/flutter/flutter/issues/31922#issuecomment์ ์ค๋ช ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ธฐ๊ฐ ๋ด์ ์ ๊ณต๋ ์ ์๋๋ก ์์ ์์ ์ ์งํ ์ค์ ๋๋ค. -498880614
๊ณ ๊ธ ์ค๋ช
๊ด์ฌ ์๋ ์ฌ๋๋ค์ ์ํด Android Marshmallow ์ด์์ ์คํํ๋ ๊ธฐ๊ธฐ์์ Play ์คํ ์ด๊ฐ ์ฌ๋ฌ ABI๋ฅผ ํฌํจํ๋ App Bundle๋ก ํจํค์ง๋ ์ฑ์ ๊ฐ์งํ๊ณ "split APK". ์ด๋ ๊ฒ ํ๋ฉด ๊ทธ ์์ ํฌํจ๋ .so ํ์ผ์ด APK zip ์์นด์ด๋ธ์์ ์ถ์ถ๋์ง ์๋๋ฐ, ์ด๋ ๋น๋ถํ APK์ ๋์๊ณผ ๋ค๋ฆ ๋๋ค. .so ํ์ผ์ ์ฐพ๋ Flutter ์์ง์
์๋ฃจ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ
dlopen
ํ๊ณ Android๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ์์น(์: ์์นด์ด๋ธ ๋ด๋ถ ์ฌ๋ถ)๋ฅผ ์ถ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ํ .so ํ์ผ์ ์ฒ์๋ถํฐ ์ง์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ Dart VM์ ๋ก๋ํ ๋ฐ์ดํฐ์ ๋ฐ์ด๋๋ฆฌ ๋ฉ์ด๋ฆฌ์์ต๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ ์ผ๋ถ๋ก ELF ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์์ต๋๋ค(์: https://github.com/dart-lang/sdk/commit/6d608fb52bc1926a73d986d73ab228b77cfb7ca2 ๋ฐ https://github.com/flutter/flutter/pull/33696).
4. ํ๋ฌํฐ ๋น๋ apk --release --target-platform=android-arm64
build.gradle์ ์ฝ๋ ์กฐ๊ฐ์ ์ถ๊ฐํ ํ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Gradle build failed to produce an Android package.
- ํ๋ฌํฐ ๋น๋ apk --release --target-platform=android-arm64
build.gradle์ ์ฝ๋ ์กฐ๊ฐ์ ์ถ๊ฐํ ํ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Gradle build failed to produce an Android package.
https://developer.android.com/distribute/best-practices/develop/64-bit
๋๊ตฐ๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๊น? 32๋นํธ apk๋ง ์๋ํ์ง๋ง 64๋ ์๋ํ์ง ์๊ฑฐ๋ ์ค์น๋์ง ์๋ flutter ์ฑ์ด ์์ต๋๋ค. 64๋นํธ ํด๋ํฐ์์ ํ ์คํธ ์ค์ ๋๋ค.
@CgarciaTC ์ต์ ์ ๋ฐ์ดํธ๋ https://github.com/flutter/flutter/issues/18494#issuecomment -500101807์ ์ฐธ์กฐ
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
์์ ์ฌํญ์ด ๋ชจ๋ master
์ฑ๋์ ์ ์ ์ ๋๋ฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ฉํด ๋ณด๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ญ์์ค.
flutter build appbundle
๊ธฐ๋ณธ์ ์ผ๋ก App Bundle์๋ armeabi-v7a (32๋นํธ) ๋ฐ arm64-v8a (64๋นํธ)์ฉ์ผ๋ก ์ปดํ์ผ๋ Dart ์ฝ๋์ Flutter ๋ฐํ์์ด ํฌํจ๋์ด ์์ต๋๋ค.
flutter build apk --split-per-abi
์ด ๋ช ๋ น์ ๋ ๊ฐ์ APK๋ฅผ ์์ฑํฉ๋๋ค.
build/app/outputs/apk/release/app-armeabi-v7a-release.apk
build/app/outputs/apk/release/app-arm64-v8a-release.apk
flutter build apk
๊ทธ๋ฌ๋ฉด ๋ชจ๋ ๋์ ABI์ ๋ํด ์ปดํ์ผ๋ ์ฝ๋๊ฐ ํฌํจ๋ ํป APK๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด๋ฌํ APK๋ ๋ถํ ๋ APK๋ณด๋ค ํฌ๊ธฐ๊ฐ ๋ ํฌ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ๊ธฐ๊ธฐ ์ํคํ ์ฒ์ ์ ์ฉํ ์ ์๋ ๊ธฐ๋ณธ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํ๊ฒ ๋ฉ๋๋ค.
ํ๋ฌํฐ ๋น๋ apk --split-per-abi
์ด ๋ช ๋ น์ ๋ ๊ฐ์ APK๋ฅผ ์์ฑํฉ๋๋ค.
๋น๋/์ฑ/์ถ๋ ฅ/apk/release/app-armeabi-v7a-release.apk
๋น๋/์ฑ/์ถ๋ ฅ/apk/release/app-arm64-v8a-release.apk
@tvolkert - ์ด ํน์ ์๋๋ฆฌ์ค์์ ๊ฐ ๋ฆด๋ฆฌ์ค ๋ฒ์ ๋ฒํธ๋ ์ด๋ป์ต๋๊น? ๋ด๊ฐ ์๋ ํ, ๊ทธ๊ฒ๋ค์ ๋ฌ๋ผ์ผ ํ๋ฏ๋ก Google Play์ ๋ ๋ค ์ ๋ก๋ํ ์ ์์ต๋๋ค. APK๊ฐ ๋น๋๋ ๋ ๊ทธ ๋ถ๋ถ์ด ์ด๋ป๊ฒ๋ ๊ด๋ฆฌ๋ฉ๋๊น? ๊ทธ๋ ์ง ์๋ค๋ฉด ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๊น?
@angel1st https://developer.android.com/studio/build/configure-apk-splits#configure -APK-versions์ ์ง์นจ์ ๋ฐ๋ผ APK๊ฐ ๋น๋๋ ๋ ์๋์ผ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
@tvolkert ์ด๊ฒ์ด ์์ ์ ์ธ ์ฑ๋์ ์ธ์
@ndusart , ์ - https://github.com/flutter/flutter/issues/18494#issuecomment -498880287 ์ฐธ์กฐ
์ฌ๋ฌ Android ๊ธฐ๊ธฐ์์ ์ด๊ฒ์ด ์๋ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค(๋ง์คํฐ๋ก ์ ํํ ํ). ์๋ช ์ ์์ธ, ๊ฐ์ฌํฉ๋๋ค.
@tvolkert ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ Flutter ์์ ์ ์ ์ฉํ๊ธฐ ์ํ ์ผ์ ์ด ์์ต๋๊น?
@harsha973 ์ฐธ์กฐ https://github.com/flutter/flutter/issues/18494#issuecomment -498880287
@harsha973 ๋น์ ์ ์ง์งํ๊ฒ ํ๊ทธ๋ฅผ
@PerLycke ์ฃ์กํฉ๋๋ค.
๋ง์คํฐ ์ฑ๋์ ํ์ธํ๊ณ flutter๋ฅผ ์
๊ทธ๋ ์ด๋ํ๋๋ฐ ์ด์ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ฑ์ ๋น๋ํ ์ ์์ต๋๋ค.
flutter build apk --release --flavor production -t lib/main.dart
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
* What went wrong:
Execution failed for task ':app:transformNativeLibsWithMergeJniLibsForProductionRelease'.
> More than one file was found with OS independent path 'lib/armeabi-v7a/libapp.so'
์ ์ฌํ StackOverflow ๋ฌธ์ ์ ๋ต๋ณ์ ์ค์ ๋ก ๋์์ด ๋์ง ์์ต๋๋ค.
@MichaelRFairhurst flutter build apk --release
๋ ์ ์๊ฒ ์ ๋ง์ ์ต๋๋ค. ๊ทธ๋์ ๋ง์คํฐ์ ์๋ก์ด ์
๋ฐ์ดํธ๋ ํ๋ ์ด๋ฒ ์ค์ ์ ๋ํ ์
๋ฐ์ดํธ๊ฐ ํ์ํ ์๋ ์์ต๋๋ค.
๋ต์ด ์๋๋ผ๋ ๊ฒ์ ์๋๋ค. ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ์ ์ด๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ํ ์ง์ ์ ๋๋ค.
์์ ์ฌํญ์ ์ธ์ ๋ฒ ํ ๋ฒ์ ์ด ๋๋์?
@derolf ๋ https://github.com/flutter/flutter/issues/18494#issuecomment -498880287์ ๋์ ํ์๋ผ์ธ์ ๋ํ ์ต์ ์ ๋ฐ์ดํธ๋ก ์ฐธ์กฐ
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
์ด๋ฌํ ์์ ์ฌํญ์ ์ด์ v1.7.4
๋ฆด๋ฆฌ์ค ์ด์์์ dev
์ฑ๋์ ์ ์ฉ๋ฉ๋๋ค.
์ด 64๋นํธ ํญ๋ชฉ์ ์์๋ด๋ ค๊ณ ํ๋ ๋์ @michalsuryntequiqo ์ ๋์ผํ ๋ฌธ์ ๊ฐ
flutter build apk --flavor=dev -t lib/main-dev.dart
[ +3 ms] FAILURE: Build failed with an exception.
[ +1 ms] * What went wrong:
[ ] Execution failed for task ':app:transformNativeLibsWithMergeJniLibsForDevRelease'.
[ ] > More than one file was found with OS independent path 'lib/armeabi-v7a/libapp.so'
[ ] * Try:
[ ] Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
[ ] * Get more help at https://help.gradle.org
[ ] BUILD FAILED in 1m 3s
[ +370 ms] Running Gradle task 'assembleDevRelease'... (completed in 64.0s)
[ +4 ms] "flutter apk" took 69,789ms.
[ ] "flutter apk" took 69,789ms.
ํธ์งํ๋ค:
๋ฐฉ๊ธ 8627ff433b4658195e66b9c0034902116f53d580 ์ ์ ์ปค๋ฐ์ ์๋ํ๊ณ https://github.com/flutter/flutter/issues/24106 ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ ์ค๋ฅ Gradle build failed to produce an Android package.
์ ํจ๊ป APK๋ฅผ ์์ฑํฉ๋๋ค.
@blasten ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ๋ค์ ์๋ํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๊น?
ํธ์ง 2:
์ด์ ๋ํ ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ด์์ต๋๋ค: https://github.com/flutter/flutter/issues/34598
์ค๋ ํ๋ฌํฐ ๋ฌธ์๋ฅผ ์ฝ๊ณ ๋ค์์ ์ฐพ์์ต๋๋ค.
๋ช ๋ น์ค์์:
cd ์ ๋ ฅ
(๋ฐ๊พธ๋ค์์ฉ ํ๋ก๊ทธ๋จ์ ๋๋ ํ ๋ฆฌ์ ํจ๊ป.)
flutter build apk --split-per-abi ์คํ
(ํ๋ฌํฐ ๋น๋ ๋ช ๋ น์ ๊ธฐ๋ณธ๊ฐ์ --release์ ๋๋ค.)
์ด ๋ช ๋ น์ ๋ ๊ฐ์ APK ํ์ผ์ ์์ฑํฉ๋๋ค.
/build/app/outputs/apk/release/app-armeabi-v7a-release.apk /build/app/outputs/apk/release/app-arm64-v8a-release.apk
@eugenio-tesio --split-per-abi
์ฌ์ฉํ ๋ ์ด๋ค ๋ฒ์ ์ฝ๋๊ฐ ์ฌ์ฉ๋ฉ๋๊น?
๋๋ ๋ฌธ์์์ ๊ทธ๊ฒ์ ๋ณด์๊ณ ์ฌ๊ธฐ์ ๊ฒ์ํ ์๊ฐ์ด์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ํ
์คํธํ์ง ์์๋ค.
๋ช
๋ น์ ์คํํ๋๋ฐ ์๋ํ์ง ์์์ต๋๋ค. ๊ทธ๊ฒ์ ๋งํ๋ค:
"split-per-abi"๋ผ๋ ์ต์ ์ ์ฐพ์ ์ ์์ต๋๋ค.
'flutter -h'(๋๋ 'flutter
-h') ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ฌํฐ ๋ช ๋ น ๋ฐ ์ต์ .
ํ๋ฌํฐ ๋ฅํฐ:
Flutter 1.6.3 โข ์ฑ๋ ๋ฒ ํ โข https://github.com/flutter/flutter.git
ํ๋ ์์ํฌ โข ๊ฐ์ bc7bc94083(4์ฃผ ์ ) โข 2019-05-23 10:29:07 -0700
์์ง โข ๊ฐ์ ํ 8dc3a4cde2
๋๊ตฌ โข Dart 2.3.2(๋น๋ 2.3.2-dev.0.0 e3edfd36b2)consumos_app์์ "flutter pub upgrade" ์คํ ์ค... 19,8s
๋ฐ๋ ํ๋ฌํฐ ๋ฅํฐ...
์์ฌ ์์ฝ(๋ชจ๋ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณด๋ ค๋ฉด flutter Doctor -v ์คํ):
[โ] Flutter(์ฑ๋ ๋ฒ ํ, v1.6.3, Microsoft Windows [๋ฒ์ 10.0.17134.829], ๋ก์ผ์ผ es-AR)
[โ] Android ํด์ฒด์ธ - Android ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ(Android SDK ๋ฒ์ 28.0.3)
[โ] ์๋๋ก์ด๋ ์คํ๋์ค(๋ฒ์ 3.4)
[โ] IntelliJ IDEA Ultimate Edition(๋ฒ์ 2019.1)
[โ] VS ์ฝ๋(๋ฒ์ 1.26.1)
[โ] VS Code, 64๋นํธ ์๋์ (๋ฒ์ 1.33.1)
[!] ์ฐ๊ฒฐ๋ ์ฅ์น
! ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๊ธฐ ์์
์ด ๊ธฐ๋ฅ์ ๊ณง ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๋ฌธ์์์ ๊ทธ๊ฒ์ ๋ณด์๊ณ ์ฌ๊ธฐ์ ๊ฒ์ํ ์๊ฐ์ด์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ํ ์คํธํ์ง ์์๋ค.
๋ช ๋ น์ ์คํํ๋๋ฐ ์๋ํ์ง ์์์ต๋๋ค. ๊ทธ๊ฒ์ ๋งํ๋ค:"split-per-abi"๋ผ๋ ์ต์ ์ ์ฐพ์ ์ ์์ต๋๋ค.
์ฌ์ฉ ๊ฐ๋ฅํ flutter ๋ช ๋ น ๋ฐ ์ต์ ์ ๋ณด๋ ค๋ฉด 'flutter -h'(๋๋ 'flutter -h')๋ฅผ ์คํํ์ธ์.ํ๋ฌํฐ ๋ฅํฐ:
Flutter 1.6.3 โข ์ฑ๋ ๋ฒ ํ โข https://github.com/flutter/flutter.git
ํ๋ ์์ํฌ โข ๊ฐ์ bc7bc94 (4์ฃผ ์ ) โข 2019-05-23 10:29:07 -0700
์์ง โข ๊ฐ์ ํ 8dc3a4cde2
๋๊ตฌ โข Dart 2.3.2(๋น๋ 2.3.2-dev.0.0 e3edfd36b2)
consumos_app์์ "flutter pub upgrade" ์คํ ์ค... 19,8s
๋ฐ๋ ํ๋ฌํฐ ๋ฅํฐ...
์์ฌ ์์ฝ(๋ชจ๋ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณด๋ ค๋ฉด flutter Doctor -v ์คํ):
[โ] Flutter(์ฑ๋ ๋ฒ ํ, v1.6.3, Microsoft Windows [๋ฒ์ 10.0.17134.829], ๋ก์ผ์ผ es-AR)
[โ] Android ํด์ฒด์ธ - Android ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ(Android SDK ๋ฒ์ 28.0.3)
[โ] ์๋๋ก์ด๋ ์คํ๋์ค(๋ฒ์ 3.4)
[โ] IntelliJ IDEA Ultimate Edition(๋ฒ์ 2019.1)
[โ] VS ์ฝ๋(๋ฒ์ 1.26.1)
[โ] VS Code, 64๋นํธ ์๋์ (๋ฒ์ 1.33.1)
[!] ์ฐ๊ฒฐ๋ ์ฅ์น
! ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๊ธฐ ์์์ด ๊ธฐ๋ฅ์ ๊ณง ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
dev
์ฑ๋/๋ฒ์ 1.7.4 ์ด์์์๋ง ์ ๊ณต๋ฉ๋๋ค. beta
์ฑ๋/๋ฒ์ 1.6.3์ ์คํ ์ค์
๋๋ค.
๋ฐฉ๊ธ ์๋ํ๋๋ฐ(Codemagic์ ์ฌ์ฉํ์ฌ ๋น๋ ๋ฐ ํผ๋ธ๋ฆฌ์ฑ) ์ ๋ง ์ ์๋ํ์ต๋๋ค. ๊ฐ์ฌ ํด์!
Google์ ์ฌ์ ํ โโ๋ด๊ฐ appbundle์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ๋ถํํฉ๋๋ค. ์ด ๊ฒฝ๊ณ ๋ฅผ ๊ฐ์ํ ๋ APK๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ด ๋๋ฌด ์๋ฏธ๊ฐ ์์ ์ ์์ต๋๊น?
๋๋ appbundle์ ์ฌ์ฉํ์ง๋ง ์ด๊ฒ์ Google์ ์๋ํ๋ ํ ์คํธ(์ฌ์ ์ถ์ ๋ณด๊ณ ์ ์์ฑ)๊ฐ ์๋ํ์ง ์๋๋ก ํฉ๋๋ค. ์ด์ ๋ํ ์ ๋ฌธ์ ๋ฅผ ์ด์ด์ผ ํฉ๋๊น?
@nohli ์ฑ ๋ฒ๋ค/APK์ ๋ํ ์ต์ ์ ๋ณด๋ฅผ ๋ฐ์ํ๋๋ก ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค: https://flutter.dev/docs/deployment/android#building -the-app-for-release.
Google์ ์๋ํ๋ ํ ์คํธ์ ๋ํ ๋ฌธ์ ๋ฅผ ์์ ๋กญ๊ฒ ์ ์ถํ์ธ์.
๋ฒ๋ค์์ ์ฑ์ ๋น๋ํ์ง๋ง 64๋นํธ ์ฅ์น์์ ์คํํ ํ 32๋นํธ ์ฅ์น์ 64๋นํธ ์ฅ์น์ฉ ์ฑ์ ๋น๋ํ๋ฉด libflutter.so๊ฐ ๋๋ฝ๋์๋ค๊ณ ํ์๋ฉ๋๋ค. ๋จ์ผ ๋ฒ๋ค ํ์ผ์ ๋ ์ํคํ ์ฒ ๋ชจ๋์ ๋ํด libflutter.so๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
@nohli ์ฑ ๋ฒ๋ค/APK์ ๋ํ ์ต์ ์ ๋ณด๋ฅผ ๋ฐ์ํ๋๋ก ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค: https://flutter.dev/docs/deployment/android#building -the-app-for-release.
Google์ ์๋ํ๋ ํ ์คํธ์ ๋ํ ๋ฌธ์ ๋ฅผ ์์ ๋กญ๊ฒ ์ ์ถํ์ธ์.
@blasten ๋งํฌ์ ์ ๊ณต๋ ์ ์ฐจ๋ ๋ฒ๋ค์ 64๋นํธ APK๋ฅผ ์์ฑํ์ง ์์์ต๋๋ค. ๋ฒ๋ค์ ์ ๋ก๋ํ์ ๋ Google Play ์คํ ์ด์ ๊ทํ์ APK๊ฐ 64๋นํธ์ ํธํ๋์ง ์๋๋ค๋ ๋์ผํ ์ค๋ฅ๊ฐ ๊ทธ๋๋ก ํ์๋์์ต๋๋ค.
@wal33d006 ํ์ด์ง ์๋จ์ ๋ฉด์ฑ
์กฐํญ์ ์ฐธ์กฐํ์ญ์์ค - v1.7.4
์ด์(ํ์ฌ ๊ฐ๋ฐ ๋๋ ๋ง์คํฐ ์ฑ๋)์๋ง ์ ์ฉ๋ฉ๋๋ค.
@wal33d006 ํ์ด์ง ์๋จ์ ๋ฉด์ฑ ์กฐํญ์ ์ฐธ์กฐํ์ญ์์ค -
v1.7.4
์ด์(ํ์ฌ ๊ฐ๋ฐ ๋๋ ๋ง์คํฐ ์ฑ๋)์๋ง ์ ์ฉ๋ฉ๋๋ค.
@tvolkert ๊ฐ๋ฐ์ ๋๋ ๋ง์คํฐ ์ฑ๋์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ์๋ ์์ต๋๋ค.
์ด๊ฒ์ ๊ฐ๋ฐ์ ๋๋ ๋ง์คํฐ ์ฑ๋์์ ๋น๋ํ ๋์ ์ถ๋ ฅ์ ๋๋ค.
์ปดํ์ผ๋ฌ ๋ฉ์์ง:
file:///Users/waleed/.pub-cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image. dart:199 :38: ์ค๋ฅ: 'void Function(ImageInfo, bool)' ์ธ์ ์ ํ์ 'ImageStreamListener' ๋งค๊ฐ๋ณ์ ์ ํ์ ํ ๋นํ ์ ์์ต๋๋ค.
FAILURE: ์์ธ์ ํจ๊ป ๋น๋์ ์คํจํ์ต๋๋ค.
์ด๋์:
์คํฌ๋ฆฝํธ '/Users/waleed/Developer/flutter-sdk/flutter/packages/flutter_tools/gradle/flutter.gradle' ์ค: 638
๋ฌด์์ด ์๋ชป๋์๋์ง:
์์
': app:compileflutterBuildReleaseArm '์ ๋ํ ์คํ์ ์คํจํ์ต๋๋ค.
'๋ช ๋ น '/Users/waleed/Developer/flutter-sdk/flutter/bin/flutter'' ํ๋ก์ธ์ค๊ฐ 0์ด ์๋ ์ข ๋ฃ ๊ฐ 1๋ก ์๋ฃ๋์์ต๋๋ค.
๋
ธ๋ ฅํ๋ค:
--stacktrace ์ต์
๊ณผ ํจ๊ป ์คํํ์ฌ ์คํ ์ถ์ ์ ๊ฐ์ ธ์ต๋๋ค. ๋ ๋ง์ ๋ก๊ทธ ์ถ๋ ฅ์ ์ป์ผ๋ ค๋ฉด --info ๋๋ --debug ์ต์
๊ณผ ํจ๊ป ์คํํ์ญ์์ค. ์ ์ฒด ํต์ฐฐ๋ ฅ์ ์ป์ผ๋ ค๋ฉด --scan๊ณผ ํจ๊ป ์คํํ์ญ์์ค.
https://help.gradle.org ์์ ๋ ๋ง์ ๋์ ๋ฐ๊ธฐ
14์ด ๋ง์ ๊ตฌ์ถ ์คํจ
Gradle ์์
'bundleRelease' ์คํ ์ค...
Gradle ์์
'bundleRelease' ์คํ ์ค... ์๋ฃ 15.0์ด
์ข
๋ฃ ์ฝ๋ 1๋ก ์ธํด Gradle ์์
bundleRelease ์คํจ
@wal33d006 package:cached_network_image
๋ ํ์ฌ 0.8.0
๋ฒ์ ์ด๊ณ 0.5.1
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ต์ ๋ฒ์ ์ Flutter์ ๋ํด ์คํํ ๋ ๋ค์์์ ๋ฒ์ ์ ์ฝ ์กฐ๊ฑด์ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค. ๊ทํ์ pubspec.yaml
๋ฐ flutter packages upgrade
๋น์ ์ ์ฐ๋ฆฌ๊ฐ ๋ช ๋ น ํ๋ฌํฐ ๋น๋ appbundle๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๋ค์ ๋น๋ ํ ๋ v1.7.4์ ํ์ผ์ด libflutter.so ์๋์ผ๋ก 64 ๋นํธ ์ฅ์น์ ์ถ๊ฐ๋ฉ๋๋ค ๋ง์ @tvolkert?
@nimesh1997 ๋ค, ์์ ์ ์ผ๋ก ๋ง๋๋ ๋น๋๊ฐ ์ต์ ๋ฒ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ง๋ง.
@tvolkert ๋ด ์ฑ๋์ ### ๋ง์คํฐ ์ฑ๋๋ก ๋ณ๊ฒฝํ๊ณ pubspec.yaml ๋ด๋ถ๋ฅผ ๋ณ๊ฒฝํ์ฌ ### package:cached_network_image ๋ฒ์ ๋ 0.8.0์ผ๋ก ์
๊ทธ๋ ์ด๋ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ฌํฐ ํจํค์ง ์
๊ทธ๋ ์ด๋๋ฅผ ์คํํ ๋. ์ค๋ฅ๋ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
**cached_network_image >=0.7.0์ path_provider ^0.5.0+1์ ์์กดํ๋ flutter_cache_manager ^0.3.2์ ์์กดํ๊ธฐ ๋๋ฌธ์, cached_network_image >=0.7.0์ path_provider ^0.5.0+1์ด ํ์ํฉ๋๋ค.
@nimesh1997 ๋ณ๋๋ก ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๊ณ ๋๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๊น? ์๋ฐฑ๋ช ์ ์ฌ๋๋ค์ด ์ด ๋ฒ๊ทธ๋ฅผ ๊ตฌ๋ ํ๊ณ ์์ต๋๋ค.
@tvolkert ์์ ์ ์ธ ์ฑ๋์์ flutter ๋ฒ์ 1.7.4๋ฅผ ์ฌ์ฉํ ์ ์๋ ์๊ธฐ์ ์๋ ์ธ๊ธ๋ ์ค๋ฅ๊ฐ flutter ๋ฒ์ 1.7.4์์ ํด๊ฒฐ๋๋ฉด ํด๋น ์ค๋ฅ๋ก ์ธํด 64๋นํธ ์ฅ์น์์ ์คํ๋์ง ์์ต๋๋ค(libflutter.so๊ฐ ๋๋ฝ๋จ)?
์ด๊ฒ์ ๋ด๊ฐ flutter v1.7.4 ์ด์์์ ์คํํ ๋ ์ป๋ ์ถ๋ ฅ์ ๋๋ค :-
์ปดํ์ผ๋ฌ ๋ฉ์์ง:
file:///home/zunroof-dev-4/package_flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_image-1.0.0/lib/network. ๋คํธ:75 :31:
์ค๋ฅ: ์ธ์ ์ ํ 'Null Function(StringBuffer)'์(๋) ๋งค๊ฐ๋ณ์ ์ ํ 'Iterable'์ ํ ๋นํ ์ ์์ต๋๋ค.
์ปดํ์ผ ์ค๋ฅ, ๋ก๊ทธ๋ฅผ ์์ฑํ์ง ์์ผ๋ฉฐ flutter Doctor -v๋ ์ค๋ฅ๋ฅผ ๊ฐ๋ฆฌํค์ง ์์ต๋๋ค. ์ด๋ป๊ฒ ํด์ผ ํ๋์?
Play ์คํ ์ด์ ์ฑ์ ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
APK๋ฅผ ๋ฌถ๊ฑฐ๋ ๋ถํ ํ์ฌ APK ํฌ๊ธฐ๋ฅผ ์ค์
๋๋ค.
์ฑ ๋ฒ๋ค์ ์์ฑํ๋ ค๋ฉด ๋ค์์ ์คํํ์ธ์.
ํ๋ฌํฐ ๋น๋ ์ฑ ๋ฒ๋ค --target-platform android-arm,android-arm64
์์ธํ ์์๋ณด๊ธฐ: https://developer.android.com/guide/app-bundle
ABI๋ณ๋ก APK๋ฅผ ๋ถํ ํ๋ ค๋ฉด ๋ค์์ ์คํํ์ธ์.
ํ๋ฌํฐ ๋น๋ apk --target-platform android-arm,android-arm64
--split-per-abi
์์ธํ ์์๋ณด๊ธฐ:
https://developer.android.com/studio/build/configure-apk-splits#configur
e-abi-split
gradle ์ด๊ธฐํ ์ค... 7,4s
์ข
์์ฑ ํด๊ฒฐ... 4,3์ด
registerResGeneratingTask๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. registerGeneratedResFolders(FileCollection)๋ฅผ ์ฌ์ฉํ์ธ์.
registerResGeneratingTask๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. registerGeneratedResFolders(FileCollection)๋ฅผ ์ฌ์ฉํ์ธ์.
registerResGeneratingTask๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. registerGeneratedResFolders(FileCollection)๋ฅผ ์ฌ์ฉํ์ธ์.
Gradle ์์
'assembleRelease' ์คํ ์ค...
Gradle ์์
'assembleRelease' ์คํ ์ค... ์๋ฃ 9,0์ด
Gradle ๋น๋๊ฐ Android ํจํค์ง๋ฅผ ์์ฑํ์ง ๋ชปํ์ต๋๋ค.
@leonardop21 ์๋
ํ๋ฌํฐ ๋ฐ -v
@canewsin
์ด๋จธ๋. ๋๋ ์ง๊ธ ๋ฌด์์ํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค
Gradle ๋น๋๊ฐ Android ํจํค์ง๋ฅผ ์์ฑํ์ง ๋ชปํ์ต๋๋ค.
(ํจํค์ง:flutter_tools/src/android/gradle.dart:514:7)
(dart:async-patch/async_patch.dart:77:64)
(dart:async/future_impl.dart:639:45)
(dart:async-patch/async_patch.dart:77:64)
(dart:async/future_impl.dart:639:45)
(dart:async/future_impl.dart:513:7)
(dart:async/zone.dart:963:23)
(dart:isolate-patch/isolate_patch.dart:116:13)
(dart:isolate-patch/isolate_patch.dart:173:5)
32๋นํธ ๋ฐ 64๋นํธ ๋ฐ์ด๋๋ฆฌ๋ก APK๋ฅผ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํ๋ด๊ธฐ ์ํด ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค. https://flutter.dev/docs/deployment/android#building -the-app-for-release .
dev
์ฑ๋: v1.7.9
์ด์์ ์ฌ์ฉํ์ธ์. ํ์ ์ด๋ฒ ์ฃผ ๊ธ์์ผ(2019๋
6์ 28์ผ)๊น์ง ๋ฒ ํ์ ๋ํ ์ต์ ๋ณ๊ฒฝ ์ฌํญ์ ํ๋ณดํ๊ธฐ ์ํด ๋
ธ๋ ฅํ๊ณ ์์ต๋๋ค.
์ปดํ์ผ๋ฌ ๋ฉ์์ง:
file:///Users/systemgnk/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/flare_flutter-1.5.2/lib/flare. dart:1033 :18: ์ค๋ฅ: 'Int32List' ์ธ์ ์ ํ์ 'Uint16List' ๋งค๊ฐ๋ณ์ ์ ํ์ ํ ๋นํ ์ ์์ต๋๋ค.
FAILURE: ์์ธ์ ํจ๊ป ๋น๋์ ์คํจํ์ต๋๋ค.
์ด๋์:
์คํฌ๋ฆฝํธ '/Users/systemgnk/Desktop/flutter/packages/flutter_tools/gradle/flutter.gradle' ์ค: 631
๋ฌด์์ด ์๋ชป๋์๋์ง:
์์
': app:compileflutterBuildReleaseArm '์ ๋ํ ์คํ์ ์คํจํ์ต๋๋ค.
'๋ช ๋ น '/Users/systemgnk/Desktop/flutter/bin/flutter''๊ฐ 0์ด ์๋ ์ข ๋ฃ ๊ฐ 1๋ก ์๋ฃ๋์์ต๋๋ค.
๋
ธ๋ ฅํ๋ค:
--stacktrace ์ต์
๊ณผ ํจ๊ป ์คํํ์ฌ ์คํ ์ถ์ ์ ๊ฐ์ ธ์ต๋๋ค. ๋ ๋ง์ ๋ก๊ทธ ์ถ๋ ฅ์ ์ป์ผ๋ ค๋ฉด --info ๋๋ --debug ์ต์
๊ณผ ํจ๊ป ์คํํ์ญ์์ค. ์ ์ฒด ํต์ฐฐ๋ ฅ์ ์ป์ผ๋ ค๋ฉด --scan๊ณผ ํจ๊ป ์คํํ์ญ์์ค.
https://help.gradle.org ์์ ๋ ๋ง์ ๋์ ๋ฐ๊ธฐ
22์ด ๋ง์ ๊ตฌ์ถ ์คํจ
Gradle ์์
'assembleRelease' ์คํ ์ค...
Gradle ์์
'assembleRelease' ์คํ ์ค... ์๋ฃ 23.3์ด
Gradle ์์
assembleRelease๊ฐ ์ข
๋ฃ ์ฝ๋ 1๋ก ์คํจํ์ต๋๋ค.
[โ] Flutter(Mac OS X 10.13.6 17G65์์ ์ฑ๋ ๊ฐ๋ฐ, v1.7.10, ๋ก์ผ์ผ en-US)
โข /Users/systemgnk/Desktop/flutter์ Flutter ๋ฒ์ 1.7.10
โข ํ๋ ์์ํฌ ๊ฐ์ ํ 9a3a7490c8(2์ผ ์ ), 2019-06-25 15:59:15 +0200
โข ์์ง ๋ฒ์ ae8e6d9f46
โข ๋คํธ ๋ฒ์ 2.4.0
[โ] Android ํด์ฒด์ธ - Android ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ(Android SDK ๋ฒ์ 28.0.3)
โข /Users/systemgnk/Library/Android/sdk์ Android SDK
โข Android NDK ์์น๊ฐ ๊ตฌ์ฑ๋์ง ์์(์ ํ ์ฌํญ, ๊ธฐ๋ณธ ํ๋กํ์ผ๋ง ์ง์์ ์ ์ฉ)
โข ํ๋ซํผ android-28, ๋น๋ ๋๊ตฌ 28.0.3
โข Java ๋ฐ์ด๋๋ฆฌ: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
โข Java ๋ฒ์ OpenJDK ๋ฐํ์ ํ๊ฒฝ(๋น๋ 1.8.0_152-release-1248-b01)
โข ๋ชจ๋ Android ๋ผ์ด์ ์ค๊ฐ ํ์ฉ๋ฉ๋๋ค.
[โ] Xcode - iOS ๋ฐ macOS์ฉ ๊ฐ๋ฐ(Xcode 10.1)
โข /Applications/Xcode.app/Contents/Developer์ Xcode
โข Xcode 10.1, ๋น๋ ๋ฒ์ 10B61
โข CocoaPods ๋ฒ์ 1.6.0
[โ] iOS ๋๊ตฌ - iOS ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ
โข ios-deploy 1.9.4
[โ] Chrome - ์น์ฉ ๊ฐ๋ฐ
โข /Applications/Google Chrome.app/Contents/MacOS/Google Chrome์ Chrome
[โ] ์๋๋ก์ด๋ ์คํ๋์ค(๋ฒ์ 3.3)
โข /Applications/Android Studio.app/Contents์ Android ์คํ๋์ค
โข Flutter ํ๋ฌ๊ทธ์ธ ๋ฒ์ 33.3.1
โข Dart ํ๋ฌ๊ทธ์ธ ๋ฒ์ 182.5215
โข Java ๋ฒ์ OpenJDK ๋ฐํ์ ํ๊ฒฝ(๋น๋ 1.8.0_152-release-1248-b01)
[โ] ์ฐ๊ฒฐ๋ ์ฅ์น(4๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ)
โข x86์ฉ์ผ๋ก ๋น๋๋ Android SDK โข emulator-5554 โข android-x86 โข Android 7.0(API 24)(์๋ฎฌ๋ ์ดํฐ)
โข ์์คํ
์ iPhone โข 73145c33ee6d180a2db3d4a96b908ceb4c49065b โข ios โข iOS 12.3.1
โข macOS โข macOS โข darwin-x64 โข Mac OS X 10.13.6 17G65
โข ํฌ๋กฌ โข ํฌ๋กฌ โข ์น ์๋ฐ์คํฌ๋ฆฝํธ โข ๊ตฌ๊ธ ํฌ๋กฌ 75.0.3770.100
โข ๋ฐ๊ฒฌ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค!
APK ๋น๋์ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์์ ์ ์ธ ์ฑ๋์์๋ง 32๋นํธ apk๋ฅผ ๋น๋ํ ์ ์์์ต๋๋ค.
dev ๋๋ master channel sdk๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค flutter ํ์์ ์ด ๋ฒ๊ทธ๋ฅผ ๊ณ ์น ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
@JaeyoungChu 2d-inc/Flare-Flutter#79 ์ฐธ์กฐ
@ctrysbita ๋งํฌ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ์ฑ๋์ ๋ง์คํฐ๋ก ๋ณ๊ฒฝํ๊ณ _indices ์ ํ์ Int32List์์ Uint16List๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
ํ๋ ์ด์คํ ์ด์ ์
๋ก๋๋ apk๋ 64๋นํธ์ ๋ํ ๊ฒฝ๊ณ ๊ฐ ์๊ณ ํ๋ ์ด์คํ ์ด ํ
์คํธ ํ์ด์ง์์ ์ค์น ํ ์คํ ์ค์
๋๋ค.
์์น์ ๋ํ ๊ถํ ๋ํ ์์๊ฐ ํ์ ๋์ง ์๊ณ ios์ Google ์ง๋๊ฐ ํ์๋์ง ์๊ณ http(์บ์๋ ๋คํธ์ํฌ ์ด๋ฏธ์ง)๋ก ํฐ ์ด๋ฏธ์ง ํ์ผ์ ํ์ํ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฐ๋ฐ ์ฑ๋ ํ๋ฌํฐ SDK์ ๊ด๋ จ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ dev ์ฑ๋๋ก ์ธํด ํ์คํ์ง ์์ง๋ง ์์ ์ํ๋ก ๋์๊ฐ์ ๋ค์ ๋น๋ํ๋ฉด ๋ชจ๋ ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ก์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํํค์น ์๊ฐ์ด ๋ง์ง ์์ 100% ํ์ ํ ์ ์์ต๋๋ค. ์ฃ์กํ์ง๋ง ๋๊ตฐ๊ฐ๊ฐ ์ด ๋ฌธ์ ์์ ํํธ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ๋ด ์๋ฃจ์ ์ด์์ต๋๋ค.
app gradle
splits { // Configures multiple APKs based on ABI. abi { // Enables building multiple APKs per ABI. enable true // By default all ABIs are included, so use reset() and include to specify that we only // want APKs for armeabi-v7a and arm64-v8a. // Resets the list of ABIs that Gradle should create APKs for to none. reset() // Specifies a list of ABIs that Gradle should create APKs for. include "armeabi-v7a", "arm64-v8a" // Specifies that we do not want to also generate a universal APK that includes all ABIs. universalApk false } }
flutter build apk --release --target-platform=android-arm
- ํ๋ ์ด ์คํ ์ด์
app-armeabi-v7a-release.apk
์ ๋ก๋- ์ฆ๊ฐ
versionCode
flutter build apk --release --target-platform=android-arm64
- ํ๋ ์ด ์คํ ์ด์
app-arm64-v8a-release.apk
์ ๋ก๋Google Play ์คํ ์ด๋ ๊ธฐ๊ธฐ ์ํคํ ์ฒ์ ๋ฐ๋ผ ์ฑ์ ์ ๊ณตํฉ๋๋ค. 32๋นํธ ์ฅ์น๋ ๋ง์กฑํ๊ณ 64๋นํธ ์ฅ์น๋ ๋ง์กฑํ๋ฉฐ ๋ ์ํคํ ์ฒ๋ฅผ ๋ชจ๋ ์ ๊ณตํ๋ฉด์ APK ํฌ๊ธฐ๊ฐ ์๋์ ์ผ๋ก ์๊ฒ ์ ์ง๋๋ค๋ ์ฌ์ค์ ๋ง์กฑํฉ๋๋ค.
๋์ผํ APK์ ๋ ์ํคํ ์ฒ์ ๋ํ ์ง์์ด ํฌํจ๋ ๊ฒฝ์ฐ ์ฑ ํฌ๊ธฐ๋ 10MB ์ด์์ด ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
์ด๋? ๋ถํ ์น์ ์ gradle ํ์ผ์ ์ด๋์ ์ถ๊ฐํฉ๋๊น? flutter {}์ ์ข ์์ฑ {} ์ฌ์ด์ ์ถ๊ฐํ๋๋ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฒซ ๋ฒ์งธ APK๋ฅผ ๋น๋ํ์ง ์์ต๋๋ค.
android/ ํด๋์์ Gradle ํ๋ก์ ํธ ์ค์ ์ ๊ฒํ ํ์ธ์.
์ด๊ฒ์ ๋ถ๋ช ํ ์ณ์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ง์ง๋ง ๋น๋ ์ดํ์ ํ๋ก์ ํธ์ ์ํํ ์ ์ผํ ๋ณ๊ฒฝ ์ฌํญ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
@ArtfulDodgerB92 ์๋ฃจ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. apk ๋ฐ ๋ฒ์ ๋น๋๋ฅผ ์ํด ์ด๋ค ์ฑ๋์ ์ฌ์ฉํ์ จ์ต๋๊น?
์ด๋? ๋ถํ ์น์ ์ gradle ํ์ผ์ ์ด๋์ ์ถ๊ฐํฉ๋๊น? flutter {}์ ์ข ์์ฑ {} ์ฌ์ด์ ์ถ๊ฐํ๋๋ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฒซ ๋ฒ์งธ APK๋ฅผ ๋น๋ํ์ง ์์ต๋๋ค.
android/ ํด๋์์ Gradle ํ๋ก์ ํธ ์ค์ ์ ๊ฒํ ํ์ธ์.
์ด๊ฒ์ ๋ถ๋ช ํ ์ณ์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ง์ง๋ง ๋น๋ ์ดํ์ ํ๋ก์ ํธ์ ์ํํ ์ ์ผํ ๋ณ๊ฒฝ ์ฌํญ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
@ArtfulDodgerB92 ์ฌ๊ธฐ์ ์์ฑ๋ ๋๋ก android{}
์น์
์์ ์์ด์ผ ํฉ๋๋ค. https://developer.android.com/studio/build/configure-apk-splits.html
์ฐธ๊ณ ๋ก 64๋นํธ ์ง์๊ณผ ๊ด๋ จํ์ฌ ๋ค์ ๋ฐํ๊ฐ [email protected] ์ผ๋ก ์ ์ก๋์์ต๋๋ค.
https://groups.google.com/forum/#!topic/flutter -announce/oIzwT9EDczc
๋ค๊ฐ์ค๋ ๋ฒ ํ ๋ฆด๋ฆฌ์ค์ ๋ํ ์์์ด ์์ต๋๊น?
@nohli ์ฐ๋ฆฌ๋ https://github.com/flutter/flutter/issues/35291์ ๋ํ ์์ ์ฌํญ(์ปค๋ฐ ๋๋๋ฆฌ๊ธฐ)์ ์ ํํ๊ธฐ ์ํด ๋ฒ ํ ๋ฆด๋ฆฌ์ค๋ฅผ ๋ฉฐ์น ์ฐ๊ธฐํ์ต๋๋ค
์ด๊ฒ์ ํ์ฌ v1.7.8+hotfix.2
๋ฆด๋ฆฌ์ค์ ๋ฒ ํ ์ฑ๋์์ ์ ๊ณต๋ฉ๋๋ค.
์ด๊ฒ์ ํ์ฌ
v1.7.8+hotfix.2
๋ฆด๋ฆฌ์ค์ ๋ฒ ํ ์ฑ๋์์ ์ ๊ณต๋ฉ๋๋ค.
๋ฆด๋ฆฌ์ค APK๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ?
์ด๊ฒ์ ํ์ฌ
v1.7.8+hotfix.2
๋ฆด๋ฆฌ์ค์ ๋ฒ ํ ์ฑ๋์์ ์ ๊ณต๋ฉ๋๋ค.๋ฆด๋ฆฌ์ค APK๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ?
๋ค์์ ์ง์นจ์ ๋๋ค. https://flutter.dev/docs/deployment/android
์ด๊ฒ์ ํ์ฌ
v1.7.8+hotfix.2
๋ฆด๋ฆฌ์ค์ ๋ฒ ํ ์ฑ๋์์ ์ ๊ณต๋ฉ๋๋ค.๋ฆด๋ฆฌ์ค APK๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ?
๋ค์์ ์ง์นจ์ ๋๋ค. https://flutter.dev/docs/deployment/android
๋๋ ์๋ํ์ง๋ง 32์์ ์๋ํ์ง ์์ต๋๋ค
๋๋ ์๋ํ์ง๋ง 32์์ ์๋ํ์ง ์์ต๋๋ค
32
์(๋) ๋ฌด์จ ๋ป์ธ๊ฐ์? "ํป apk๋ฅผ ์์ฑํ ์ ์๋๋ฐ ํด๋น apk๊ฐ 64๋นํธ ์ฅ์น์์ ์๋ํ์ง๋ง 32๋นํธ ์ฅ์น์์ ์ถฉ๋ํฉ๋๋ค"์ ๊ฐ์ด?
flutter doctor
์ ๊ฒฐ๊ณผ๋ฅผ ๋จ๊ณ๋ณ๋ก ๊ฒ์ํ ์ ์์ต๋๊น(์: ์ด๊ฒ์ progard https://flutter.dev/docs/deployment/android#step-2---enable-์ 2๋จ๊ณ์
๋๋ค. ๋๋
ํ ๋ฐ ์ถ์), APK ๋๋ AAB๋ฅผ ์์ฑํ๊ณ ์์ผ๋ฉฐ ์ด๋ค ๊ธฐ๊ธฐ๋ฅผ ํ
์คํธํ๊ณ ์์ต๋๊น?
์ฐ๋ฆฌ๋ ์ฌ์ ํ ๋ฃ์ด์ผํฉ๋๊น
gradle์ ndk {
abiFilters 'armeabi-v7a' , 'x86', 'armeabi'
}
๋ฒ ํ ์์ ํ ๋ ์ด์ ํ์ํ์ง ์์ต๋๊น?
@ksamj ํ์ํ์ง ์์ต๋๋ค.
๋๋ ์๋ํ์ง๋ง 32์์ ์๋ํ์ง ์์ต๋๋ค
32
์(๋) ๋ฌด์จ ๋ป์ธ๊ฐ์? "ํป apk๋ฅผ ์์ฑํ ์ ์๋๋ฐ ํด๋น apk๊ฐ 64๋นํธ ์ฅ์น์์ ์๋ํ์ง๋ง 32๋นํธ ์ฅ์น์์ ์ถฉ๋ํฉ๋๋ค"์ ๊ฐ์ด?
flutter doctor
์ ๊ฒฐ๊ณผ๋ฅผ ๋จ๊ณ๋ณ๋ก ๊ฒ์ํ ์ ์์ต๋๊น(์: ์ด๊ฒ์ progard https://flutter.dev/docs/deployment/android#step-2---enable-์ 2๋จ๊ณ์ ๋๋ค. ๋๋ ํ ๋ฐ ์ถ์), APK ๋๋ AAB๋ฅผ ์์ฑํ๊ณ ์์ผ๋ฉฐ ์ด๋ค ๊ธฐ๊ธฐ๋ฅผ ํ ์คํธํ๊ณ ์์ต๋๊น?
์์ฌ ์์ฝ(๋ชจ๋ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณด๋ ค๋ฉด flutter Doctor -v ์คํ):
[โ] Flutter(์ฑ๋ ๋ฒ ํ, v1.7.8+hotfix.2, Mac OS X 10.14.5 18F132, ๋ก์ผ์ผ ru-RU)
[โ] Android ํด์ฒด์ธ - Android ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ(Android SDK ๋ฒ์ 28.0.3)
[โ] Xcode - iOS ๋ฐ macOS์ฉ ๊ฐ๋ฐ(Xcode 10.2.1)
[โ] iOS ๋๊ตฌ - iOS ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ
[โ] ์๋๋ก์ด๋ ์คํ๋์ค(๋ฒ์ 3.4)
[โ] ์ฐ๊ฒฐ๋ ์ฅ์น(1๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ)
โข ๋ฐ๊ฒฌ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค!
์์ฌ ์์ฝ(๋ชจ๋ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณด๋ ค๋ฉด flutter Doctor -v ์คํ):
[โ] Flutter(์ฑ๋ ๋ฒ ํ, v1.7.8+hotfix.2, Mac OS X 10.14.5 18F132, ๋ก์ผ์ผ ru-RU)
[โ] Android ํด์ฒด์ธ - Android ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ(Android SDK ๋ฒ์ 28.0.3)
[โ] Xcode - iOS ๋ฐ macOS์ฉ ๊ฐ๋ฐ(Xcode 10.2.1)
[โ] iOS ๋๊ตฌ - iOS ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ
[โ] ์๋๋ก์ด๋ ์คํ๋์ค(๋ฒ์ 3.4)
[โ] ์ฐ๊ฒฐ๋ ์ฅ์น(1๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ)
โข ๋ฐ๊ฒฌ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค!
์์ฌ ์์ฝ(๋ชจ๋ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณด๋ ค๋ฉด flutter Doctor -v ์คํ):
[โ] Flutter(์ฑ๋ ๋ฒ ํ, v1.7.8+hotfix.2, Mac OS X 10.14.5 18F132, ๋ก์ผ์ผ ru-RU)
[โ] Android ํด์ฒด์ธ - Android ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ(Android SDK ๋ฒ์ 28.0.3)
[โ] Xcode - iOS ๋ฐ macOS์ฉ ๊ฐ๋ฐ(Xcode 10.2.1)
[โ] iOS ๋๊ตฌ - iOS ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ
[โ] ์๋๋ก์ด๋ ์คํ๋์ค(๋ฒ์ 3.4)
[โ] ์ฐ๊ฒฐ๋ ์ฅ์น(1๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ)
โข ๋ฐ๊ฒฌ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค!
APK ๋น๋
์ง์นจ์ ๋ฐ๋ผ ๋ชจ๋ ์์
์ ์ํํ์ง๋ง 32๋นํธ์๋ ์ค์น๋์ง ์์ต๋๋ค.
์ง์นจ์ ๋ฐ๋ผ ๋ชจ๋ ์์ ์ ์ํํ์ง๋ง 32๋นํธ์๋ ์ค์น๋์ง ์์ต๋๋ค.
32๋นํธ ์ฅ์น์ 32๋นํธ apk๋ฅผ ์ค์นํ์ง ๋ชปํ์์ ๋ณด์ฌ์ฃผ๋ ์คํฌ๋ฆฐ์ท/๋ก๊ทธ๋ ๋ฌด์์ด๋ฉฐ ์ฅ์น ๋ชจ๋ธ์ ๋ฌด์์ ๋๊น?
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
v1.7.8+hotfix.2
์ด ์์ ์ ์ธ ์ฑ๋์ ๋ฆด๋ฆฌ์ค๋์์ผ๋ฏ๋ก ์ด ์์ ์ฌํญ์ ์ด์ ๋ชจ๋ ์ฑ๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ธ๋ด์ฌ์ ๊ฐ๊ณ ๋์์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ง์นจ์ ๋ฐ๋ผ ๋ชจ๋ ์์ ์ ์ํํ์ง๋ง 32๋นํธ์๋ ์ค์น๋์ง ์์ต๋๋ค.
32๋นํธ ์ฅ์น์ 32๋นํธ apk๋ฅผ ์ค์นํ์ง ๋ชปํ์์ ๋ณด์ฌ์ฃผ๋ ์คํฌ๋ฆฐ์ท/๋ก๊ทธ๋ ๋ฌด์์ด๋ฉฐ ์ฅ์น ๋ชจ๋ธ์ ๋ฌด์์ ๋๊น?
๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ appbundle์ ๋น๋ํ๋ ค๊ณ ์๋ํ๊ณ ์๋ํ์ต๋๋ค.
@tvolkert ๋์ผํ ๋ฌธ์ ๋ฅผ ํ์ธํ์ญ์์ค. https://github.com/flutter/flutter/issues/31962#issuecomment -509458960
@ nimesh1997 ๊ทธ ๋ฌธ์ ๋
@tvolkert - ๋ช
ํํ ํ๊ธฐ ์ํด - ์์ ํซํฝ์ค๋ฅผ ์ฌ์ฉํ์ฌ flutter ๋ฌธ์ ์ง์นจ ์ ๋ฐ๋ผ ๋ณ๋์ apk๋ฅผ ๋น๋ํ ์ ์์ต๋๋ค. ๋ง์ต๋๊น?
๋ฐ๋ผ์ ์ด์ ๋ถ๋ถ ์๋ฃจ์
์์ ์ค๋ช
ํ ๋๋ก gradle ํ์ผ์์ ๋ค๋ฅธ ๋ณ๊ฒฝ์ ์ํํ ํ์๊ฐ ์์ต๋๋ค.
ํ๋ฅญํ ์์
๊ณผ ์ ์ ๋ฐฐ์ก์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ต์ ํซํฝ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ ์ค ํ๋๋ฅผ ๋ฐฉ๊ธ ์ปดํ์ผํ์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ปดํ์ผ๋ app-production-armeabi-v7a-release.apk
๋ Galaxy S3 mini(Android OS 4.1.2)์์ ์คํํ ์ ์์ต๋๋ค. ์์ ํ๋ฉด ์ดํ์๋ ์ฑ์ด ์๋ฆผ ์์ด ๋ซํ๋๋ค.
๊ทธ๋ฌ๋ Galaxy S8๊ณผ ๊ฐ์ 64 ์ ํ์์ ๋์ผํ APK๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์คํํ ์ ์์ต๋๋ค.
๋ค์์ ๋ช
๋ น์ค์์ ํ๋ฌํฐ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
ํ๋ฌํฐ ๋น๋ apk --target="lib/config/main_production.dart" --flavor=production --split-per-abi
์ฌ๊ธฐ ๋ด flutter doctor -v
[โ] Flutter(์ฑ๋ ์์ , v1.7.8+hotfix.2, Microsoft Windows [๋ฒ์ 10.0.17763.557], ๋ก์ผ์ผ en-US)
โข Flutter ๋ฒ์ 1.7.8+hotfix.2(E:\DevToolsflutter)
โข ํ๋ ์์ํฌ ๊ฐ์ ํ 2e540931f7(7์ผ ์ ), 2019-07-02 09:31:07 -0700
โข ์์ง ๋ฒ์ b1cb0d9e9b
โข ๋คํธ ๋ฒ์ 2.4.0
[โ] Android ํด์ฒด์ธ - Android ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ(Android SDK ๋ฒ์ 28.0.3)
โข E:\DevTools\Android\Sdk์ Android SDK
โข Android NDK ์์น๊ฐ ๊ตฌ์ฑ๋์ง ์์(์ ํ ์ฌํญ, ๊ธฐ๋ณธ ํ๋กํ์ผ๋ง ์ง์์ ์ ์ฉ)
โข ํ๋ซํผ android-28, ๋น๋ ๋๊ตฌ 28.0.3
โข ANDROID_SDK_ROOT = E:\DevTools\Android\Sdk
โข Java ๋ฐ์ด๋๋ฆฌ: E:\DevTools\android-studio\jre\bin\java
โข Java ๋ฒ์ OpenJDK ๋ฐํ์ ํ๊ฒฝ(๋น๋ 1.8.0_152-release-1343-b01)
โข ๋ชจ๋ Android ๋ผ์ด์ ์ค๊ฐ ํ์ฉ๋ฉ๋๋ค.
[โ] ์๋๋ก์ด๋ ์คํ๋์ค(๋ฒ์ 3.4)
โข E:\DevTools\android-studio์ Android ์คํ๋์ค
โข Flutter ํ๋ฌ๊ทธ์ธ ๋ฒ์ 37.0.1
โข Dart ํ๋ฌ๊ทธ์ธ ๋ฒ์ 183.6270
โข Java ๋ฒ์ OpenJDK ๋ฐํ์ ํ๊ฒฝ(๋น๋ 1.8.0_152-release-1343-b01)
[โ] ์ฐ๊ฒฐ๋ ์ฅ์น(1๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ)
โข x86์ฉ์ผ๋ก ๋น๋๋ Android SDK โข emulator-5554 โข android-x86 โข Android 8.1.0(API 27)(์๋ฎฌ๋ ์ดํฐ)
โข ๋ฐ๊ฒฌ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค!
๋ํ - fat apk๋ ์คํํ ์ ์์ต๋๋ค - ์ค์น ํ(๋์ผํ arm-32 ์ฅ์น์์) ์คํํ๊ณ ๊ทธ๋ฅ ๋ซ์ต๋๋ค.
์งํ ๋ฐฉ๋ฒ๊ณผ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์ธ์. ๊ฐ์ฌํฉ๋๋ค!
@angel1st ๋ฌธ์ ํด๊ฒฐ์ ๋์์ด ๋๋๋ก AAB ๋ฐ/๋๋ APK ํ์ผ์ ์ฌ๊ธฐ์์ ๊ณต์ ํ ์ ์์ต๋๊น?
@truongsinh -
์ฑ ํ๋ก๋์ ๋ฆด๋ฆฌ์ค.zip
๋ APK๋ฅผ ๋ชจ๋ ์ ๋ก๋ํ์ง๋ง ์์์ ์ธ๊ธํ ๋๋ก arm-32 ๋ฒ์ ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
๊ทธ ๋์ ์ฌ๋ฌ๋ถ, ๋๊ตฐ๊ฐ๊ฐ ๋๋ฌด ์น์ ํ๊ณ (์๊ณ ์๋ค๋ฉด) Google Play ์คํ ์ด์์ 8์ 1์ผ ์ดํ์ ์ด๋ป๊ฒ ๋ ์ง ์๋ ค์ค ๊ฒ์ ๋๋ค. ์ฑ์ arm-64 ๋ฒ์ ์ด ์๋ ๊ฒฝ์ฐ - apk๊ฐ ์ค์ง๋ ๊น์? arm64 ์ฅ์น์ ์ ๊ณต๋๊ฑฐ๋ arm32 ์ ์ฉ ๋ฒ์ ๋๋ ๋ ๋ค๋ฅผ ์ ๋ก๋ํ ์ ์์ต๋๊น?
@angel1st Android 4.4.2 Galaxy S4์์ ์ฑ(app-production-armeabi-v7a-release.apk)์ ์คํํ ์ ์์์ต๋๋ค. ์ข์ ์ฑ!
๋๋ ์ด๊ฒ์ด Galaxy S3 mini / Android OS 4.1.2์ ๋งค์ฐ ํน์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ์ด ๊ตฌ์ฑ์ ์์ฒญํ์ต๋๋ค.
@angel1st ๋ ๊ฐ์ฅ ์ ์ตํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์ถ์ฒ์ ๋๋ค. https://android-developers.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html
[64๋นํธ ํญ๋ชฉ] ์๊ตฌ ์ฌํญ์ ๋ค์์๋ ์ ์ฉ๋์ง ์์ต๋๋ค.
- ํ์ฌ 64๋นํธ ์ฝ๋๋ฅผ ์ง์ํ์ง ์๋ ํผ ํฉํฐ์ธ Wear OS ๋๋ Android TV๋ฅผ ๋ช ์์ ์ผ๋ก ํ๊ฒํ ํ๋ APK ๋๋ ์ฑ ๋ฒ๋ค์
- Android 9 Pie ์ด์์ ์คํํ๋ ๊ธฐ๊ธฐ์ ๋ฐฐํฌ๋์ง ์๋ APK ๋๋ ์ฑ ๋ฒ๋ค.
2019๋ 8์ 1์ผ๋ถํฐ:
- ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ํฌํจํ๋ ๋ชจ๋ ์ ์ฑ ๋ฐ ์ฑ ์ ๋ฐ์ดํธ๋ Google Play์ ๊ฒ์ํ ๋ 32๋นํธ ๋ฒ์ ์ธ์ 64๋นํธ ๋ฒ์ ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์ฆ, ๊ธฐ์กด ์ฑ์ ์ ๋ฒ์ ์ ์ ๋ก๋ํ๊ฑฐ๋ ๊ท์ ์ ์ค์ํ์ง ์๊ณ ์ ์ฑ์ ๊ฒ์ํ ์๋ ์์ง๋ง ์ฑ์ ๊ณ์ ๋ฐฐํฌ๋ฉ๋๋ค.
@angel1st Android OS 4.1.2๋ฅผ ์คํํ๋ Galaxy S3 mini์์ ์ด ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์์์ต๋๋ค.
๋ก๊ทธ์บฃ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
[ERROR:flutter/fml/platform/posix/native_library_posix.cc(16)] Could not open library 'libapp.so' due to error 'Cannot load library: load_library[1093]: Library 'libapp.so' not found'.
07-10 00:16:50.298 8739-8739/? E/flutter: [ERROR:flutter/fml/platform/posix/native_library_posix.cc(16)] Could not open library 'libapp.so' due to error 'Cannot load library: load_library[1093]: Library 'libapp.so' not found'.
07-10 00:16:50.298 8739-8739/? E/flutter: [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
07-10 00:16:50.298 8739-8739/? E/flutter: [ERROR:flutter/runtime/dart_vm.cc(238)] Could not setup VM data to bootstrap the VM from.
07-10 00:16:50.298 8739-8739/? E/flutter: [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
07-10 00:16:50.298 8739-8739/? A/flutter: [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.
๊ทธ๋์ https://github.com/flutter/flutter/issues/35838 ์ ์ ์ถํ์ต๋๋ค.
cc @jason-simmons
@truongsinh - ๊ฐ์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@blasten - ์ ์ํ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ด๊ฐ ์๋ ํ ATM์ ํ ์ ์์ง๋ง ๋ชจ๋ํฐ #35838์ ์๊ฐ๋ฝ์ผ๋ก ๊ต์ฐจ์ํค๋ฉด ์ด๋ฒ ๋ฌ์ ํด๊ฒฐ๋ ๊ฑด๊ฐ์? ์ต์ ํซํฝ์ค๋ก ์ปดํ์ผ๋ Android 4.1.2์ฉ ๋ค๋ฅธ apk์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๊น?
์ฐธ๊ณ ๋ก - ์ด์ ์ flutter ์์ ๋ฒ์ ์ผ๋ก ์ปดํ์ผ๋ ์ฑ apk์๋ ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค(Android 4.1.2๊ฐ ์ค์น๋ S3 mini๋ ํ
์คํธ ๊ธฐ๊ธฐ ์ค ํ๋์
๋๋ค).
์ค๋ ๋ค๋ฅธ ์ฌ๋์ด Google์์ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์ผ์ ๋ฐ์์ต๋๋ค.
"ํ์ํ ์กฐ์น: 2019๋ 8์ 1์ผ๊น์ง ์ฑ์ 64๋นํธ์ ํธํ๋๋๋ก ์ ๋ฐ์ดํธํ์ธ์."
์ด๋ฏธ 32๋นํธ ๋ฐ 64๋นํธ ๋ฒ์ ์ ๋ชจ๋ ๊ฒ์ํ๊ณ ์์ง๋ง?
๊ทธ๊ฒ์ ๋งํ๋ค
2019๋ 8์ 1์ผ๊น์ง ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฑ์ ์ ๋ฐ์ดํธ๋ฅผ ๊ฒ์ํ๊ธฐ ์ํด 64๋นํธ ๋ฒ์ ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์ด ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ์์ ์์ ๊ทํ์ ์ฑ* ์ค ํ๋ ์ด์์ด ์์ง ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ์ง ์์ต๋๋ค.
*์ฐธ๊ณ : ์ด ์ฑ ๋ชฉ๋ก์ ์ด ์ด๋ฉ์ผ์ด ๋ฐ์ก๋ ์์ ์์ Google์ ์ต์ ์ ์ถ์ ์น๋ฅผ ๋ฐ์ํฉ๋๋ค. (...)
Google์ "์ต์์ ๊ฒฌ์ "์ด ์ ํํ์ง ์์ ๊ฒ ๊ฐ์ต๋๊น?
Flutter ํ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. Flutter๋ฅผ ์
๊ทธ๋ ์ด๋ํ๊ณ ์์ ์ ์ธ ์ฑ๋์ ๊ตฌ์ถํ๋ฉด ๊ฒฝ๊ณ ๊ฐ ์ฌ๋ผ์ง๋๋ค.
ํ
์คํฐ์๊ฒ ๋ฒ๊ทธ๊ฐ ์๊ธฐ๋ฅผ ๋ฐ๋ผ์ง๋ง ์์ง๊น์ง๋ ์ค์ ์ฅ์น์์ ๋ฒ๊ทธ๋ฅผ ์ฐพ์ง ๋ชปํ์ต๋๋ค!
ํ Flutter ๊ฐ์ฌํฉ๋๋ค. Flutter๋ฅผ ํซํฝ์ค๋ก ์ ๊ทธ๋ ์ด๋ํ๋ฉด .aab๋ฅผ ๋น๋ํ ๋ ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
์ด ์ ์ ์ ๋ฌ์ฑํ Flutter ํ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด์ ํ๋ก๊ทธ๋๋ฐ์ ๊ณ์ํ์ญ์์ค!
@angel1st ์ผ๋ถ ์ผ์ฑ ๊ธฐ๊ธฐ์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
@abdullayev007 - ๊ฐ์ฌํฉ๋๋ค! ๋๋ ๋น์ ์ด #35838์ ์ดํด๋ณด๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ด๋ป๊ฒ ๋ ๊ด๋ จ์ด ์์ ์ ์์ต๋๋ค.
์ง์นจ์ ๋ฐ๋ผ ๋ชจ๋ ์์ ์ ์ํํ์ง๋ง 32๋นํธ์๋ ์ค์น๋์ง ์์ต๋๋ค.
32๋นํธ ์ฅ์น์ 32๋นํธ apk๋ฅผ ์ค์นํ์ง ๋ชปํ์์ ๋ณด์ฌ์ฃผ๋ ์คํฌ๋ฆฐ์ท/๋ก๊ทธ๋ ๋ฌด์์ด๋ฉฐ ์ฅ์น ๋ชจ๋ธ์ ๋ฌด์์ ๋๊น?
๊ธฐ๊ธฐ๋ ์ผ์ฑ M10์ ๋๋ค.
@tvolkert ๋ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํด๊ฒฐ์ฑ
์ ์๋ ค์ฃผ์ธ์.
https://github.com/flutter/flutter/issues/36063
๊ฐ์ฌ ํด์
dev channel - v1.8.4์์ ์ต์ ๋ฒ์ ์ flutter๋ฅผ ์ฌ์ฉํด ๋ณด์์ต๋๋ค. ๋๋ ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋ฐ๋๋ผ ํ๋ฌํฐ ํ๋ก์ ํธ์ ๊ทธ๊ฒ์ผ๋ก๋ถํฐ ๋ฆด๋ฆฌ์ค ์๋ช ๋ ๋ฒ์ ์ ๊ตฌ์ถํ๋ ค๊ณ ํ์ต๋๋ค. ๋น๋ ๋ฐ ์ฑ ํฌ๊ธฐ๋ 10.4MB์ ๋ถ๊ณผํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ํ์ ์์ ์์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์๋ํ์ง๋ง ๋์์ด ๋์ง ์์์ต๋๋ค. Flutter์์ ์๋ฎฌ๋ ์ดํฐ ๋ฐ ๋ก์ปฌ ์ฅ์น๋ฅผ ์ฌ์ฉํ์ฌ aab ๋๋ apk๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ ์ด ์คํ ์ด์ ํธ์ํ ์ ์๋ ๋น๋๋ฅผ ์ํํ๊ธฐ ์ํ ๋ช ํํ ์ผ๋ จ์ ๋จ๊ณ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? ์ผ์ฃผ์ผ์ด ๋๊ฒ ์ง๋ฌ๊ณ Android์์๋ prod๋ก ์ด๋ํ์ง ์๊ณ flutter๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ํ๋ก์ ํธ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ios์์๋ ์ฑ์คํ ์ด์ ๊ฒ์ํ ์ ์์ต๋๋ค. ์ฝ๊ฐ์ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
`[โ] Flutter(Mac OS X 10.14.5์์ ์ฑ๋ ๊ฐ๋ฐ, v1.8.4, ๋ก์ผ์ผ en-US)
โข Flutter ๋ฒ์ 1.8.4(/Users/muthu/muthu/devapps/flutter)
โข ํ๋ ์์ํฌ ๊ฐ์ 954714c967(7์ผ ์ ), 2019-08-02 10:10:39 -0700
โข ์์ง ๊ฐ์ ํ 26368225b5
โข Dart ๋ฒ์ 2.5.0(๋น๋ 2.5.0-dev.1.0 bd049f5b53)
[!] Android ๋๊ตฌ ๋ชจ์ - Android ๊ธฐ๊ธฐ์ฉ ๊ฐ๋ฐ(Android SDK ๋ฒ์ 29.0.1)
โข ../Library/Android/sdk์ Android SDK
โข Android NDK ์์น๊ฐ ๊ตฌ์ฑ๋์ง ์์(์ ํ ์ฌํญ, ๊ธฐ๋ณธ ํ๋กํ์ผ๋ง ์ง์์ ์ ์ฉ)
โข ํ๋ซํผ android-29, ๋น๋ ๋๊ตฌ 29.0.1
โข Java ๋ฐ์ด๋๋ฆฌ: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
โข Java ๋ฒ์ OpenJDK ๋ฐํ์ ํ๊ฒฝ(๋น๋ 1.8.0_152-release-1343-b01)
โ Android ๋ผ์ด์ ์ค ์ํ๋ฅผ ์ ์ ์์ต๋๋ค.
Android SDK Manager๋ฅผ ๋ค์ ์ค์นํ๊ฑฐ๋ ์
๋ฐ์ดํธํด ๋ณด์ธ์.
https://developer.android.com/studio/#downloads๋ฅผ ์ฐธ์กฐ ํ๊ฑฐ๋ https://flutter.dev/setup/#android -setup์ ๋ฐฉ๋ฌธ
์์ธํ ์ง์นจ์.
[โ] Xcode - iOS ๋ฐ macOS์ฉ ๊ฐ๋ฐ(Xcode 10.3)
โข /Applications/Xcode.app/Contents/Developer์ Xcode
โข Xcode 10.3, ๋น๋ ๋ฒ์ 10G8
โข CocoaPods ๋ฒ์ 1.7.3
[โ] ์๋๋ก์ด๋ ์คํ๋์ค(๋ฒ์ 3.4)
โข /Applications/Android Studio.app/Contents์ Android ์คํ๋์ค
โข Flutter ํ๋ฌ๊ทธ์ธ ๋ฒ์ 38.2.1
โข Dart ํ๋ฌ๊ทธ์ธ ๋ฒ์ 183.6270
โข Java ๋ฒ์ OpenJDK ๋ฐํ์ ํ๊ฒฝ(๋น๋ 1.8.0_152-release-1343-b01)
[โ] VS ์ฝ๋(๋ฒ์ 1.36.1)
โข /Applications/Visual Studio Code.app/Contents์ VS ์ฝ๋
โข Flutter ํ์ฅ ๋ฒ์ 3.3.0
[โ] ์ฐ๊ฒฐ๋ ์ฅ์น(3๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ)
โข x86์ฉ์ผ๋ก ๋น๋๋ Android SDK โข emulator-5554 โข android-x86 โข Android 9(API 28)
(์๋ฎฌ๋ ์ดํฐ)`
@muthufmass , ์๋ํ์ง ์๋ ํญ๋ชฉ๊ณผ ์ค๋ฅ๋ฅผ ์ฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ธ๋ถ ์ ๋ณด๊ฐ ํฌํจ๋ ์ ๋ฌธ์ ๋ฅผ ์ ์ถํ์ธ์. ๊ฐ์ฌ ํด์!
๋๊ฐ ์ฐ๋ฆฌ๊ฐ ํ๋ ์ด์คํ ์ด์ ํธ์ํ ์ ์๋ ๋น๋๋ฅผ ์ทจํ๊ธฐ ์ํ ๋ช ํํ ์ผ๋ จ์ ๋จ๊ณ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น?
๋๊ฐ ์ฐ๋ฆฌ๊ฐ ํ๋ ์ด์คํ ์ด์ ํธ์ํ ์ ์๋ ๋น๋๋ฅผ ์ทจํ๊ธฐ ์ํ ๋ช ํํ ์ผ๋ จ์ ๋จ๊ณ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น?
์ด ๋จ๊ณ๋ ์ด๋ฏธ ์ํ๋์์ผ๋ฉฐ prod ๋ฆด๋ฆฌ์ค ๋น๋์์๋ ์๋ํ์ง ์์ต๋๋ค. ๋๋ฒ๊ทธ ๋น๋๊ฐ ์๋ํฉ๋๋ค! ๋๋ฒ๊ทธ ๋น๋์์ ์ฐจ์ด์ ์ ๋ถ๋ช ํ ์ฐพ์์ต๋๋ค. flutter์ .so ํ์ผ์ด ์์ง๋ง ๋ฆด๋ฆฌ์ค ๋ฒ์ ์๋ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ apk๋ฅผ ์๋ฎฌ๋ ์ดํฐ ๋๋ ์๋ช ๋ apk๊ฐ ์๋ ์ฅ์น์ ์ค์นํ๋ ๋ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ฒ์ ๋๋ค.
@muthufmass , ์๋ํ์ง ์๋ ํญ๋ชฉ๊ณผ ์ค๋ฅ๋ฅผ ์ฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ธ๋ถ ์ ๋ณด๊ฐ ํฌํจ๋ ์ ๋ฌธ์ ๋ฅผ ์ ์ถํ์ธ์. ๊ฐ์ฌ ํด์!
์์ ๋ช ํํ ๋จ๊ณ๋ฅผ ๊ณต์ ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. flutter create๋ฅผ ์ฌ์ฉํ ์๋ก์ด ์ฑ ์์ฑ - ์ต์ flutter sdk๊ฐ ํฌํจ๋ ๋ฐ๋๋ผ ์ฝ๋. ๋๋ฒ๊ทธ ๋ฒ์ ์ด ์ํํ๊ฒ ์คํ๋๋ ๋์ ๋ฆด๋ฆฌ์ค ๋ฒ์ ์ ๋น๋ํ ์ ์์ต๋๋ค. apk์ prod ๋ฒ์ ๊ณผ dev ๋ฒ์ ์ ํฌ๊ธฐ ์ฐจ์ด๊ฐ ํฝ๋๋ค. ์์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์๋ํ์ง๋ง ์คํ๋๋ ๋ฆด๋ฆฌ์ค ๋ฒ์ ์ ๋น๋ํ ์ ์์ต๋๋ค. ๋น๋๋ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ฐ์ํ๊ณ ํ์ผ์ ๋ฆด๋ฆฌ์ค์ ํจ๊ป 11MB ๋ฏธ๋ง์ผ๋ก ์ ๊ณต๋๋ ๋ฐ๋ฉด ๋๋ฒ๊ทธ apk์์๋ ์ฝ 40MB+๊ฐ ์ ๊ณต๋ฉ๋๋ค. ๋๋ฒ๊ทธ apk๋ ์๋ํ์ง๋ง prod ๋ฆด๋ฆฌ์ค ์๋ช apk๋ ์ค์น๋์ง ์์ต๋๋ค.
@muthufmass ์ ๋ฌธ์ ๋ฅผ flutter create
๋ถํฐ ์์ํ๋ ๋จ๊ณ๋ฅผ ํฌํจํ์ธ์.
@muthufmass ๋ฐ logcat ์ถ๋ ฅ.
์ด ๋ฌธ์ ๋ ์ข ๋ฃ๋์์ต๋๋ค. ์ ๋๋ก ์ถ์ ํ ์ ์๋๋ก ์ ๋ฌธ์ ๋ฅผ ์ ์ถํ์ธ์.
์ง๊ธ ๋ณ๋์ ํฐ์ผ์ ์ฌ๋ ธ์ต๋๋ค https://github.com/flutter/flutter/issues/37935
ํ๋ก์ ํธ์ ํ๋ ์ด๋ฒ๊ฐ ์๊ณ x64์ x32๋ฅผ ๋ชจ๋ ์ง์ํ๋ ค๋ ๊ฒฝ์ฐ ํ๋ ์ด๋ฒ ํด๋์ jniLibs ํด๋๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค.
์ด๋๋น ์ ๋๋ฉ์ดํธ cc์์ ์ด๋ป๊ฒ ํ๋ฉด ๋ ๊น์?
๋ ๋ง์ ์ ๋ณด๊ฐ ํ์ํฉ๋๋ค
Google Play ์ฝ์์ ์ต๊ทผ ๋ค์ํ ๊ฒฝ๊ณ ๋ก ์ธํด ์ถ์ ๋ฒํผ์ ๋นํ์ฑํํ๊ธฐ ์์ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฒฝ๊ณ ์ค ํ๋๋ .aab ํ์ผ ๋์ apk๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ํ๋ก์ ํธ๊ฐ Android Studio ๋๋ Unity์์ ์์ฑ๋ ๊ฒฝ์ฐ .aab ํ์ผ์ ๋ง๋๋ ์๋ฃจ์ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ Animate CC ๋๋ Haxe/Flash Develop์์ apk๋ฅผ ๋ง๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ๋ฉ๋๊น? ๋ณํํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
@newapproach ๊ทํ์ ์๊ฒฌ์ด Flutter์ ๊ด๋ จ์ด ์๋์ง ์ฌ๋ถ๊ฐ ๋ช ํํ์ง ์์ต๋๊น? ๋ ์์ธํ ๋ด์ฉ์ด ํฌํจ๋ ์ ๋ฌธ์ ๋ฅผ ์ ์ถํ์๊ฒ ์ต๋๊น? ๊ฐ์ฌ ํด์!
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ง๋ง flutter.so๋ "armeabi-v7a ํด๋์ ํฌํจ๋์ด ์์ง ์์ต๋๋ค.
x86 ๋ฐ armeabi-v7a์ฉ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์๊ณ arm64๋ ์์ต๋๋ค.
"armeabi-v7a"์ ๋ํด์๋ง ํ๋ฌํฐ๋ฅผ ๋ง๋ค๊ณ ์ถ์ต๋๋ค.
ndk{
abiFilters "armeabi-v7a" // ์๋ํ์ง ์์"armeabi", "x86",
}
@mravn-google์ด android-arm์ ์ ์ํ ๋๋ก target-platform์ผ๋ก ์ค์ ํฉ๋๋ค.์์น๋ฅผ ์ง์ ํ์ง ์๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ์ง ์๋ APK
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ณ ํ ์ฌ์์ด ์๋ APK
์์น๋ฅผ ์ง์ ํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๋ APK
์ถ๊ฐ ๋จ๊ณ๋ฅผ ๋๋ฒ๊น ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์์ด ์์ต๋๊น?
์ด ์ค๋ฅ๋ ๋ฐ๊ฒฌํ๋๋ฐ ํด๊ฒฐ๋์๋์?? ๋์์ด ๋ ๊น์?
Stack Overflow์ ์ง๋ฌธํ๊ฑฐ๋ ์ ๋ฒ๊ทธ๋ฅผ ์ฌ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ๋ซํ ๋ฒ๊ทธ๊ฐ ์ฌ๋๋ค์ด ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ค ์ ์๋ ์ ์ ํ ์ฅ์์ธ์ง ์์ฌ์ค๋ฝ์ต๋๋ค. ๊ฐ์ฌ ํด์!
์ด๊ฒ์ด ๋ด ์๋ฃจ์ ์ด์์ต๋๋ค.
app gradle
splits { // Configures multiple APKs based on ABI. abi { // Enables building multiple APKs per ABI. enable true // By default all ABIs are included, so use reset() and include to specify that we only // want APKs for armeabi-v7a and arm64-v8a. // Resets the list of ABIs that Gradle should create APKs for to none. reset() // Specifies a list of ABIs that Gradle should create APKs for. include "armeabi-v7a", "arm64-v8a" // Specifies that we do not want to also generate a universal APK that includes all ABIs. universalApk false } }
flutter build apk --release --target-platform=android-arm
- ํ๋ ์ด ์คํ ์ด์
app-armeabi-v7a-release.apk
์ ๋ก๋- ์ฆ๊ฐ
versionCode
flutter build apk --release --target-platform=android-arm64
- ํ๋ ์ด ์คํ ์ด์
app-arm64-v8a-release.apk
์ ๋ก๋Google Play ์คํ ์ด๋ ๊ธฐ๊ธฐ ์ํคํ ์ฒ์ ๋ฐ๋ผ ์ฑ์ ์ ๊ณตํฉ๋๋ค. 32๋นํธ ์ฅ์น๋ ๋ง์กฑํ๊ณ 64๋นํธ ์ฅ์น๋ ๋ง์กฑํ๋ฉฐ ๋ ์ํคํ ์ฒ๋ฅผ ๋ชจ๋ ์ ๊ณตํ๋ฉด์ APK ํฌ๊ธฐ๊ฐ ์๋์ ์ผ๋ก ์๊ฒ ์ ์ง๋๋ค๋ ์ฌ์ค์ ๋ง์กฑํฉ๋๋ค.
๋์ผํ APK์ ๋ ์ํคํ ์ฒ์ ๋ํ ์ง์์ด ํฌํจ๋ ๊ฒฝ์ฐ ์ฑ ํฌ๊ธฐ๋ 10MB ์ด์์ด ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
์๋ํ์ง ์์ต๋๋ค. ํฝ์ 2์ ํ๋ ์ด์คํ ์ด์์ ๋ณผ ๋ ์ด ์ฅ์น์์ ์ง์๋์ง ์๋๋ค๊ณ ํ์๋ฉ๋๋ค.
์๋ํฉ๋๋ค. ๋ง์ ์ ์๋ ค์ง ์ฑ์ด ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ฌ๋ฌ APK๋ฅผ ๋ฐฐํฌํ๊ณ Play ์คํ ์ด๊ฐ ์ ์ ํ ๊ธฐ๊ธฐ์ ์ ์ ํ APK๋ฅผ ์ค๋ซ๋์ ์ ๊ณตํ๋๋ก ํ์ต๋๋ค.
ํ์ง๋ง App Bundle์ ์ด๋ฅผ ์ํํ๋ ํ๋์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
์๋ํฉ๋๋ค. ๋ง์ ์ ์๋ ค์ง ์ฑ์ด ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ฌ๋ฌ APK๋ฅผ ๋ฐฐํฌํ๊ณ Play ์คํ ์ด๊ฐ ์ ์ ํ ๊ธฐ๊ธฐ์ ์ ์ ํ APK๋ฅผ ์ค๋ซ๋์ ์ ๊ณตํ๋๋ก ํ์ต๋๋ค.
ํ์ง๋ง App Bundle์ ์ด๋ฅผ ์ํํ๋ ํ๋์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
์ ํฝ์
2 ํ๋ ์ด ์คํ ์ด์ ํ์๋์ง ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค... ํน์ ๋ชฐ๋ผ์ ์ ํํ ๋ ๋ฒ ํ๋ก์ฐํฉ๋๋ค.
App Bundle์ ์ฌ์ฉํ๋๋ฐ ์ฑ์ด ์ถฉ๋ํ์ฌ ๋์์ ์ฐพ๊ณ ์์ต๋๋ค.
์ด ์ค๋ ๋๋ ๋ซํ ํ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ ๊ฒผ์ต๋๋ค. ๋น์ทํ ๋ฌธ์ ๊ฐ ๊ณ์ ๋ฐ์ํ๋ฉด flutter doctor -v
์ ์ถ๋ ฅ๊ณผ ๋ฌธ์ ์ ์ต์ํ์ ์ฌํ์ ํฌํจํ์ฌ ์ ๋ฒ๊ทธ๋ฅผ ์ฌ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. 32๋นํธ์ฉ์ผ๋ก ๋น๋ํ๋ฉด 64๋นํธ ์ฅ์น๊ฐ ์ ์ธ๋์ง๋ง ์คํ๋ฉ๋๋ค.
--target-platform android-arm64
๋ฅผ ์ง์ ํ์ฌ 64์ฉ ๋น๋๋ 64๋นํธ ์ฅ์น์์ ์๋ํ์ง๋ง 32๋นํธ ์ฅ์น์์๋ ์ถฉ๋ํฉ๋๋ค. ๋ํ Google์ 2019๋ ์ APK ์ ๋ก๋๋ฅผ 64๋นํธ๋ก ์ ํํ ์์ ์ ๋๋ค.Flutter Team, ์ด ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ์ธ์!