Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
コードを変更せずに デバッグメニューで Androidアプリの動作を変更する
Search
takahirom
December 08, 2017
Programming
280
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
コードを変更せずに デバッグメニューで Androidアプリの動作を変更する
takahirom
December 08, 2017
More Decks by takahirom
See All by takahirom
AIエージェントで 変わるAndroid開発環境
takahirom
3
1k
AndroidアプリのAI実装をAndroidifyで学ぶ ー Google公式サンプルによる体験と実装 ー
takahirom
0
170
AIエージェントによるテストフレームワーク Arbigent
takahirom
0
1.2k
Google の LLM ライブラリ を Android アプリで 使うには?
takahirom
1
2.2k
Robolectric Native Graphics and Roborazzi
takahirom
1
2.4k
Androidアプリで安定して動作させ継続的に開発するために設計の原則を利用して開発した話
takahirom
3
1.5k
Android Tools & Performance
takahirom
1
1.3k
Jetpack Compose State Practices
takahirom
1
1.5k
Inside Jetpack Compose
takahirom
1
1.1k
Other Decks in Programming
See All in Programming
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
140
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
33k
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
AmebaブログはKMPから卒業します
kmars0605
0
200
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
1.1k
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
残高管理から台帳サービスへの進化
artoy
1
200
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
230
ActionController meets Protocol Buffers
sorah
0
560
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
パスワード再設定メールのURLについて知っておこう
uyuki234
0
160
Featured
See All Featured
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
460
Writing Fast Ruby
sferik
630
63k
Building AI with AI
inesmontani
PRO
1
1.3k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.3k
It's Worth the Effort
3n
188
29k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
260
Side Projects
sachag
456
43k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
520
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
410
Paper Plane (Part 1)
katiecoart
PRO
2
12k
How to Think Like a Performance Engineer
csswizardry
28
2.9k
Transcript
؝٦س㢌刿ׇ׆ח رغحًؚصُ٦ד "OESPJE،فٔך⹛⡲㢌刿ׅ UBLBIJSPN
˖ "OESPJEָ㥨ֹ ˖ UBLBIJSPNהְֲせד 2JJUBהַ剅ְגְךד ״׃ֶֻ격ְ׃תׅ 荈䊹稱➜
˖ "#ذأزך"#ⴖ剏ְִ ˖ ח⳿זְت؎،ؚٗرغحؚ⚥כ嫣㔐⳿׃ְ ˖ رغحؚ⚥ח؟٦غ٦橆㞮ⴖ剏ְִ ˖ זוזו ،فٔךرغحؚװ2"ח״ ذأز⚥կկ
˖ رغحؚ⚥חرغحؚ׃װְׅ堣腉ًصُ٦ח׃ ךկ ˖ رغحؚ⚥חֽ鸐濼זו⳿׃גְֶגծ ةحفׅהرغحًؚصُ٦ָ⳿״ֲח׃גծ 㢌刿דֹ״ֲח׃גرغحؚ⡲噟⸬桦涸ח ׅ رغحًؚصُ٦
if (isShowTutorialTiming()) { showTutorial() } fun isShowTutorialTiming(): Boolean { //
࣍ͷλΠϛϯά·Ͱදࣔ͠ͳ͍ if (System.currentTimeMillis() < pref.getNextTutorialtiming()) { return false; } // 3ճ͔͠දࣔ͠ͳ͍ if (3 <= pref.getTutorialCount()) { return false; } return true; } ثُ٦زٔ،ٕ䌢ח邌爙׃ְ 儗וֲ׃תַׅ JT4IPX5VUPSJBM5JNJOHדUSVF鵤׃ְ
pref.setNextTutorialtiming(currentMills + 100000) pref.setTutorialCount(0) رغحًؚصُ٦ⰻ ❌㔐׃ַ邌爙דֹזְ
if (isShowTutorialTiming()) { showTutorial() } fun isShowTutorialTiming(): Boolean { //
࣍ͷλΠϛϯά·Ͱදࣔ͠ͳ͍ if (System.currentTimeMillis() < pref.getNextTutorialtiming()) { return false; } // 3ճ͔͠දࣔ͠ͳ͍ if (3 <= pref.getTutorialCount()) { return false; } return true; } ؝٦س湫ׅ
if (isShowTutorialTiming()) { showTutorial() } fun isShowTutorialTiming(): Boolean { if
(pref.isAlwaysShowTutorialTiming()) { return true; } // ࣍ͷλΠϛϯά·Ͱදࣔ͠ͳ͍ if (System.currentTimeMillis() < pref.getNextTutorialtiming()) { return false; } // 3ճ͔͠දࣔ͠ͳ͍ if (3 <= pref.getTutorialCount()) { return false; } return true; } ؝٦س湫ׅ ❌ٔٔ٦أתד ؝٦سָⰅג׃תֲ
if (isShowTutorialTiming()) { showTutorial() } } fun isShowTutorialTiming(): Boolean {
if (BuildConfig.DEBUG) { if (pref.isAlwaysShowTutorialTiming()) { return true; } } // ࣍ͷλΠϛϯά·Ͱදࣔ͠ͳ͍ if (System.currentTimeMillis() < pref.getNextTutorialtiming()) { return false; } // 3ճ͔͠දࣔ͠ͳ͍ if (3 <= pref.getTutorialCount()) { return false; } return true; } ؝٦س湫ׅ ❌醱꧟ז؝٦سָ فٗتؙءّٝח
ΦϒδΣΫτࢦͰ͏·͘Ͱ͖ͳ͍ಛʢΫϥεؒ Λԣஅ (cross-cutting) ͢ΔΑ͏ͳػೳʣΛʮΞεϖΫτʯ ͱΈͳ͠ɺΞεϖΫτهड़ݴޠΛ͍ͪͯͯ͠هड़͢ Δ͜ͱ (WikipediaΑΓ) ،ألؙز䭷ぢفؚٗٓىؚٝ
@Aspect public class AspectExample { @Before("execution(* on*(..))") public void before()
{ System.out.println("before !!"); } } "TQFDU+ ֽֿדPOד㨣תًاحسָㄎל儗ח ؚٗ⳿ֿׅהָ⳿勻
@Around("execution(boolean com...MainActivity.isShowTutorialTiming(..))") public boolean isShowTutorialDebug(ProceedingJoinPoint jp) { return true; }
"TQFDU+⢪ג ⭕ֽֿדثُ٦زٔ،ٕ⳿ׇ ⭕EFCVHؿٕؓتח縧ֽלرغحؚ儗ך黝䘔דֹ
"TQFDU+⢪ג @Around("execution(boolean com...MainActivity.isShowTutorialTiming(..))") public boolean isShowTutorialDebug(ProceedingJoinPoint jp) { return true;
} !"SPVOEדJT4IPX5VUPSJBM5JNJOHך䖓חⳢ椚㙵鴥 ֿֿדכًاحسך鵤⦼חUSVF鵤׃גְ
@Around("execution(boolean com...MainActivity.isShowTutorialTiming(..))") public boolean isShowTutorialDebug(ProceedingJoinPoint jp) { return true; }
"TQFDU+⢪ג ❌ًاحسせך㢌刿ד堣腉׃זֻז ❌رغحؚךןחֿ剅ֻ
@Around("execution(* *.*(..)) && @annotation(com...DebugReturn)”) public boolean isShowTutorialDebug(ProceedingJoinPoint jp) { return
true; } @DebugReturn fun isShowTutorialTiming(): Boolean { ... } "TQFDU+⢪ג 暴㹀ך،ظذ٦ءّٝאְגְًاحسד USVF鵤ׅ״ֲח
@Around("execution(* *.*(..)) && @annotation(com...DebugReturn)”) public boolean isShowTutorialDebug(ProceedingJoinPoint jp) { return
true; } @DebugReturn fun isShowTutorialTiming(): Boolean { ... } "TQFDU+⢪ג ❌ֿה䌢חUSVFחזג׃תֲ ❌رؿٕؓزך㹋鄲ָㄎן⳿ׇזְ
@Around("execution(* *.*(..)) && @annotation(com...DebugReturn)”) public Object debugReturnMethod(ProceedingJoinPoint jp) { //
ΞϊςʔγϣϯͷதͷҾ(key)Λऔಘ͢Δॲཧ ... final DebugSetting debugSetting = DebugSetting.getInstance(); if (debugSetting.contains(key)) { return debugSetting.get(key); } return jp.proceed(); } @DebugReturn(“tutorial”) fun isShowTutorialTiming(): Boolean { ... } "TQFDU+⢪ג
@Around("execution(* *.*(..)) && @annotation(com...DebugReturn)”) public Object debugReturnMethod(ProceedingJoinPoint jp) { //
ΞϊςʔγϣϯͷதͷҾ(key)Λऔಘ͢Δॲཧ ... final DebugSetting debugSetting = DebugSetting.getInstance(); if (debugSetting.contains(key)) { return debugSetting.get(key); } return jp.proceed(); } @DebugReturn(“tutorial”) fun isShowTutorialTiming(): Boolean { ... } "TQFDU+⢪ג ،ظذ٦ءّٝחLFZ床ׅ
@Around("execution(* *.*(..)) && @annotation(com...DebugReturn)”) public Object debugReturnMethod(ProceedingJoinPoint jp) { //
ΞϊςʔγϣϯͷதͷҾ(key)Λऔಘ͢Δॲཧ ... final DebugSetting debugSetting = DebugSetting.getInstance(); if (debugSetting.contains(key)) { return debugSetting.get(key); } return jp.proceed(); } "TQFDU+⢪ג ،ظذ٦ءָّٝאְًاحسךⳢ椚 ההךثُ٦زٔ،ٕⴻ㹀ٗآحؙ 㹋遤 1SFGFSFODFח⥂䭯׃גְ鏣㹀⢪ֲ
@Around("execution(* *.*(..)) && @annotation(com...DebugReturn)”) public Object debugReturnMethod(ProceedingJoinPoint jp) { //
ΞϊςʔγϣϯͷதͷҾ(key)Λऔಘ͢Δॲཧ ... final DebugSetting debugSetting = DebugSetting.getInstance(); if (debugSetting.contains(key)) { return debugSetting.get(key); } return jp.proceed(); } "TQFDU+⢪ג 鏣㹀⥂㶷׃גְֶגծ鏣㹀ָ֮ל⢪ְ זֽלծًاحسⰻך傀㶷ךⳢ椚遤ֲ
"TQFDU+⢪ג ❌"TQFDU+ך㼪Ⰵָ⦜
ٓ؎ـٓٔ⡲ת׃ IUUQTHJUIVCDPNUBLBIJSPNEFCVHBMUFS החַֻأة٦ָ妜׃ְדׅ
˖ رغحًؚصُ٦㹋鄲ׅ儗ח"TQFDU+⢪ֲהفٗتؙءّٝ ך؝٦س寅ׁ׆ח㹋鄲׃גְֽתׅկ ˖ 䩛鯪חװז%FCVH"MUFS⢪גגְֻׁկ 㹋鄲ה׃גכ ַז謬ְדׅ ˖ ⟃♴ךٔهآزٔأة٦׃גְֻׁկխ
IUUQTHJUIVCDPNUBLBIJSPNEFCVHBMUFS ˖ 2JJUBח֮ךד״׃ֶֻ격ְ׃תׅկ IUUQTRJJUBDPNUBLBIJSPNJUFNTFCCDGED תה