Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コードを変更せずに デバッグメニューで Androidアプリの動作を変更する
Search
takahirom
December 08, 2017
Programming
270
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
AndroidアプリのAI実装をAndroidifyで学ぶ ー Google公式サンプルによる体験と実装 ー
takahirom
0
140
AIエージェントによるテストフレームワーク Arbigent
takahirom
0
1k
Google の LLM ライブラリ を Android アプリで 使うには?
takahirom
1
2.1k
Robolectric Native Graphics and Roborazzi
takahirom
1
2.3k
Androidアプリで安定して動作させ継続的に開発するために設計の原則を利用して開発した話
takahirom
3
1.4k
Android Tools & Performance
takahirom
1
1.2k
Jetpack Compose State Practices
takahirom
1
1.5k
Inside Jetpack Compose
takahirom
1
1.1k
What’s new in Android Jetpack and Tools
takahirom
0
430
Other Decks in Programming
See All in Programming
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.3k
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
360
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
720
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
270
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
210
技術的負債解消で開発者の未来を開く- AIの力でコード刷新
kmd2kmd
0
110
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
180
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.3k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
400
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
250
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
310
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
150
Featured
See All Featured
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
200
Discover your Explorer Soul
emna__ayadi
2
1.1k
Statistics for Hackers
jakevdp
799
230k
Building AI with AI
inesmontani
PRO
1
1.1k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
360
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
370
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
For a Future-Friendly Web
brad_frost
183
10k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Deep Space Network (abreviated)
tonyrice
0
210
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 תה