Share
Embed
ハマった時に役立つ通信系デバッグの話
DroidKaigi 2019 資料
実業務開発・運用中によくあるAPI/Webの問題か、アプリの問題か、を解決するための通信周りのデバッグ手法について詳しくお話します。
アジェンダ:
- WebAPIで問題があったときにどちらの不具合かを突き止める
- SSL通信を改ざんして期待値の確認
- WebViewアプリデバッグテクニック
- モックを使ったWebAPI動作確認手法
対象者:
Android/iOS開発の経験があり、実業務でTCP/IP通信周りで困ったことがある方。
M.Inomata
February 08, 2019
Transcript
66 slides
-
ழມɹॆԝ (͍ͷ·ͨɹΈͭͻΖ) Twitter: @ino2222 גࣜձࣾ tech vein ද ݉ σϕϩούʔ
େࡕͷAndroid/iOS/Web։ൃ͕ಘҙͳडୗγεςϜ։ൃձࣾͰ͢ɻ https://www.tech-vein.com/ ɹɹࣗݾհ -
ɹɹݸਓͷུྺ www.ecoop.net ͱ͍͏αΠτΛ2002͔ΒӡӦ͍ͯͯ͠ɺ GNU Make ͷެࣜυΩϡϝϯτΛ༁ͯ͠αΠτͰެ։ͯ͠·͢ɻ ओͳ։ൃܦྺɿ → [झຯ] WindowsΞϓϦ։ൃ(2000~2003)
& Perl CGI։ൃ(2001~2003) → [ձࣾһ] PHP։ൃ/αʔόӡ༻(2003~2012) ˍ Java։ൃ(FOMAΨϥέʔΞϓϦˍ JavaEE)(2005~2010) → [ձࣾһ/ىۀ] AndroidΞϓϦ։ൃ(2010~2013, 2018~ݱࡏ) → [ىۀ] iPhone ΞϓϦ։ൃத৺ʹ(2013~ݱࡏ) → [ڞಉݚڀ] Python Ͱ Deep Learning ݚڀ։ൃ(2016~ݱࡏ) -
www.ecoop.net ͱ͍͏αΠτΛ2002͔ΒӡӦ͍ͯͯ͠ɺ GNU Make ͷެࣜυΩϡϝϯτΛ༁ͯ͠αΠτͰެ։ͯ͠·͢ɻ ओͳ։ൃܦྺɿ → [झຯ] WindowsΞϓϦ։ൃ(2000~2003) &
Perl CGI։ൃ(2001~2003) → [ձࣾһ] PHP։ൃ/αʔόӡ༻(2003~2012) ˍ Java։ൃ(FOMAΨϥέʔΞϓϦˍ JavaEE)(2005~2010) → [ձࣾһ/ىۀ] AndroidΞϓϦ։ൃ(2010~2013, 2018~ݱࡏ) → [ىۀ] iPhone ΞϓϦ։ൃத৺ʹ(2013~ݱࡏ) → [ڞಉݚڀ] Python Ͱ Deep Learning ݚڀ։ൃ(2016~ݱࡏ) ɹɹݸਓͷུྺ ɿαʔόܦݧ ɿΫϥΠΞϯτ -
ͳͥ͜͏ͳΔͷ͔ʁ ௨৴·ΘΓཁҼ͕ଟ͍ͷͰɺݪҼͷಛఆ͕͍͠ɻ Android/iOS/Unity OSόʔδϣϯ ػछ ϑϨʔϜϫʔΫ ௨৴ϥΠϒϥϦͳͲʜ ిঢ়گ ܞଳجہɾ8J'Jઃఆ ϓϩόΠμ
44-ূ໌ॻɾೝূہ ͳͲʜ <ΫϥΠΞϯτ> <ͦͷଞ͍Ζ͍Ζ> <αʔό> 8FCαʔό %#αʔό %/4αʔό όονॲཧͳͲʜ -
௨৴पΓؔ͢Δͷ͕ଟ͍ͷͰʜ Webαʔό DNSαʔό ϩʔυόϥϯαʔ ܞଳి جہ ܞଳి Πϯλʔωοτ υϝΠϯϨδετϥ *41
ωοτϫʔΫ 8J'JϧʔλͳͲ ܞଳճઢͰͷଓ 8J'Jଓ αʔόଆωοτϫʔΫ "84 ($1ͳͲ Webαʔό DBαʔό ϑΝΠΞΥʔϧ -
Webαʔό DNSαʔό ϩʔυόϥϯαʔ ܞଳి جہ ܞଳి Πϯλʔωοτ υϝΠϯϨδετϥ *41 ωοτϫʔΫ
8J'JϧʔλͳͲ ܞଳճઢͰͷଓ 8J'Jଓ αʔόଆωοτϫʔΫ "84 ($1ͳͲ Webαʔό DBαʔό ϑΝΠΞΥʔϧ αʔό͕མͪͯΔͷ͔ʜ -
ΫϥΠΞϯτͷωοτ͕མͪͯΔͷ͔ɺͦΕͱΠϯλʔωοτͷ ܦ࿏ͷ్தͰམ͍ͪͯΔͷ͔͕Θ͔ΓͮΒ͍ɻ Webαʔό DNSαʔό ϩʔυόϥϯαʔ ܞଳి جہ ܞଳి Πϯλʔωοτ υϝΠϯϨδετϥ
*41 ωοτϫʔΫ 8J'JϧʔλͳͲ ܞଳճઢͰͷଓ 8J'Jଓ αʔόଆωοτϫʔΫ "84 ($1ͳͲ Webαʔό DBαʔό ϑΝΠΞΥʔϧ -
Webαʔό DNSαʔό ϩʔυόϥϯαʔ ܞଳి جہ ܞଳి Πϯλʔωοτ υϝΠϯϨδετϥ *41 ωοτϫʔΫ
8J'JϧʔλͳͲ ܞଳճઢͰͷଓ 8J'Jଓ αʔόଆωοτϫʔΫ "84 ($1ͳͲ Webαʔό DBαʔό ϑΝΠΞΥʔϧ ௨৴ڥͷτϥϒϧൃੜʂ Ͳ͜Ͱোɾ͕ى͖͍ͯΔ͔͕͔ΓͮΒ͍ɻා͍ɻ -
Webαʔό DNSαʔό ϩʔυόϥϯαʔ ܞଳి جہ ܞଳి Πϯλʔωοτ υϝΠϯϨδετϥ *41 ωοτϫʔΫ
8J'JϧʔλͳͲ ܞଳճઢͰͷଓ 8J'Jଓ αʔόଆωοτϫʔΫ "84 ($1ͳͲ Webαʔό DBαʔό ϑΝΠΞΥʔϧ Ͱେৎʂ ௨৴पΓɺͷΓ͚Λ͢Εා͘ͳ͍ʂ google.co.jp ಉ͡ܞଳͰ GooglFݟ͑ͯΔɻ ͱ͍͏͜ͱαʔόো͔ ! ! -
ΫϥΠΞϯτ ΞϓϦ Ͱमਖ਼͖͔͢Ͳ͏͔Λத৺ʹ֬ೝ͢Δɻ ʲओͳ֬ೝϙΠϯτʳ ɾϦΫΤετ͕ਖ਼͘͠ૹΕ͍ͯΔ͔ʁ ɾϨεϙϯεΛਖ਼͘͠ड͚औΕ͍ͯΔ͔ʁ ɾ௨৴ҟৗ࣌ʹਖ਼͘͠ΤϥʔॲཧͰ͖͍ͯΔ͔ʁ ΞϓϦ։ൃऀͱͯ͠ͷΓ͚ΔϙΠϯτ ʮਖ਼͘͠ʯͱɻ ɾ௨৴༷Ͳ͓Γʹૹड৴Ͱ͖͍ͯΔ
ɾى͜Γ͏ΔҟৗܥʹదʹରԠ͍ͯ͠Δ ɹʢϢʔβʹΤϥʔϝοηʔδΛग़͢ͳͲʣ -
"1*࣮ʹ͕ͳ͍͔ʁϖʔδ͕ϒϥβ্Ͱਖ਼͘͠ಈ࡞͍ͯ͠Δ͔ʁ ʲओͳ֬ೝϙΠϯτʳ ɾϦΫΤετΛਖ਼͘͠ड͚औΕ͍ͯΔ͔ʁ ɾϦΫΤετʹର͢ΔϨεϙϯεΛਖ਼͘͠ฦ͍ͤͯΔ͔ʁ ʲ8FCϑϩϯτ +4)5.- ͷՃ֬ೝϙΠϯτʳ ɾ+4͕ΫϥΠΞϯτ্ 8FC7JFXϒϥβ ͰΤϥʔແ͘ಈ͍͍ͯΔ͔ʁ
ɾ+4͕࣮ߦ͢ΔϦΫΤετɾϨεϙϯε͕ਖ਼͍͔͠ʁ 8FC "1*8FCϑϩϯτ ։ൃऀͱͯ͠Γ͍ͨΓ͚ϙΠϯτ -
खॱᶃྫ֎ͷৄࡉΛϩάʹग़͢ࣄ͔Β࢝ΊΔ 5$1*1ଓཱ֬ΤϥʔͳͲͷ)551ΤϥʔҎ֎ͷ௨৴Τϥʔɺ ྫ֎ ಛʹ*0&YDFQUJPOܥྻ ͷελοΫτϨʔεϝοηʔδ͕ॏཁʹͳΓ·͢ɻ ͨͱ͑ελοΫτϨʔεͷ಄ߦͱɺ͋Ε$BVTFECZͷߦΛݟΕཧ༝͕Θ ͔Δ߹͕݁ߏ͋Γ·͢ɻ java.net.ConnectException: Failed to
connect to example.com:93.184.216.34 at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:242) at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:160) at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java: 257) at ... Caused by: java.net.ConnectException: failed to connect to example.com:93.184.216.34 (port 443) after 10000ms: isConnected failed: ENETUNREACH (Network is unreachable) at ... -
)551εςʔλείʔυͱϝοηʔδ ɾ0,ʜαʔόͱͯ͠ɺਖ਼͍݁͠ՌΛฦ͍ͯ͠Δɻ ɾ#BE3FRVFTUʜϦΫΤετ͕Կ͔ؒҧ͍ͬͯͨɻ ɾ6OBVUIPSJ[FEʜະೝূঢ়ଶͰೝূ͕ඞཁͳϖʔδ 8FC"1* ʹΞΫη εͨ͠ɻ ɾ*OUFSOBM4FSWFS&SSPSʜ෦αʔόΤϥʔɻαʔόଆʹো͕ൃੜ͠ ͍ͯΔɻ ͳͲͳͲɻΒͳ͍εςʔλείʔυ͕ݱΕͨ࣌ɺ
XJLJQFEJBͷʮ)551εςʔλείʔυʯϖʔδ IUUQTHPPHMQS3' ͳͲ͕ ݟ͘͢ศརͰ͢ɻ ˞ਖ਼֬ͳ)551εςʔλείʔυ༷3'$Λࢀর -
0L)UUQͷ*OUFSDFQUPS 0L)UUQ*OUFSDFQUPSͱ͍͏ΠϯλʔϑΣΠεΛ ௨৴ͷಛఆλΠϛϯάʹࠩ͠ࠐΜͰɺͦͷ࣌ͷ3FRVFTU3FTQPOTFΦϒδΣΫ τΛऔಘͯ͠ɺϩάදࣔ͢Δ͜ͱ͕Ͱ͖·͢ɻ ʲ*OUFSDFQUPSͷྫʳ ެࣜͰఏڙ͍ͯ͠ΔΫϥε)UUQ-PHHJOH*OUFSDFQUPS $VSMϩάॻࣜ൛$VSM)UUQ-PHHJOH*OUFSDFQUPSIUUQTHJUIVCDPNUFDIWFJOPLIUUQDVSMMPHHJOH ։ൃதιʔε ௨৴ϥΠϒϥϦ Πϯλʔωοτ
.addNetworkInterceptor() .addInterceptor() Ωϟογϡ "OESPJE04 ϑϨʔϜϫʔΫ -
"OESPJEͷ֎Ͱࢹ͢Δ͜ͱͷϝϦοτ ʮ8FCଆ͕ਖ਼͍͠ಈ͖Λ͍ͯ͠Δ͔Ͳ͏͔ʁʯΛ֬ೝ͢Δͱ͖ ΑΓ"1*ʹ͍ۙϦΫΤετɾϨεϙϯεΛݟΔ΄͏͕ɺ ΑΓಧ͘σʔλʹۙ͘ͳΔͷͰɺΑΓؒҧ͍͕ى͜Γʹ͘͘ͳΓ·͢ɻ ։ൃதιʔε ௨৴ϥΠϒϥϦ Πϯλʔωοτ "OESPJE04 ϑϨʔϜϫʔΫ 8FCαʔό
αʔόଆωοτϫʔΫ ͜͜ͰมԽ͍ͯ͠Δ͔ Ωϟογϡɺ04ͷόάͳͲ ! ͜͜ͰมԽ͍ͯ͠Δ͔ ΩϟογϡɺϔομՃͳͲ ! "1*͕ड͚औΔσʔλʹ͍ۙ " -
͓͔ͬͯͳ͍ͱ͍͚ͳ͍ɺ҉߸Խ͍ͯ͠Δ44-௨৴͕ಡΊΔΈ 44- )5514 ௨৴ʹ͏ೝূہ $" ͱͯ͠ϓϩΩγαʔόΛొͯ͠ɺ αʔόɾΫϥΠΞϯτͷؒͰ҉߸ԽΛҰղআ͢Δ͜ͱͰ࣮ݱ͍ͯ͠·͢ɻ ᶆຊαʔόͷ ຊͷ44-ূ໌ॻͰ҉߸Խ ᶆϓϩΩγαʔό͕࡞ͬͨ
Ծͷ44-ূ໌ॻͰ҉߸Խ ᶅೝূہΠϯετʔϧ ᶃೝূہ $" ʹͳΔ͔Β ࡞ͬͨূ໌ॻड͚ೖΕͯΑ ᶄΦοέʔ -
ʲิ̎ʳ"OESPJEͷূ໌ॻِରࡦͷӨڹ ˞ͳΜ͔͍Ζ͍Ζॻ͍ͯ·͕͢ɺΑ͔͘Βͳ͚Εಡ·ͳͯ͘େৎͰ͢ɻ ΞϓϦଆͰِূ໌ॻʹΑΔ౪ௌ .*5.߈ܸ Λࢭ͢ΔͨΊʹ $FSUJpDBUF1JOOJOHͳͲͷํ๏͕͋Γ·͢ɻ ࢀߟϖʔδɿ)5514͓Αͼ44-ʹΑΔηΩϡϦςΟ"OESPJE%FWFMPQFST IUUQTEFWFMPQFSBOESPJEDPNUSBJOJOHBSUJDMFTTFDVSJUZTTM IMKB ͜ΕΒΛ࣮͍ͯ͠Δͱ$IBSMFTɺ.*5.1SPYZͳͲͷϓϩΩγܕࢹπʔϧ͔Β
44-௨৴͕ಡΊͳ͘ͳΓ·͢ͷͰɺඞཁʹԠͯ͡ ηΩϡϦςΟͱ૬ஊͰ ։ൃதͷ ΈॲཧΛແޮԽ͢ΔͳͲͷճආରԠΛߦͬͯԼ͍͞ɻ -
DVSMίϚϯυͱͯ͠ίϐʔͯ͠࠶ݱ͢Δ εϚʔτϑΥϯͷ௨৴ΛDVSMίϚϯυͱͯ͠ίϐʔͰ͖ɺ λʔϛφϧͰ࣮ߦ͢Εಉ݁͡ՌΛ࠶ݱ͢Δ͜ͱ͕Ͱ͖·͢ɻ ϦΫΤετ༰͕໌നͳͷͰɺ"1*୲ऀͷෆ۩߹ใࠂ࣌ʹศརͰ͢ɻ DVSM))PTUXXXHPPHMFDPN)$PPLJF) VTFSBHFOU.P[JMMB -JOVY"OESPJE" "QQMF8FC,JU)BDDFQUUFYUIUNM BQQMJDBUJPO
YIUNM YNM BQQMJDBUJPOYNMR JNBHFXFCQ JNBHF BQOH R BQQMJDBUJPOTJHOFEFYDIBOHFWC) BDDFQUMBOHVBHFKB+1 KBR FO64R FOR DPNQSFTTFEIUUQTXXXHPPHMFDPNTFBSDI RIPHFPRIPHFBRT -
ʲ͓·͚ʳతผɺ͜͏͍͏࣌ͷ֬ೝσόοάʹ͜ͷಓ۩Λ͓͏Ϧετ ɾ8FC7JFXͷಈ͖͕ո͍͠ɻ ɹˠԿͱ͋Ε$ISPNF։ൃίϯιʔϧɻ+4ͷϒϨʔΫϙΠϯτσόοάͭͭ͠ɺωοτϫʔΫϩάΛݟΔɻ ɹˠ8FC7JFX֎ͷ"1*ͳͲͷӨڹΛड͚͍ͯͦ͏ͳΒɺ$IBSMFTΛซ༻͢Δɻ ɾࣗͰ࣮ͨ͠"1*ͷಈ͖͕ո͍͠ɻ ɹˠ0L)551ͳΒɺ*OUFSDFQUPSͰϩάΛྲྀͭͭ͠ɺ"OESPJE4UVEJPͷωοτϫʔΫϓϩϑΝΠϥͰσόοά͢ Δɻ ɹˠଞͷӨڹ͕͋Γͦ͏ͩͬͨΓɺDVSMͰίϐʔͨ͘͠ͳͬͨΓɺ$IBSMFTͷػೳ͕ඞཁͳΒ$IBSMFTΛ͏ɻ ɹˠ"1*ͷෆ۩߹Λٙ͏લʹɺ"1*ΫϥΠΞϯτπʔϧDVSMΛͬͯɺਖ਼͍͠ϦΫΤετΛૹͬͯ֬ೝ͢Δ ɾո͍͠ͱ͜Ζ͕Θ͔Βͳ͍͚Ͳɺͱʹ͔͘௨৴पΓ͕͓͔͍͠ɻ
ɹˠ"OESPJE4UVEJPͷϓϩϑΝΠϥʹ͔͚ͯܰ͘ݟͯΈΔɻ ɹˠΘ͔Βͳͦ͏ͳΒɺ͙͢Γ্͛ͯ$IBSMFTΛ͏ɻ ͜ΕͰηογϣϯऴΘΓͰ͢ɻ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ IUUQTNJSVEFTJUF