שיתוף | תיקון הבאג של ה-3 אפליקציות ביישומים אחרונים ב-m36
-
אז אחרי שעות של זיהוי ותיקון הבעיה,
מצאתי את הבאג המכוון של היצרן שדאג לנו לשלל באגים במכשיר,
היצרן שלנו הוסיף בsmali של services.jar פונקציה שדואגת שלא יהיה יותר משלוש אפליקציות ביישומים אחרוניםעזבו את הרעיון הגרוע כשלעצמו, הוא גם השתמש בפונקציה ישנה של אנדרואיד, שפועלת רק על המשתמש הראשי, כך שאם פותחים משתמש חדש הפונקציה לא פועלת עליו...
אז ערכתי את הפונקציה הזאת שבכלל לא תתחיל, ויצרתי מודול מאג'יסק שדוחף את ה-services.jar המתוקן לסיסטם,
פשוט להתקין את המודול ולהפעיל מחדש, כמובן דורש רוט...
Recent Apps Limit Fix.zipליוצרי הגירסאות, זה הservices.jar המתוקן, לשים ב-/system/framework
-
@פיני10 כתב בשיתוף | תיקון הבאג של ה-3 אפליקציות ביישומים אחרונים ב-m36:
(למה התעוררת לכתוב את זה רק עכשיו?)
כי רק עכשיו היה לי זמן לחקור איפה בדיוק הבעיה...
מותר לשאול מי כיוון אותך לשם?
עשיתי Logcat ב-ADB ובדקתי מה קורה כשאני פותח את האפליקציה הרביעית, ראיתי שהוא סוגר את האפליקציה הראשונה בגלל הפונקציה removeTask,
חיפשתי את הפונקציה הזאת ב-SystemUI ולא מצאתי, חיפשתי ב-framework-res וראיתי את הפונקציה הרגילה של ניהול אפליקציות אבל היה שם משהו מוזר כאילו הוא מחכה לפונקציה שתדרוס אותו,
אז האזנתי עם Frida לפונקציה removeTask וראיתי שמה שמפעיל אותה זה הפונקציה checkRecentTask בקלאס RecentTasks
אז בדקתי ב-services.jar וב"ה מצאתי את הפונקציה.אם זה מעניין אותך זה הפונקציה:
.method private checkRecentTask()V .registers 10 code Code .line 1192 iget-object v0, p0, Lcom/android/server/wm/RecentTasks;->mService:Lcom/android/server/wm/ActivityTaskManagerService; iget-object v0, v0, Lcom/android/server/wm/ActivityTaskManagerService;->mContext:Landroid/content/Context; iget-object v1, p0, Lcom/android/server/wm/RecentTasks;->mService:Lcom/android/server/wm/ActivityTaskManagerService; iget-object v1, v1, Lcom/android/server/wm/ActivityTaskManagerService;->mContext:Landroid/content/Context; const-string v1, "activity" invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; move-result-object v0 check-cast v0, Landroid/app/ActivityManager; .line 1194 .local v0, "mAm":Landroid/app/ActivityManager; const/16 v1, 0xa .line 1195 .local v1, "minNumTasksToQuery":I :try_start_12 invoke-static {}, Landroid/app/ActivityManager;->getMaxRecentTasksStatic()I move-result v2 invoke-static {v1, v2}, Ljava/lang/Math;->max(II)I move-result v2 .line 1196 .local v2, "numTasksToQuery":I const/4 v3, 0x3 .line 1198 .local v3, "flag":I invoke-virtual {v0, v2, v3}, Landroid/app/ActivityManager;->getRecentTasks(II)Ljava/util/List; move-result-object v4 iput-object v4, p0, Lcom/android/server/wm/RecentTasks;->tasks2:Ljava/util/List; .line 1199 invoke-interface {v4}, Ljava/util/List;->size()I move-result v4 const/4 v5, 0x3 if-le v4, v5, :cond_64 .line 1200 const/4 v4, 0x3 .local v4, "i":I :goto_29 iget-object v5, p0, Lcom/android/server/wm/RecentTasks;->tasks2:Ljava/util/List; invoke-interface {v5}, Ljava/util/List;->size()I move-result v5 if-ge v4, v5, :cond_64 .line 1201 iget-object v5, p0, Lcom/android/server/wm/RecentTasks;->tasks2:Ljava/util/List; invoke-interface {v5, v4}, Ljava/util/List;->get(I)Ljava/lang/Object; move-result-object v5 check-cast v5, Landroid/app/ActivityManager$RecentTaskInfo; .line 1202 .local v5, "info":Landroid/app/ActivityManager$RecentTaskInfo; if-eqz v5, :cond_61 .line 1203 const-string v6, "kenTestTag" new-instance v7, Ljava/lang/StringBuilder; invoke-direct {v7}, Ljava/lang/StringBuilder;-><init>()V const-string/jumbo v8, "removeTask....." invoke-virtual {v7, v8}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v7 iget-object v8, v5, Landroid/app/ActivityManager$RecentTaskInfo;->realActivity:Landroid/content/ComponentName; invoke-virtual {v8}, Landroid/content/ComponentName;->getPackageName()Ljava/lang/String; move-result-object v8 invoke-virtual {v7, v8}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v7 invoke-virtual {v7}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v7 invoke-static {v6, v7}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I .line 1204 iget-object v6, p0, Lcom/android/server/wm/RecentTasks;->mService:Lcom/android/server/wm/ActivityTaskManagerService; iget v7, v5, Landroid/app/ActivityManager$RecentTaskInfo;->persistentId:I invoke-virtual {v6, v7}, Lcom/android/server/wm/ActivityTaskManagerService;->removeTask(I)Z :try_end_61 .catch Ljava/lang/Exception; {:try_start_12 .. :try_end_61} :catch_65 .line 1200 .end local v5 # "info":Landroid/app/ActivityManager$RecentTaskInfo; :cond_61 add-int/lit8 v4, v4, 0x1 goto :goto_29 .line 1210 .end local v1 # "minNumTasksToQuery":I .end local v2 # "numTasksToQuery":I .end local v3 # "flag":I .end local v4 # "i":I :cond_64 goto :goto_6d .line 1208 :catch_65 move-exception v1 .line 1209 .local v1, "e":Ljava/lang/Exception; const-string v2, "ActivityTaskManager" const-string v3, "Failed to get recent tasks" invoke-static {v2, v3, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I .line 1211 .end local v1 # "e":Ljava/lang/Exception; :goto_6d return-void .end method
-
@פיני10 כתב בשיתוף | תיקון הבאג של ה-3 אפליקציות ביישומים אחרונים ב-m36:
(למה התעוררת לכתוב את זה רק עכשיו?)
כי רק עכשיו היה לי זמן לחקור איפה בדיוק הבעיה...
מותר לשאול מי כיוון אותך לשם?
עשיתי Logcat ב-ADB ובדקתי מה קורה כשאני פותח את האפליקציה הרביעית, ראיתי שהוא סוגר את האפליקציה הראשונה בגלל הפונקציה removeTask,
חיפשתי את הפונקציה הזאת ב-SystemUI ולא מצאתי, חיפשתי ב-framework-res וראיתי את הפונקציה הרגילה של ניהול אפליקציות אבל היה שם משהו מוזר כאילו הוא מחכה לפונקציה שתדרוס אותו,
אז האזנתי עם Frida לפונקציה removeTask וראיתי שמה שמפעיל אותה זה הפונקציה checkRecentTask בקלאס RecentTasks
אז בדקתי ב-services.jar וב"ה מצאתי את הפונקציה.אם זה מעניין אותך זה הפונקציה:
.method private checkRecentTask()V .registers 10 code Code .line 1192 iget-object v0, p0, Lcom/android/server/wm/RecentTasks;->mService:Lcom/android/server/wm/ActivityTaskManagerService; iget-object v0, v0, Lcom/android/server/wm/ActivityTaskManagerService;->mContext:Landroid/content/Context; iget-object v1, p0, Lcom/android/server/wm/RecentTasks;->mService:Lcom/android/server/wm/ActivityTaskManagerService; iget-object v1, v1, Lcom/android/server/wm/ActivityTaskManagerService;->mContext:Landroid/content/Context; const-string v1, "activity" invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; move-result-object v0 check-cast v0, Landroid/app/ActivityManager; .line 1194 .local v0, "mAm":Landroid/app/ActivityManager; const/16 v1, 0xa .line 1195 .local v1, "minNumTasksToQuery":I :try_start_12 invoke-static {}, Landroid/app/ActivityManager;->getMaxRecentTasksStatic()I move-result v2 invoke-static {v1, v2}, Ljava/lang/Math;->max(II)I move-result v2 .line 1196 .local v2, "numTasksToQuery":I const/4 v3, 0x3 .line 1198 .local v3, "flag":I invoke-virtual {v0, v2, v3}, Landroid/app/ActivityManager;->getRecentTasks(II)Ljava/util/List; move-result-object v4 iput-object v4, p0, Lcom/android/server/wm/RecentTasks;->tasks2:Ljava/util/List; .line 1199 invoke-interface {v4}, Ljava/util/List;->size()I move-result v4 const/4 v5, 0x3 if-le v4, v5, :cond_64 .line 1200 const/4 v4, 0x3 .local v4, "i":I :goto_29 iget-object v5, p0, Lcom/android/server/wm/RecentTasks;->tasks2:Ljava/util/List; invoke-interface {v5}, Ljava/util/List;->size()I move-result v5 if-ge v4, v5, :cond_64 .line 1201 iget-object v5, p0, Lcom/android/server/wm/RecentTasks;->tasks2:Ljava/util/List; invoke-interface {v5, v4}, Ljava/util/List;->get(I)Ljava/lang/Object; move-result-object v5 check-cast v5, Landroid/app/ActivityManager$RecentTaskInfo; .line 1202 .local v5, "info":Landroid/app/ActivityManager$RecentTaskInfo; if-eqz v5, :cond_61 .line 1203 const-string v6, "kenTestTag" new-instance v7, Ljava/lang/StringBuilder; invoke-direct {v7}, Ljava/lang/StringBuilder;-><init>()V const-string/jumbo v8, "removeTask....." invoke-virtual {v7, v8}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v7 iget-object v8, v5, Landroid/app/ActivityManager$RecentTaskInfo;->realActivity:Landroid/content/ComponentName; invoke-virtual {v8}, Landroid/content/ComponentName;->getPackageName()Ljava/lang/String; move-result-object v8 invoke-virtual {v7, v8}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v7 invoke-virtual {v7}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v7 invoke-static {v6, v7}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I .line 1204 iget-object v6, p0, Lcom/android/server/wm/RecentTasks;->mService:Lcom/android/server/wm/ActivityTaskManagerService; iget v7, v5, Landroid/app/ActivityManager$RecentTaskInfo;->persistentId:I invoke-virtual {v6, v7}, Lcom/android/server/wm/ActivityTaskManagerService;->removeTask(I)Z :try_end_61 .catch Ljava/lang/Exception; {:try_start_12 .. :try_end_61} :catch_65 .line 1200 .end local v5 # "info":Landroid/app/ActivityManager$RecentTaskInfo; :cond_61 add-int/lit8 v4, v4, 0x1 goto :goto_29 .line 1210 .end local v1 # "minNumTasksToQuery":I .end local v2 # "numTasksToQuery":I .end local v3 # "flag":I .end local v4 # "i":I :cond_64 goto :goto_6d .line 1208 :catch_65 move-exception v1 .line 1209 .local v1, "e":Ljava/lang/Exception; const-string v2, "ActivityTaskManager" const-string v3, "Failed to get recent tasks" invoke-static {v2, v3, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I .line 1211 .end local v1 # "e":Ljava/lang/Exception; :goto_6d return-void .end method
-
@עדלאידע מי קורא לפונקציה system ui או blueshark?
(אגב זה רק מחזק את ההשערה שלי שהרום שמגיע עם המכשיר זה בעצם gsi שהלבישו עליו...) -
@פיני10 כתב בשיתוף | תיקון הבאג של ה-3 אפליקציות ביישומים אחרונים ב-m36:
(אגב זה רק מחזק את ההשערה שלי שהרום שמגיע עם המכשיר זה בעצם gsi שהלבישו עליו...)
מה ההו"א?
-
@פיני10 כתב בשיתוף | תיקון הבאג של ה-3 אפליקציות ביישומים אחרונים ב-m36:
@למה-באתי שהרום המקורי של המכשיר הוא באמת אנדרואיד 13 ולא משהו יותר נמוך...
מה מביא אותך להסכמה שזה GSI?
-
@עדלאידע כתב בשיתוף | תיקון הבאג של ה-3 אפליקציות ביישומים אחרונים ב-m36:
אבל היה שם משהו מוזר כאילו הוא מחכה לפונקציה שתדרוס אותו,
אפשר הסבר מה הכוונה? מה היה מוזר?
@מישהו12 כתב בשיתוף | תיקון הבאג של ה-3 אפליקציות ביישומים אחרונים ב-m36:
@עדלאידע כתב בשיתוף | תיקון הבאג של ה-3 אפליקציות ביישומים אחרונים ב-m36:
אבל היה שם משהו מוזר כאילו הוא מחכה לפונקציה שתדרוס אותו,
אפשר הסבר מה הכוונה? מה היה מוזר?
היה שם בקובץ integers.xml את הערך הבא:
config_maxNumVisibleRecentTasks = "-1"
מה שבפועל לא נכון כי תכלס' ההגבלה היא 3...
ובמקום פשוט לכתוב שם את הערך 3 היצרן בחר לקבוע את ההגבלה בקומבינה מטופשת ישירות ב-services.jar... -
אז אחרי שעות של זיהוי ותיקון הבעיה,
מצאתי את הבאג המכוון של היצרן שדאג לנו לשלל באגים במכשיר,
היצרן שלנו הוסיף בsmali של services.jar פונקציה שדואגת שלא יהיה יותר משלוש אפליקציות ביישומים אחרוניםעזבו את הרעיון הגרוע כשלעצמו, הוא גם השתמש בפונקציה ישנה של אנדרואיד, שפועלת רק על המשתמש הראשי, כך שאם פותחים משתמש חדש הפונקציה לא פועלת עליו...
אז ערכתי את הפונקציה הזאת שבכלל לא תתחיל, ויצרתי מודול מאג'יסק שדוחף את ה-services.jar המתוקן לסיסטם,
פשוט להתקין את המודול ולהפעיל מחדש, כמובן דורש רוט...
Recent Apps Limit Fix.zipליוצרי הגירסאות, זה הservices.jar המתוקן, לשים ב-/system/framework
-
@פיני10 כתב בשיתוף | תיקון הבאג של ה-3 אפליקציות ביישומים אחרונים ב-m36:
@עדלאידע המודל לא עובד לי בהתקנה אני מקבל שגיאה שהפתיחה של הזיפ נכשלה
איזה גרסת מגיסק יש לך?