Flutterアプリの難読化とエラーレポート(iOS)
by
Hiroki Matsue
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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
iOSDartίʔυ෦͕ ಡԽͷର
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