Flutter: 32๋น„ํŠธ ๋ฐ 64๋น„ํŠธ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ APK ์ง€์›

์— ๋งŒ๋“  2018๋…„ 06์›” 15์ผ  ยท  286์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: flutter/flutter

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 ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

image

์–ด๋””์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

crowd platform-android new feature gradle tool waiting for PR to land (fixed)

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 32๋น„ํŠธ์šฉ์œผ๋กœ ๋นŒ๋“œํ•˜๋ฉด 64๋น„ํŠธ ์žฅ์น˜๊ฐ€ ์ œ์™ธ๋˜์ง€๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. --target-platform android-arm64 ๋ฅผ ์ง€์ •ํ•˜์—ฌ 64์šฉ ๋นŒ๋“œ๋Š” 64๋น„ํŠธ ์žฅ์น˜์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ 32๋น„ํŠธ ์žฅ์น˜์—์„œ๋Š” ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Google์€ 2019๋…„์— APK ์—…๋กœ๋“œ๋ฅผ 64๋น„ํŠธ๋กœ ์ œํ•œํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

Flutter Team, ์ด ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ์„ธ์š”!

๋ชจ๋“  286 ๋Œ“๊ธ€

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
screen shot 2018-07-26 at 21 06 53

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๊ณ  ํŒ” ์‚ฌ์–‘์ด ์—†๋Š” APK
screen shot 2018-07-26 at 21 10 30

์•„์น˜๋ฅผ ์ง€์ •ํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” APK
screen shot 2018-07-26 at 21 12 58

์ถ”๊ฐ€ ๋‹จ๊ณ„๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@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์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๋ฌธ์ œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

  1. ์ถ”์ถœ lib/armeabi-v7a/libflutter.so ์—์„œ $<FLUTTER>/bin/cache/artifacts/engine/android-arm-release/flutter.jar
  2. ํŒŒ์ผ ๋ณต์‚ฌ armeabi-v7a/libflutter.so ๋กœ $<project>/android/jniLibs/armeabi-v7a/
  3. $<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 ์ฒซ ๋Œ“๊ธ€์— ์—„์ง€์†๊ฐ€๋ฝ์„

  1. ์ถ”์ถœ lib/armeabi-v7a/libflutter.so ์—์„œ $<FLUTTER>/bin/cache/artifacts/engine/android-arm-release/flutter.jar
  2. ํŒŒ์ผ ๋ณต์‚ฌ armeabi-v7a/libflutter.so ๋กœ $<project>/android/jniLibs/armeabi-v7a/
  3. $<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์—์„œ ์ง€์›ํ•˜๋Š” ๋„ค ๊ฐ€์ง€ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • armeabi-v7a
  • arm64-v8a
  • x86
  • x86_64

ํ˜„์žฌ 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์—์„œ ๊ฒŒ์‹œํ•œ ์†”๋ฃจ์…˜์ด ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์•ฑ์„ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์Šค ์„น์…˜์— ๋„ฃ์–ด

์ด๊ฒƒ์ด ๋‚ด ์†”๋ฃจ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  1. 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
        }
    }
  1. flutter build apk --release --target-platform=android-arm

  2. ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— app-armeabi-v7a-release.apk ์—…๋กœ๋“œ

  3. ์ฆ๊ฐ€ versionCode

  4. flutter build apk --release --target-platform=android-arm64

  5. ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— 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/", "")
                }
            }
        }
    }
}

์ตœ๊ทผ ๊ฐœ๋ฐœ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์›ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ๊ฒฐ๊ตญ ํ•œ ์ผ

  • ๊ฐ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๋ณ„๋„์˜ APK
  • versionCode๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ผ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ APK ์ƒ์„ฑ
  1. ์ด๊ฒƒ์„ gradle์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ถ”๊ฐ€ 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
    }
}
  1. apk๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋” ๊ธด ํ„ฐ๋ฏธ๋„ ๋ช…๋ น(์Šคํฌ๋ฆฝํŠธ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ๋์— apk์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
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๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์Šคํฌ๋ฆฐ์ƒท์ด ์žˆ์Šต๋‹ˆ๋‹ค

flutter

@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 ํŒ€์ด ์ด๋ฅผ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์„ธ์š”.

๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Flutter ํŒ€์ด 32 ๋Œ€ 64 ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ Google Play ์Šคํ† ์–ด์—์„œ Flutter ๋นŒ๋“œ๋ฅผ ๋‹ค์‹œ ์ˆ˜๋ฝํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์„ธ์š”.
  • ์šฐ๋ฆฌ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ๊ธฐ๊ธฐ๋ฅผ 32๋น„ํŠธ๋กœ๋งŒ ์ œํ•œํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์€ 32๋น„ํŠธ ๊ธฐ๊ธฐ์—์„œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • Play ์Šคํ† ์–ด์—์„œ 64๋น„ํŠธ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š๋„๋ก Google์— ์–ด๋–ป๊ฒŒ๋“  ์„ค๋“ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (32๋น„ํŠธ์™€ 64๋น„ํŠธ์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๊ฐ€ ๋” ํฐ๊ฐ€์š”?)
  • ์–ด๋–ป๊ฒŒ ๋“  64 ๋น„ํŠธ ์žฅ์น˜์— 32 ๊ฐœ์˜ ์•ฑ์„ ์„ค์น˜ํ•˜์ง€๋งŒ ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์—๋Š” ์„ค์น˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค ...

--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๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์žฅ์น˜์— ์ง์ ‘ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฑ์„ ์ง์ ‘ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
  • Google Play ์Šคํ† ์–ด๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์•ฑ ๋งˆ์ผ“์„ ํ†ตํ•ด ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. (์•„๋งˆ์กด ๋ฐ ๋ชจ๋“  ์ค‘๊ตญ).

๋‚ด๊ฐ€ ์ฐธ์กฐ. ๋ฐฐ๊ฒฝ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ 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

์ด๊ฒƒ์ด ๋‚ด ์†”๋ฃจ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  1. 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
        }
    }
  1. flutter build apk --release --target-platform=android-arm
  2. ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— app-armeabi-v7a-release.apk ์—…๋กœ๋“œ
  3. ์ฆ๊ฐ€ versionCode
  4. flutter build apk --release --target-platform=android-arm64
  5. ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— 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๋กœ ์ƒ์„ฑ)์—์„œ ๋‚ด ์•ฑ์„ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์—ฌ๊ธฐ์—์„œ ์ •ํ™•ํžˆ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์–ด๋–ค ๋กœ๊ทธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  1. https://developer.android.com/studio/command-line/bundletool ์—์„œ bundletool ๋‹ค์šด๋กœ๋“œ
  2. flutter build appbundle (ํ”Œ๋ž˜๊ทธ๋ฅผ ์ „๋‹ฌํ–ˆ๋Š”์ง€ ๋˜๋Š” Gradle ์Šคํฌ๋ฆฝํŠธ๋ฅผ _custom_ ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€ ํ‘œ์‹œํ•˜์„ธ์š”.)
  3. bundletool build-apks --bundle=build/app/outputs/bundle/release/app.aab --output=out.apks ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ APK ์„ธํŠธ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  4. 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๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ). )

์š”์•ฝํ•˜์ž๋ฉด:

  1. Flutter๋Š” flutter build apk ... ๋ฅผ ํ†ตํ•ด ํŒป APK๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด ๊ธฐ๋Šฅ์„ _์ง€๊ธˆ ๋‹น์žฅ_ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์—์„œ 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์„ ์‹œ๋„ํ•˜๋ฉด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ธด ์„ค๋ช…์ด ๋  ๊ฒƒ์ด์ง€๋งŒ ์ด๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด ์†”๋ฃจ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  1. 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
        }
    }
  1. flutter build apk --release --target-platform=android-arm
  2. ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— app-armeabi-v7a-release.apk ์—…๋กœ๋“œ
  3. ์ฆ๊ฐ€ versionCode
  4. flutter build apk --release --target-platform=android-arm64
  5. ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— 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 ์Šคํ† ์–ด์—์„œ) ์ถœ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ฐพ์€ ์œ ์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. (์‹ค์—์„œ ๋ถ€๋ถ„์ ์œผ๋กœ ๋‹ค๋ฃจ์—ˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ์Œ):

  1. v7 ํ•„ํ„ฐ๋ฅผ ์ผœ๊ณ  ๊ธฐ๋ณธ ๋นŒ๋“œ apk ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ apk๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    app/build.gradle ํŒŒ์ผ์—์„œ:
    defaultConfig { ... ndk{ abiFilters "armeabi-v7a" } }
    ๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰
    flutter build apk
    (๊ธฐ๋ณธ๊ฐ’์€ --release)

  2. pubspec.yaml์—์„œ ๋นŒ๋“œ ๋ฒˆํ˜ธ๋ฅผ ๋ฒ”ํ”„ํ•˜์‹ญ์‹œ์˜ค.
    ์˜ˆ: version: 1.1.0+6 ์—์„œ version: 1.1.0+7

  3. 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 ๋ฐฉ๋ฒ•์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”

๋Œ“๊ธ€ ์–ด๋”˜๊ฐ€์— ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๊ฒƒ์„ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค.

image

์ด๊ฒƒ์€ ์ €์™€ ์œ ์ผํ•œ 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

๊ธด ์„ค๋ช…์ด ๋  ๊ฒƒ์ด์ง€๋งŒ ์ด๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด ์†”๋ฃจ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  1. 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
        }
    }
  1. flutter build apk --release --target-platform=android-arm
  2. ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— app-armeabi-v7a-release.apk ์—…๋กœ๋“œ
  3. ์ฆ๊ฐ€ versionCode
  4. flutter build apk --release --target-platform=android-arm64
  5. ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— 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 ๋ฒ„์ „์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ
๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ
WinRAR_2019-05-30_02-55-34

Android Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ „ ๋ฒ„์ „์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ
WinRAR_2019-05-30_03-03-15

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ 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์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
1_Awm6pB8jR3wGdHMC4DsatQ

@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.

  1. ํ”Œ๋Ÿฌํ„ฐ ๋นŒ๋“œ 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

https://flutter.dev/docs/deployment/android#build -an-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' ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • 'ImageInfo'๋Š” ' package:flutter/src/painting/ image_stream.dart '('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/painting/image_stream.dart ').
  • 'ImageStreamListener'๋Š” ' package:flutter/src/painting/ image_stream.dart '('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/painting/image_stream.dart ').
    ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ธ์ˆ˜๋ฅผ 'ImageStreamListener'๋กœ ์บ์ŠคํŒ…ํ•ด ๋ณด์‹ญ์‹œ์˜ค.
    oldImageStream?.removeListener(_handleImageChanged);
    ^^
    file:///Users/waleed/.pub-cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image. dart:200 :32: ์˜ค๋ฅ˜: 'void Function(ImageInfo, bool)' ์ธ์ˆ˜ ์œ ํ˜•์„ 'ImageStreamListener' ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • 'ImageInfo'๋Š” ' package:flutter/src/painting/ image_stream.dart '('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/painting/image_stream.dart ').
  • 'ImageStreamListener'๋Š” ' package:flutter/src/painting/ image_stream.dart '('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/painting/image_stream.dart ').
    ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ธ์ˆ˜๋ฅผ 'ImageStreamListener'๋กœ ์บ์ŠคํŒ…ํ•ด ๋ณด์‹ญ์‹œ์˜ค.
    _imageStream.addListener(_handleImageChanged);
    ^^
    file:///Users/waleed/.pub-cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image. dart:210 :34: ์˜ค๋ฅ˜: 'void Function(ImageInfo, bool)' ์ธ์ˆ˜ ์œ ํ˜•์„ 'ImageStreamListener' ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • 'ImageInfo'๋Š” ' package:flutter/src/painting/ image_stream.dart '('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/painting/image_stream.dart ').
  • 'ImageStreamListener'๋Š” ' package:flutter/src/painting/ image_stream.dart '('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/painting/image_stream.dart ').
    ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ธ์ˆ˜๋ฅผ 'ImageStreamListener'๋กœ ์บ์ŠคํŒ…ํ•ด ๋ณด์‹ญ์‹œ์˜ค.
    _imageStream?.removeListener(_handleImageChanged);
    ^^
    file:///Users/waleed/.pub-cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image. dart:465 :31: ์˜ค๋ฅ˜: 'Null Function(StringBuffer)' ์ธ์ˆ˜ ์œ ํ˜•์„ 'Iterable' ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.๊ธฐ๋Šฅ()'.
  • 'StringBuffer'๋Š” ' dart:core '์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
  • 'Iterable'์€ ' dart:core '์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
  • 'DiagnosticsNode'๋Š” ' package:flutter/src/foundation/diagnostics.dart '('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/foundation/diagnostics.dart ').
    ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ธ์ˆ˜๋ฅผ 'Iterable๊ธฐ๋Šฅ()'.
    informationCollector: (StringBuffer ์ •๋ณด) {
    ^^
    ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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'์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.๊ธฐ๋Šฅ()'.

  • 'StringBuffer'๋Š” ' dart:core '์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
  • 'Iterable'์€ ' dart:core '์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
  • 'DiagnosticsNode'๋Š” ' package:flutter/src/foundation/diagnostics.dart '('file:///home/zunroof-dev-4/package_flutter/flutter/packages/flutter/lib/src/foundation/diagnostics.dart ').
    ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ธ์ˆ˜๋ฅผ 'Iterable๊ธฐ๋Šฅ()'.
    informationCollector: (StringBuffer ์ •๋ณด) {
    ^^
    file:///home/zunroof-dev-4/package_flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_image-1.0.0/lib/network. dart:168 :65: ์˜ค๋ฅ˜: 'String' ์ธ์ˆ˜ ์œ ํ˜•์€ 'DiagnosticsNode' ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • 'DiagnosticsNode'๋Š” ' package:flutter/src/foundation/diagnostics.dart '('file:///home/zunroof-dev-4/package_flutter/flutter/packages/flutter/lib/src/foundation/diagnostics.dart ').
    ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ธ์ˆ˜๋ฅผ 'DiagnosticsNode'๋กœ ์บ์ŠคํŒ…ํ•ด ๋ณด์‹ญ์‹œ์˜ค.
    ์ปจํ…์ŠคํŠธ: '$runtimeType์ด ${instructions.uri}๋ฅผ ๋กœ๋“œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.',
    ^^
    ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ ์˜ค๋ฅ˜, ๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ 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 ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

0 throwToolExit(ํŒจํ‚ค์ง€:flutter_tools/src/base/common.dart:28:3)

1 _buildGradleProjectV2

(ํŒจํ‚ค์ง€:flutter_tools/src/android/gradle.dart:514:7)

2 _asyncThenWrapperHelper.

(dart:async-patch/async_patch.dart:77:64)

3 _rootRunUnary(dart:async/zone.dart:1132:38)

4 _CustomZone.runUnary(dart:async/zone.dart:1029:19)

5 _FutureListener.handleValue (dart:async/future_impl.dart:126:18)

6 Future._propagateToListeners.handleValueCallback

(dart:async/future_impl.dart:639:45)

7 Future._propagateToListeners (dart:async/future_impl.dart:668:32)

8 Future._complete (dart:async/future_impl.dart:473:7)

9 _SyncCompleter.complete (dart:async/future_impl.dart:51:12)

10 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:28:18)

11 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:294:13)

12 runCommandAndStreamOutput (ํŒจํ‚ค์ง€:flutter_tools/src/base/process.dart)

13 _asyncThenWrapperHelper.

(dart:async-patch/async_patch.dart:77:64)

14 _rootRunUnary (dart:async/zone.dart:1132:38)

15 _CustomZone.runUnary (dart:async/zone.dart:1029:19)

16 _FutureListener.handleValue (dart:async/future_impl.dart:126:18)

17 Future._propagateToListeners.handleValueCallback

(dart:async/future_impl.dart:639:45)

18 Future._propagateToListeners (dart:async/future_impl.dart:668:32)

19 Future._completeWithValue (dart:async/future_impl.dart:483:5)

20 ๋ฏธ๋ž˜._asyncComplete.

(dart:async/future_impl.dart:513:7)

21 _rootRun (dart:async/zone.dart:1124:13)

22 _CustomZone.run (dart:async/zone.dart:1021:19)

23 _CustomZone.runGuarded(dart:async/zone.dart:923:7)

24 _CustomZone.bindCallbackGuarded.

(dart:async/zone.dart:963:23)

25 _๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ๋ฃจํ”„(dart:async/schedule_microtask.dart:41:21)

26 _startMicrotask ๋ฃจํ”„(dart:async/schedule_microtask.dart:50:5)

27 _runPending์ฆ‰์‹œ ์ฝœ๋ฐฑ

(dart:isolate-patch/isolate_patch.dart:116:13)

28 _RawReceivePortImpl._handleMessage

(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' ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • 'Int32List'๋Š” ' dart:typed_data '์—์„œ
  • 'Uint16List'๋Š” 'dart:typed_data'์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
    ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ธ์ˆ˜๋ฅผ 'Uint16List'๋กœ ์บ์ŠคํŒ…ํ•ด ๋ณด์‹ญ์‹œ์˜ค.
    ์ธ๋ฑ์Šค: _indices, textureCoordinates: _uvBuffer);
    ^^
    ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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% ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•˜์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋ฌธ์ œ์—์„œ ํžŒํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด ์†”๋ฃจ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  1. 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
        }
    }
  1. flutter build apk --release --target-platform=android-arm
  2. ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— app-armeabi-v7a-release.apk ์—…๋กœ๋“œ
  3. ์ฆ๊ฐ€ versionCode
  4. flutter build apk --release --target-platform=android-arm64
  5. ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— 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 ์ผ๋ถ€ ์‚ผ์„ฑ ๊ธฐ๊ธฐ์—์„œ๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

https://github.com/flutter/flutter/issues/36128

@abdullayev007 - ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ๋‹น์‹ ์ด #35838์„ ์‚ดํŽด๋ณด๊ธฐ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ๋“  ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์นจ์— ๋”ฐ๋ผ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ 32๋น„ํŠธ์—๋Š” ์„ค์น˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

32๋น„ํŠธ ์žฅ์น˜์— 32๋น„ํŠธ apk๋ฅผ ์„ค์น˜ํ•˜์ง€ ๋ชปํ–ˆ์Œ์„ ๋ณด์—ฌ์ฃผ๋Š” ์Šคํฌ๋ฆฐ์ƒท/๋กœ๊ทธ๋Š” ๋ฌด์—‡์ด๋ฉฐ ์žฅ์น˜ ๋ชจ๋ธ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
IMG-20190710-WA0000

๊ธฐ๊ธฐ๋Š” ์‚ผ์„ฑ 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 , ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ๊ณผ ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์„ธ์š”. ๊ฐ์‚ฌ ํ•ด์š”!

๋ˆ„๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ํ”Œ๋ ˆ์ด์Šคํ† ์–ด์— ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋นŒ๋“œ๋ฅผ ์ทจํ•˜๊ธฐ ์œ„ํ•œ ๋ช…ํ™•ํ•œ ์ผ๋ จ์˜ ๋‹จ๊ณ„๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

https://flutter.dev/docs/deployment/android

๋ˆ„๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ํ”Œ๋ ˆ์ด์Šคํ† ์–ด์— ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋นŒ๋“œ๋ฅผ ์ทจํ•˜๊ธฐ ์œ„ํ•œ ๋ช…ํ™•ํ•œ ์ผ๋ จ์˜ ๋‹จ๊ณ„๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

https://flutter.dev/docs/deployment/android

์ด ๋‹จ๊ณ„๋Š” ์ด๋ฏธ ์ˆ˜ํ–‰๋˜์—ˆ์œผ๋ฉฐ prod ๋ฆด๋ฆฌ์Šค ๋นŒ๋“œ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ทธ ๋นŒ๋“œ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ๋””๋ฒ„๊ทธ ๋นŒ๋“œ์—์„œ ์ฐจ์ด์ ์„ ๋ถ„๋ช…ํžˆ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. flutter์˜ .so ํŒŒ์ผ์ด ์žˆ์ง€๋งŒ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์—๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ apk๋ฅผ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋˜๋Š” ์„œ๋ช…๋œ apk๊ฐ€ ์žˆ๋Š” ์žฅ์น˜์— ์„ค์น˜ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@muthufmass , ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ๊ณผ ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์„ธ์š”. ๊ฐ์‚ฌ ํ•ด์š”!

์œ„์˜ ๋ช…ํ™•ํ•œ ๋‹จ๊ณ„๋ฅผ ๊ณต์œ ํ–ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. flutter create๋ฅผ ์‚ฌ์šฉํ•œ ์ƒˆ๋กœ์šด ์•ฑ ์ƒ์„ฑ - ์ตœ์‹  flutter sdk๊ฐ€ ํฌํ•จ๋œ ๋ฐ”๋‹๋ผ ์ฝ”๋“œ. ๋””๋ฒ„๊ทธ ๋ฒ„์ „์ด ์›ํ™œํ•˜๊ฒŒ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์„ ๋นŒ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. apk์˜ prod ๋ฒ„์ „๊ณผ dev ๋ฒ„์ „์˜ ํฌ๊ธฐ ์ฐจ์ด๊ฐ€ ํฝ๋‹ˆ๋‹ค. ์œ„์˜ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹คํ–‰๋˜๋Š” ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์„ ๋นŒ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ๋Š” ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋ฐœ์ƒํ•˜๊ณ  ํŒŒ์ผ์€ ๋ฆด๋ฆฌ์Šค์™€ ํ•จ๊ป˜ 11MB ๋ฏธ๋งŒ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๋ฐ˜๋ฉด ๋””๋ฒ„๊ทธ apk์—์„œ๋Š” ์•ฝ 40MB+๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋””๋ฒ„๊ทธ apk๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ prod ๋ฆด๋ฆฌ์Šค ์„œ๋ช… apk๋Š” ์„ค์น˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Screen Shot 2019-08-09 at 8 29 12 PM

@muthufmass ์ƒˆ ๋ฌธ์ œ๋ฅผ flutter create ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•˜์„ธ์š”.

@muthufmass ๋ฐ logcat ์ถœ๋ ฅ.

์ด ๋ฌธ์ œ๋Š” ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒˆ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์„ธ์š”.

์ง€๊ธˆ ๋ณ„๋„์˜ ํ‹ฐ์ผ“์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค https://github.com/flutter/flutter/issues/37935

ํ”„๋กœ์ ํŠธ์— ํ”Œ๋ ˆ์ด๋ฒ„๊ฐ€ ์žˆ๊ณ  x64์™€ x32๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ”Œ๋ ˆ์ด๋ฒ„ ํด๋”์— jniLibs ํด๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
image

์–ด๋„๋น„ ์• ๋‹ˆ๋ฉ”์ดํŠธ 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
screen shot 2018-07-26 at 21 06 53

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๊ณ  ํŒ” ์‚ฌ์–‘์ด ์—†๋Š” APK
screen shot 2018-07-26 at 21 10 30

์•„์น˜๋ฅผ ์ง€์ •ํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” APK
screen shot 2018-07-26 at 21 12 58

์ถ”๊ฐ€ ๋‹จ๊ณ„๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์˜ค๋ฅ˜๋„ ๋ฐœ๊ฒฌํ–ˆ๋Š”๋ฐ ํ•ด๊ฒฐ๋˜์—ˆ๋‚˜์š”?? ๋„์›€์ด ๋ ๊นŒ์š”?

Stack Overflow์— ์งˆ๋ฌธํ•˜๊ฑฐ๋‚˜ ์ƒˆ ๋ฒ„๊ทธ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ๋‹ซํžŒ ๋ฒ„๊ทธ๊ฐ€ ์‚ฌ๋žŒ๋“ค์ด ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ์žฅ์†Œ์ธ์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

์ด๊ฒƒ์ด ๋‚ด ์†”๋ฃจ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  1. 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
        }
    }
  1. flutter build apk --release --target-platform=android-arm
  2. ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— app-armeabi-v7a-release.apk ์—…๋กœ๋“œ
  3. ์ฆ๊ฐ€ versionCode
  4. flutter build apk --release --target-platform=android-arm64
  5. ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— 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 ์˜ ์ถœ๋ ฅ๊ณผ ๋ฌธ์ œ์˜ ์ตœ์†Œํ•œ์˜ ์žฌํ˜„์„ ํฌํ•จํ•˜์—ฌ ์ƒˆ ๋ฒ„๊ทธ๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰