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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
2
720
AndroidアプリのAI実装をAndroidifyで学ぶ ー Google公式サンプルによる体験と実装 ー
takahirom
0
150
AIエージェントによるテストフレームワーク Arbigent
takahirom
0
1.1k
Google の LLM ライブラリ を Android アプリで 使うには?
takahirom
1
2.2k
Robolectric Native Graphics and Roborazzi
takahirom
1
2.3k
Androidアプリで安定して動作させ継続的に開発するために設計の原則を利用して開発した話
takahirom
3
1.5k
Android Tools & Performance
takahirom
1
1.2k
Jetpack Compose State Practices
takahirom
1
1.5k
Inside Jetpack Compose
takahirom
1
1.1k
Other Decks in Programming
See All in Programming
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
230
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
120
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
200
AIが無かった頃の素敵な出会いの話
codmoninc
1
240
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
150
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.3k
テーブルをDELETEした
yuzneri
0
110
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
290
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
150
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.6k
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
610
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
760
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
660
Docker and Python
trallard
47
4k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
350
Done Done
chrislema
186
16k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
270
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
460
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
780
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.9k
Optimising Largest Contentful Paint
csswizardry
37
3.8k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
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 תה