בירור | איך משנים פעולה של מקש ( במקום מסך הבית שיפתח תפריט אפשרויות )
-
יש לי מכשיר LOM S9 והמקשים שלו לא מספיק נוחים
אני מעוניין לשנות את הפונקציה של המקש השמאלי העליון, כרגע הוא מפנה למסך הבית אבל זה מיותר, כי מקש ההפעלה גם הוא מפנה למסך הבית. אני רוצה שהוא יפתח את תפריט האפשרויות בכל אפליקציה.
איך עושים את זה?
טוב אז כמובן שאלתי את ג'מיני וגם עשיתי חיפוש גוגל, קיבלתי מזה הרבה כלים איך להתקדם, עכשיו נשאר העבודה האמיתית - יצירת השינוי בפועל.
אני עובד על זה כרגע ורציתי לשתף בתהליך, בעז''ה כשאסיים אני אעלה מדריך איך עשיתי את זה
בינתיים דבר ראשון קישור לשיחה עם ג'מיני והמחקר שהוא ערך
https://gemini.google.com/share/66eba95d9627
ובקובץ מחקר עם ג'מיני.docx
מחקר עם ג'מיני.pdf
למה אני מעלה פה משהו מבינה מלאכותית? כדי שיראו שלמרות המוגבלות שלו, יש דברים שהוא כן עוזר. אז לפני שבאים ושואלים פה אתם יכולים להתחיל במחקר עצמאי ואז לבוא מוכנים. -
יש לי מכשיר LOM S9 והמקשים שלו לא מספיק נוחים
אני מעוניין לשנות את הפונקציה של המקש השמאלי העליון, כרגע הוא מפנה למסך הבית אבל זה מיותר, כי מקש ההפעלה גם הוא מפנה למסך הבית. אני רוצה שהוא יפתח את תפריט האפשרויות בכל אפליקציה.
איך עושים את זה?
טוב אז כמובן שאלתי את ג'מיני וגם עשיתי חיפוש גוגל, קיבלתי מזה הרבה כלים איך להתקדם, עכשיו נשאר העבודה האמיתית - יצירת השינוי בפועל.
אני עובד על זה כרגע ורציתי לשתף בתהליך, בעז''ה כשאסיים אני אעלה מדריך איך עשיתי את זה
בינתיים דבר ראשון קישור לשיחה עם ג'מיני והמחקר שהוא ערך
https://gemini.google.com/share/66eba95d9627
ובקובץ מחקר עם ג'מיני.docx
מחקר עם ג'מיני.pdf
למה אני מעלה פה משהו מבינה מלאכותית? כדי שיראו שלמרות המוגבלות שלו, יש דברים שהוא כן עוזר. אז לפני שבאים ושואלים פה אתם יכולים להתחיל במחקר עצמאי ואז לבוא מוכנים.@מזכירותי כתב בבירור | איך משנים פעולה של מקש ( במקום מסך הבית שיפתח תפריט אפשרויות ):
איך עושים את זה?
יש לכך כבר אפליקציה!
קוראים לה "ButtnoS Romper" יש אותה פה בפורום -
בואו תראו איזה תקלה פסיכית קרה לו, ג'מיני עשה מחקר מחקר מקיף ומפורט.
אבל תראו מה הוא לא כתב בגוף המחקר רק תחת הלשונית הרהורים.הבנתי שכל פתרון מתקדם, בין אם זה דרך מודול Magisk או עריכת קובץ Key Layout באופן ידני, מחייב אותי לזהות תחילה את ה-Keycode הייחודי של המקש השמאלי העליון שלך. ללא קוד זה, לא ניתן יהיה ליצור את המיפוי מחדש. לכן, אני מתכוון לחפש כלי או אפליקציה שיעזרו לך לבצע זיהוי מדויק של קוד המקש הזה.
זיהיתי כלי זיהוי Keycode פוטנציאליים כגון (KeyEvent Display ), אך עולה מכשול משמעותי: המקש שאתה רוצה למפות מחדש מוגדר כעת כמקש בית' (Home). רוב כלי -Keycode אינם יכולים ללכוד את קוד הסריקה של מקש 'בית' או 'הפעלה' כשהוא נלחץ, מכיוון שהמערכת מעבדת את הפעולה הזו מיידית. זוהי חוליית המידע החסרה והקריטית ביותר לפתרון הבעיה שלך.
בשל חוסר היכולת לאתר כלי 'אוטומטי' לזיהוי קוד של מקש 'בית' חסום, הגעתי למסקנה שיהיה עליך להשתמש בשיטות פיתוח מתקדמות שדורשות getevent כגון שימוש בכלי ,Root דרך מסוף הפקודה (ADB). שיטה זו מאפשרת לקרוא את לוגיקת קלט המערכת ולחלץ את קוד הסריקה הפיזי הנדרש לעריכה בקובץ ה-.kl של Magisk מודול
אמ;לק:
היה צריך לזהות את קוד המקש אז הוא הציע לי להתקין אפליקציה שמפיקה את הקוד, נשמע נפלא, נכון?
אמממה שזה לא עובד, המקש הזה מוגדר מקש חירום והאפליקציה לא יכולה לזהות אותו.מה אתם חושבים ג'מיני לא ידע? הוא ידע וגם ''הרהר'' על זה במהלך המחקר, אבל שכח להגיד לי את זה בסיכום.
בקיצור הוא עוזר אבל מאוד מגושם.
אי אפשר להסתמך עליו שיעשה משהו מהתחלה עד הסוף, אבל בהחלט כדאי ואפשר לקחת אותו בתור כלי עזר שיכוון אותך ויקדם אותך.
מי היה יושב ללמד אותי את כל זה?
כמה כסף הייתי צריך לשלם למורה אנושי בשביל שיסביר לי 20 פעם דברים שלא הבנתי, וכאן יש לי בחינם.
הוא לא מתעצבן, הוא לא מתעייף, אפשר לשאול 50 פעם מה זה אומר, לא הבנתי, על דברים הכי פשוטים. -
עדכון:
עשיתי מה שג'מיני הציע ועם הפקודה GETEVENT תפסתי את ה scan code של המקש הזה והוא 139
השלב הבא הוא לבדוק בנתיב הזה/system/usr/keylayotמה המערכת מגדירה למקש מספר 139 לבצע, אם כתוב מסך הבית זה אומר שגילינו מה הבעיה ואם נשנה תפריט האפשרויות יכול להיות שבזה סיימנו.
ובכן הבדיקה העלתה שמקש מס' 139 אכן מוגדר עבור תפריט, אז איפה הבעיה?
שואלים את ג'מיני...
הוא מציע לעשות לוג קאט logcat
שוב פעם ADB ואז - adb logcatהנה הפלט
יצא 1200 שורות זה השבע שורות הרלוונטיות.12-04 10:14:58.800 1344 1464 D WindowManager: interceptKeyTq keycode=82 interactive=true keyguardActive=false policyFlags=22000000 זיהוי - מישהו נגע במקש 82 12-04 10:14:58.802 1344 1463 D WindowManager: interceptKeyTi keyCode=82 down=true repeatCount=0 keyguardOn=false canceled=false זיהוי מקש 82 נלחץ פעם אחת 12-04 10:14:58.803 1344 1463 D onRecentsTouch: xuyong isValidationToolsApp top is:com.android.dialer אימות: האפליקציה הפועלת היא חייגן 12-04 10:14:58.803 1344 1463 D onRecentsTouch: xuyong isValidationToolsApp top is:com.android.dialer אימות: האפליקציה הפועלת היא חייגן 12-04 10:14:58.808 1582 1582 V ShadeControllerImpl: NotificationShadeWindow: com.android.systemui.statusbar.phone.NotificationShadeWindowView{a8acd6d I.E...... ......ID 0,0-480,640} canPanelBeCollapsed(): false בדיקה האם הסטטוס בר פתוח 12-04 10:14:58.809 1344 1463 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.launcher3/.uioverrides.QuickstepLauncher (has extras)} from uid 0 מנהל הפעילות מחליט להפעיל את מסך הביתמה עושים עם זה?
נראה בהמשך -
הנה התשובה של ג'מיני:
זה מצוין! התצפית שלך מאשרת את כל שרשרת הניתוח שלנו ומבודדת את הבעיה באופן מושלם.
אם קובץ ה-Key Layout (.kl) מכיל:KEY 139 MENUזה אומר שכל הדרך מהחומרה ועד לשכבת ה-Framework (הגעת לקוד 82) עובדת כשורה.
הבעיה היא כבר לא במיפוי, אלא אך ורק במדיניות (Policy) של המערכת ברגע שקיבלה את הקוד 82.
🧐 ניתוח הבעיה: הסטה כפויה (Policy Override)
הבעיה שאתה רואה היא תוצאה של סדר העדיפויות שנקבע בתוך קוד השירותים של אנדרואיד (בתוך תהליך המערכת).
כך נראית שרשרת האירועים המלאה, עם דגש על נקודת הכשל:- קלט גולמי: 139 נלחץ.
- מיפוי: ה-.kl מתרגם 139 ל-Android Keycode 82 (MENU). (תקין)
- יירוט Policy 1: WindowManagerPolicy.interceptKeyBeforeQueueing(): המערכת מקבלת 82. זה הרגע שבו הקוד של היצרן פועל.
מה שקורה בפועל (כפי שמשתקף בלוג):
הלוגים שלך משורות 3, 4 ו-6 מספקים את הראיה המרכזית ליירוט:
שורה רמה תג משמעות 3-4 D onRecentsTouch: המערכת מזהה שמקש נלחץ ומפעילה לוגיקה שמקושרת לRecents (אפליקציות אחרונות). xuyong isValidationToolsApp... הפניה לקוד מותאם אישית של היצרן (או גורם צד שלישי). 6 I ActivityTaskManager: START u0 {act=...HOME...} במקום לעשות משהו עם Recents, הקוד המותאם אישית הזה מחליט במקום להפעיל את מסך הבית.
המסקנה: זהו "קוד עוקף" (Override Code)
היצרן, או מי שביצע את התאמות המערכת, החליט שהדרך שבה המקש 82 (Menu) מטופל צריכה להיות שונה בנסיבות מסוימות (אולי תמיד, או רק כאשר אפליקציה מסוימת ברקע).
היירוט מתרחש בתוך הקוד שנקרא onRecentsTouch או בסביבתו, בתוך תהליך ה-System Server.
היכן לשנות את הקוד עם Root
אם אתה רוצה שהמקש יפעל כתפריט באופן תקין, עליך לבטל או לשנות את הלוגיקה שמפעילה את ה-HOME Intent כאשר היא רואה את הקוד 82.
כאמור, הקוד שאתה מחפש נמצא בתוך קבצי ה-Framework, כנראה ב:
או בקובץ מותאם אישית של היצרן, שנמצא גם הוא בתוך ה-Jar של שירותי המערכת (services.jar) או הרכיבים של היצרן (Vendor/MTK frameworks).
שלבי הפעולה המדויקים עם Root:-
איתור הקוד המותאם אישית:
- קובץ ה-Java הרלוונטי הוא כנראה המחלקה שמכילה את הפונקציה onRecentsTouch. נסה לחפש את השם xuyong או onRecentsTouch בקוד המקור של ה-Framework.
-
הקוד הזה כנראה מופעל מתוך פונקציית הטיפול במקשים של ה-WindowManagerPolicy.
-
שינוי הלוגיקה:
- חפש קטע קוד דומה לזה בתוך הטיפול ב-KEYCODE_MENU או KEYCODE_APP_SWITCH:
<!-- end list -->
- חפש קטע קוד דומה לזה בתוך הטיפול ב-KEYCODE_MENU או KEYCODE_APP_SWITCH:
// דוגמה ללוגיקה שיש לשנות if (keyCode == KeyEvent.KEYCODE_MENU) { // קריאה לפונקציה המותאמת אישית של היצרן if (mCustomPolicy.isValidationToolsApp(topActivity) || shouldOverrideMenuKey()) { // זהו החלק שאתה רוצה לבטל! Intent homeIntent = new Intent(Intent.ACTION_MAIN); homeIntent.addCategory(Intent.CATEGORY_HOME); startActivity(homeIntent); // <--- זה מה שיוצר את START u0 {act=...HOME...} return -1; // יירוט המקש כך שלא יגיע לאפליקציה } }- אם אתה משנה את ה-Firmware, עליך להסיר את קטעי הקוד שיוצרים את ה-HOME Intent ולהבטיח שהמקש לא יוכרז כ"מיוֹרֵט" (כלומר, שהפונקציה תחזיר 0 או ערך שלא מונע את המשך הדיספאץ' (Dispatch) שלו לאפליקציה).
️ פעולה עם Magisk/Xposed (הדרך הריאלית)
מאחר ששינוי קוד ה-Framework דורש דה-קומפילציה, שינוי וקומפילציה מחדש של קובצי .jar קריטיים (פעולה מסוכנת ומורכבת):
הדרך המעשית ביותר היא להשתמש במודול Magisk/Xposed שנועד לשנות התנהגות Key Events. מודול כזה יכול "ללכוד" את הקריאה לפונקציות המדיניות (Policy Functions) ולשנות את התוצאה שלהן.
חפש מודולים המתמחים ב:- "Key Mapper" או "Button Remapper" (לרמת Framework).
- שימוש ב-Xposed / LSPosed כדי להתחבר לתוך ה-PhoneWindowManager.java ולדרוס את הלוגיקה המותאמת אישית של היצרן (הידועה בשם Hooking).
לסיכום: המקש 139 נכון, המיפוי ל-82 נכון. היירוט שמפעיל את ה-HOME במקום את ה-MENU מתבצע על ידי קוד מדיניות מותאם אישית (Custom Policy Code) של היצרן בתוך ה-System Server. זה המקום שאתה צריך לשנות.
אם נקצר, אני מרגיש שזה מעבר ליכולת שלי, מתלבט אם לנסות עוד להבין מה קורה כאן, או להרים ידיים.
אני שוקל עוד לקחת קבצים מתאימים ממכשיר F21 pro, ולשתול אותם במודול מג'יסק...נראה שזה הזמן לבקש עזרה, אם מישהו המומחים כאן יש לו מושג מה כתוב כאן ורוצה לעזור לי, אני אשמח מאוד.