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
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
870
AndroidアプリのAI実装をAndroidifyで学ぶ ー Google公式サンプルによる体験と実装 ー
takahirom
0
160
AIエージェントによるテストフレームワーク Arbigent
takahirom
0
1.1k
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
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.9k
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
2
1.5k
信頼性の目標を誰も求めてない
shubox
0
490
Oxlintはいいぞ(続)
yug1224
1
550
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
380
XHTMLが残したもの
yosuke_furukawa
PRO
1
410
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
270
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
100
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
400
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
110
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
630
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
GraphQLとの向き合い方2022年版
quramy
50
15k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
230
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.6k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
260
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Agile that works and the tools we love
rasmusluckow
331
22k
Paper Plane
katiecoart
PRO
2
53k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Building a Scalable Design System with Sketch
lauravandoore
463
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 תה