Hướng dẫn fix USSD time out (tự mất mất sau 2 giây) Ở các máy hàn quốc bản K thường có 1 tình trạng làm ta hết sức bực bội là, #101# nó cứ tự mất đi sau 2s. Vậy làm thế nào để fix, có nhiều bạn hỏi mình (hình như gần đây nhất là box VU2 có hỏi) nên lần này mình tranh thủ hướng dẫn các bạn sửa/ Vẫn theo cách sửa tường tận, ngọn ngành để các bạn nắm được nguyên do nhé. Công cụ: dex2jar notepad ++ và plugin smali cho notepad++ java decompiler apk tool Tự search các công cụ trên hoặc tìm các tút cũ của mình nhé Hướng dẫn fix USSD time out (tự mất mất sau 2 giây) viết bởi hoangnova từ LGViet.com Đầu tiên decompile thằng LGPhone.apk ra đã, nói chung mọi tính năng liên quan đến gọi điện, ussd đều nằm trên này nên ta cần sửa ở đó. Trước khi viết tút này mình cũng chả biết cái phần đó nằm ở đâu trong mớ hổ lốn kia. Tuy nhiên theo kinh nghiệm nên mình cứ search toàn bộ đám smali với từ khóa ussd xem thế nào đã. Đây rồi, thấy mấy cái liên quan đến ussd, mở lên xem thế nào Bây giờ code smali thế này thì nhìn khó hiểu lắm, nên cần dex2jar để xem các class có mấy từ khóa mà ta vừa tìm xem thế nào đã. Trong method displayMMIComplete thuộc class PhoneUtils nên đọc method đó xem thế nào. Nói lại, mấu chốt vẫn là cần có kinh nghiệm 1 chút về đọc code java và smali Kinh nghiệm cho thấy, các biến hoặc method trong code android thường đặt tên khá rõ ràng, trong method đó mình thấy cái khả nghi là mMmiCompleteTimeoutCbMsg, nghe có vẻ giống giống cái ta tìm. Vậy lần theo nó xem sao, trò này hơi hơi giống thám tử Conan, lần theo các manh mối ta có. USSD time out, fix #101# tự mất, fix ussd, LGVIet.com, hoangnova Search trong file đó khi đọc bằng java decompiler bằng ta thấy có 1 đoạn vô cùng khả nghi nằm trong displayMMIComplete nó đây: Khi thực USSD hiện lên, nó gửi đi 1 msg gì đó có giá trị 2000L = với khoảng thời gian mà cái ussd bị mất, lại có liên quan tới mMmiCompleteTimeoutCbMsg. Sau đó ta lại thấy nó check với if (ConfigUtils.isTargetOperator(2)) thì mới thực hiện việc đó, vậy check tiếp xem isTargetOperator(2) Lần theo manh mối này vào ConfigUtils ta tìm đc Mã: public static boolean isTargetOperator(int paramInt) { return MTARGETOPERATOR == paramInt; } Tìm tiếp MTARGETOPERATOR Mã: MTARGETOPERATOR = setTargetOperator(); Tìm tiếp setTargetOperator(); xem cuối cùng nó check với isTargetOperator(2) là cái gì. Đây rồi vậy ta hiểu rằng nó chẹck với nhà mạng KT trong build.prop thì nó gửi cái msg đó đi. tạm vậy đã, tuy nhiên ko chắc lắm, phải sửa thử xem sao. Lưu ý, bài viết này mình viết theo hướng bình dân hóa, ko nặng về kỹ thuật lập trình, vì vậy đừng vặn vẹo nhiều. Quay trở lại với thằng PhoneUtils giờ ta làm gì, có 2 hướng 1 là thử tăng cái thời gian 2000L kia lên, 2 là thay đổi giá trị isTargetOperator(2) thành số khác, ví dụ số 5 chẳng hạn. Ở đây mình sửa thời gian timeout cho nó nhiều nhiều chút thành 2 phút chẳng hạn (thế là thoải mái rồi) (khoảng 120 giây, tương đương với 120000L. 2000L = 2 giây) Dùng calculator để đổi giữa Dec và Hex như tút trước hướng dẫn nhé. Mã: .line 1760 sput-object p3, Lcom/android/phone/PhoneUtils;->mMmiCompleteTimeoutCbMsg:Landroid/os/Message; .line 1763 const/16 v17, 0x2 :try_start_2 invoke-static/range {v17 .. v17}, Lcom/android/phone/ConfigUtils;->isTargetOperator(I)Z move-result v17 if-eqz v17, :cond_12 .line 1764 sget-object v17, Lcom/android/phone/PhoneUtils;->mMmiCompleteTimeoutCbMsg:Landroid/os/Message; invoke-virtual/range {v17 .. v17}, Landroid/os/Message;->getTarget()Landroid/os/Handler; move-result-object v17 const-wide/16 v18, 0x7d0 move-object/from16 v0, v17 move-object/from16 v1, p3 move-wide/from16 v2, v18 invoke-virtual {v0, v1, v2, v3}, Landroid/os/Handler;->sendMessageDelayed(Landroid/os/Message;J)Z Thấy cái 0x7d0 ko ? Nó chính là giá trị 2000L đấy, giờ mình sửa thành thế này Mã: const-wide/32 v18, 0x1d4c0 Như thế là thành 2 phút cho thoải mái. Save lại và Compile file LGPHone.apk. Test thử xem sao. Chắc chắn là ngon lành ko bị time out sau 2 giây nữa. Chúc may mắn nhé. Nguồn: lgviet.com cám ơn anh @hoangnova