Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android手機 >> Android刷機教程 >> htc刷機 >> 【ROM漢化教程】高級電源菜單重啟4項的漢化教程參考!

【ROM漢化教程】高級電源菜單重啟4項的漢化教程參考!

編輯:htc刷機

    很多第三方ROM會已經包括了高級電源菜單,但是往往,在重啟項中的4個選項會是英文的列表:
           normal
           hot reboot
           bootloader
           recovery
    這點難免讓人有些不爽,那麼本文就來教大家如何把這個列表變成:
           正常重啟
           快速重啟
           引導模式
           刷機模式
     一、實現原理
            列表中的4項被定義在一個字符串型數組中(數組1),而如果單純的將這個數組中的4個字符串漢化的話,會導致重啟出現錯誤,這是因為顯示值與操作數沖突。好奇的朋友可以試試。那麼解決的辦法就是再重新定義一個容量為4的字符串型數組(數組2),將漢化後的值賦進去,作用僅僅是顯示,與操作數分開,這樣就不會造成與操作數的沖突。最終的效果就是在顯示的時候讀取數組2,而執行操作的時候參數讀取自數組1。(理解這裡可能需要一些編程基礎,不過不懂也不要緊,跟著教程做,會成功的)
     二、修改方法
           1、以壓縮包方式打開android.policy.jar,將classes.dex取出,放在smali工具根目錄下,運行“解包”,輸出文件夾out。此舉是將dex反編譯為smali文件,便於修改。
           2、進行修改,這裡具體的行數以我自己的做說明,實際中多少可能會有些偏差。
           打開\com\android\internal\policy\impl\GlobalActions$SinglePressAction.smali,在24行,找到這樣一條語句:

  1. .field protected static final rebootOptions:[Ljava/lang/String;
復制代碼

復制代碼這條語句的含義是定義了一個字符串型的變量,名稱為rebootOptions,通過字面很容易理解為重啟設置,就是原理中所述的操作數。同樣根據原理所述,我們需要再定義一個同樣類型的變量來作為顯示。中間空一行,在26行,添加如下語句:

  1. .field protected static final rebootString:[Ljava/lang/String;
復制代碼

變量的名字叫做rebootString,是稍後用來顯示的。
           3、往下看,38行後
   
           1..method static constructor <clinit>()V
           2.    .registers 3              ——聲明使用3個寄存器
           3.
           4.    const/4 v0, 0x4      ——v0=4
           5.
           6.    new-array v0, v0, [Ljava/lang/String;      ——建立新數組,容量為v0,即4
           7.
           8.    const/4 v1, 0x0     ——v1=0
           9.
           10.    const-string v2, "Normal"   ——v2=Normal
           11.
           12.    aput-object v2, v0, v1       ——v0數組中的第v1個值為v2,即數組中的第一個為Normal(至於0為什麼是第一個就不提了,0123就是1234)
           13.
           14.    const/4 v1, 0x1
           15.
           16.    const-string v2, "Hot restart"
           17.
           18.    aput-object v2, v0, v1
           19.
           20.    const/4 v1, 0x2
           21.
           22.    const-string v2, "Bootloader"
           23.
           24.    aput-object v2, v0, v1
           25.
           26.    const/4 v1, 0x3
           27.
           28.    const-string v2, "Recovery"
           29.
           30.    aput-object v2, v0, v1
           31.
           32.    sput-object v0, Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;->rebootOptions:[Ljava/lang/String;      ——rebootOptions就從v0數組中取值了,作為操作數
           上段原來的代碼,有必要的地方都加了注釋,會代碼的仔細看一看吧。原來的代碼,不難看出,這裡只定義了給rebootOptions提供參數的一個容量為4的數組。同樣,仿照它,再定義一個容量為4的數組,來給上邊定義過的rebootString提供參數。
           修改後的代碼如下:
           1..method static constructor <clinit>()V
           2.    .registers 8
           3.
           4.    const/4 v7, 0x4
           5.
           6.    const/4 v6, 0x3
           7.
           8.    const/4 v5, 0x2
           9.
           10.    const/4 v4, 0x1
           11.
           12.    const/4 v3, 0x0
           13.
           14.    new-array v0, v7, [Ljava/lang/String;             ——新的數組v0,容量為v7(4)
           15.
           16.    const-string v2, "\u6B63\u5E38\u91CD\u542F"    ——“正常重啟”的轉碼結果賦值給v2
           17.
           18.    aput-object v2, v0, v3                   ——數組v0的第v3位為v2
           19.
           20.    const-string v2, "\u5FEB\u901F\u91CD\u542F"   ——“快速重啟”
           21.
           22.    aput-object v2, v0, v4
           23.
           24.    const-string v2, "\u5F15\u5BFC\u6A21\u5F0F"   ——“引導模式”
           25.
           26.    aput-object v2, v0, v5
           27.
           28.    const-string v2, "\u5237\u673A\u6A21\u5F0F"   ——“刷機模式”
           29.
           30.    aput-object v2, v0, v6
           31.
           32.    sput-object v0, Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;->rebootString:[Ljava/lang/String;    ——數組定義完畢,rebootString的參數將從數組v0中讀取
           33.    new-array v1, v7, [Ljava/lang/String;
           34.
           35.    const-string v2, "Normal"
           36.
           37.    aput-object v2, v1, v3
           38.
           39.    const-string v2, "Hot restart"
           40.
           41.    aput-object v2, v1, v4
           42.
           43.    const-string v2, "Bootloader"
           44.
           45.    aput-object v2, v1, v5
           46.
           47.    const-string v2, "Recovery"
           48.
           49.    aput-object v2, v1, v6
           50.
           51.    sput-object v1, Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;->rebootOptions:[Ljava/lang/String;
           這樣就有了一個新的數組,其中4位內容分別為:正常重啟、快速重啟、引導模式、刷機模式。而在顯示的時候rebootString會調用這個數組裡的值,這樣就達到了漢化的目的。然後保存文件。
           4、在\com\android\internal\policy\impl\GlobalActions$6.smali中,71行處:

  1. sget-object v2, Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;->rebootOptions:[Ljava/lang/String;
復制代碼

將rebootOptions改為rebootString,意為顯示時指定通過rebootString取值。然後保存文件。
          5、將GlobalActions$SinglePressAction.smali和GlobalActions$6.smali修改完畢保存後,回到smali工具的根目錄,運行“打包”,生成文件smail-classes.dex。在將這個文件重命名為classes.dex,以壓縮包方式打開android.policy.jar,將classes.dex替換進去,不用簽名。
           這樣,一個新的android.policy.jar就做完了,用adb push或者RE文件浏覽器替換回去,修改相應權限和所有者,看看效果吧。(權限需修改成:rw-r-r),
           如果發現文中有什麼錯誤及不明,可聯系我進行修正.

        三、工具下載及注意事項:

         1、並非所有的ROM四重啟漢化項目都在\com\android\internal\policy\impl\GlobalActions$SinglePressAction.smali

         比如MIUI 的ROM是在:\com\android\internal\policy\impl\MIUIGlobalActions$SinglePressAction.smali內的;

         2、修改過程中可以用Beyond Compare文件比較器進行對比修改。

         解包&打包dex文件的smali工具下載:安裝後請詳細看看使用說明:

         

APK+Dex文件反編譯及回編譯工具v1.7.2正式版(防誤殺)




         安裝完成後,右鍵點擊你想要反編譯的文件即可——傻瓜式操作!

         如圖:

          未命名.jpg


  
          APKDB安裝 常見問題.zip (1.84 KB, )




         另外:在解包編譯android.policy.jar的classes.dex文件時,最好在原ROM\system\framework 下進行,不要提到其它文件夾進行編譯,可能會出現無法回編譯現象,添加回classes.dex文件時,注意檢查壓縮包的大小!

        以上內容來自度娘,如有雷同,純屬巧合!
 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved