Slide 1

Slide 1 text

FlutterΞϓϦͷ೉ಡԽͱ ΤϥʔϨϙʔτ(iOS) Hiroki Matsue Dec 6th, 2018 Flutter Meetup Tokyo #6

Slide 2

Slide 2 text

Hiroki Matsue (@macs_6)

Slide 3

Slide 3 text

FlutterͰIIJmio޲͚ʹ ʮΈ͓εΠονʯΛ ϦϦʔε

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

[࣭໰] FlutterͰΞϓϦΛ ϦϦʔε͍ͯ͠Δਓʁ

Slide 6

Slide 6 text

[࣭໰] ϦϦʔεલʹ ೉ಡԽͨ͠ਓʁ

Slide 7

Slide 7 text

ϦϦʔεؔ࿈ͷυΩϡϝϯτ https://flutter.io/docs/deployment/ios

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

࠷ॳʹॻ͍͚ͯ͋ͬͨͲ ݟམͱͯͨ͠ (AndroidͷProGuardରԠͯͯ͠ؾ͍ͮͨ)

Slide 11

Slide 11 text

ͪͳΈʹ

Slide 12

Slide 12 text

(ϦϦʔεؔ࿈Ͱ୤ઢ) ΞΠίϯ࡞੒͸"flutterlaunchericons"࢖͏ͱ 1ͭͷը૾͔Β͍͍ײ͡ʹ࡞ͬͯ͘ΕΔ

Slide 13

Slide 13 text

iOS͸Dartίʔυ෦෼͕ ೉ಡԽͷର৅

Slide 14

Slide 14 text

΍Δ͜ͱ͸build࣌ʹ ΦϓγϣϯΛ͚ͭΔ͚ͩ (Կނ͔ॳظঢ়ଶͰ͸ରԠ͞Εͯͳ͍ ) https://github.com/flutter/flutter/wiki/Obfuscating-Dart-Code

Slide 15

Slide 15 text

/ios/Flutter/Release.xcconfig EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate

Slide 16

Slide 16 text

# /packages/flutter_tools/bin/xcode_backend.sh local extra_gen_snapshot_options_or_none="" if [[ -n "$EXTRA_GEN_SNAPSHOT_OPTIONS" ]]; then extra_gen_snapshot_options_or_none="--extra-gen-snapshot-options=$EXTRA_GEN_SNAPSHOT_OPTIONS" fi ... RunCommand "${FLUTTER_ROOT}/bin/flutter" --suppress-analytics \ ${verbose_flag} \ build aot \ --output-dir="${build_dir}/aot" \ --target-platform=ios \ --target="${target_path}" \ --${build_mode} \ --ios-arch="${archs}" \ ${local_engine_flag} \ ${track_widget_creation_flag} \ ${extra_gen_snapshot_options_or_none}

Slide 17

Slide 17 text

# /packages/flutter_tools/bin/xcode_backend.sh local extra_gen_snapshot_options_or_none="" if [[ -n "$EXTRA_GEN_SNAPSHOT_OPTIONS" ]]; then extra_gen_snapshot_options_or_none="--extra-gen-snapshot-options=$EXTRA_GEN_SNAPSHOT_OPTIONS" fi ... RunCommand "${FLUTTER_ROOT}/bin/flutter" --suppress-analytics \ ${verbose_flag} \ build aot \ --output-dir="${build_dir}/aot" \ --target-platform=ios \ --target="${target_path}" \ --${build_mode} \ --ios-arch="${archs}" \ ${local_engine_flag} \ ${track_widget_creation_flag} \ ${extra_gen_snapshot_options_or_none}

Slide 18

Slide 18 text

xcode_backend.sh ͱ͸ʁ Build PhaseͷRun ScriptͰ࢖ΘΕ͍ͯΔεΫϦϓτ Xcode͔Β΋Dartίʔυ͕build͞ΕΔͷ͸͜Εͷ͓͔͛

Slide 19

Slide 19 text

(୤ઢ2) طଘΞϓϦʹFlutterΛಋೖ͢Δ࣌͸ xcode_backend.sh embed Add2AppϘʔυ্Ͱઈࢍ։ൃத

Slide 20

Slide 20 text

͜ΕͰϏϧυ͢Ε͹ ೉ಡԽ׬ྃʂ Χϯλϯʂ

Slide 21

Slide 21 text

೉ಡԽͷ֬ೝํ๏ʁ

Slide 22

Slide 22 text

App.frameworkΛ֬ೝ͢Δ $ strings build/ios/Release-iphoneos/Runner.app/Frameworks/App.framework/App ... get:_vxa@7048458x get:_aLa@9040228x get:_DLa@7048458x ...

Slide 23

Slide 23 text

೉ಡԽͷલޙͰൺֱ before get:_count@7048458 get:_onData@9040228 get:_isSubscribed@7048458 after get:_vxa@7048458x get:_aLa@9040228x get:_DLa@7048458x

Slide 24

Slide 24 text

Dartίʔυ͕೉ಡԽ͞Εͨ

Slide 25

Slide 25 text

...ϦϦʔεޙͷ͋Δ೔

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

SentryͷΤϥʔϨϙʔτ΋ ೉ಡԽ͞ΕͯΔ

Slide 28

Slide 28 text

೉ಡԽલͷΤϥʔϨϙʔτ

Slide 29

Slide 29 text

։ൃத͸ؾ͔ͮͳ͔ͬͨ

Slide 30

Slide 30 text

೉ಡԽͷલޙͰൺֱ before main.dart in SampleApp.build at line 48 after SEd in bZ.opa at line 48

Slide 31

Slide 31 text

ࣗ෼΋ಡΊͳ͍

Slide 32

Slide 32 text

ϦϦʔεࡁΞϓϦͷ Τϥʔ΋ݟ͍ͨ

Slide 33

Slide 33 text

mapϑΝΠϧΛग़ྗ͢Δ ઌ΄ͲͷυΩϡϝϯτʹ͋ͬͨઃఆ EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate mapϑΝΠϧΛग़ྗ͢ΔઃఆΛ௥Ճ EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate, ɹ --save-obfuscation-map=ios_dart_symbols_${FLUTTER_BUILD_NUMBER}.json

Slide 34

Slide 34 text

ग़ྗ͞ΕͨmapϑΝΠϧ $ cat ios_dart_symbols_5.json ... "_BuildJsonListener","_Gf", "CustomSymbolRenderer","cs", "devicePixelRatio","saa" ... ͜ΕΛࢀর͢Ε͹ಡΊΔ !

Slide 35

Slide 35 text

աڈʹϦϦʔεͨ͠ΞϓϦͷmapϑΝΠϧʁ ࢼͨ͠ͱ͜Ζɺ ੜ੒ݩͷίʔυ͕ಉ͡Ͱ͋Ε͹map΋ಉ͡ʹͳͬͨ

Slide 36

Slide 36 text

·ͱΊ

Slide 37

Slide 37 text

·ͱΊ • FlutterͩͱiOSͰ΋Dartίʔυͷ೉ಡԽ࡞ۀ͕͋Δ • stringsίϚϯυͰνΣοΫ͢Δͷָ͕ • mapϑΝΠϧ΋ग़ྗ͓ͯ͘͠ͱSentryղಡʹ࢖͑Δ # before main.dart in SampleApp.build at line 48 # after SEd in bZ.opa at line 48

Slide 38

Slide 38 text

Έ͓εΠονɺੋඇ͝ར༻͍ͩ͘͞

Slide 39

Slide 39 text

Thanks