リバースコンパイルカスタムアンドロイドのデフォルトは24 H形式で時間を表示します

30344 ワード

文書ディレクトリ
  • 反コンパイルカスタムアンドロイドデフォルト24 H形式表示時間
  • 警告
  • AOSP
  • 分析プロセス:
  • 1.まず、ステータスバーの時間がどのように表示されるか、フォーマットがどのように設定されているか、誰が初期化を担当しているかを分析する
  • .
  • .逆コンパイルSettingsはAOSPが整理したプロセス
  • を検証する
  • 3.逆コンパイルSettingProviderこれまでの分析で追加すべき修正
  • を完了
  • 4.リトリーブSettingProvider
  • 結語
  • リバースコンパイルカスタムアンドロイドのデフォルトは24 H形式で時間を表示します
    この文章の作成の目的は1つは個人の学習ノートとして、2つは各位の技術の同僚に対して啓発することを望んで、全体の過程も一部のシステムの流れに対する理解を深めることができます.以前は個人のメモは比較的簡単でしたが、初めてこのような共有可能な形式に書きましたので、不合理な点があればご了承ください.
    この過程では、簡単な反コンパイル知識とコードを少し読む能力に関連し、最初は接触するのは難しいかもしれませんが、成功の喜びは価値があると感じさせます.
    警告
    逆コンパイルカスタマイズはリスクの高い方法であり、必ずしもどこにも適用されるわけではありません.変更されたターゲットのプロセスが不明であれば、このプロセスは未知のリスクをもたらす可能性があります.この方法は優先的に使用されるべきではありません.既存のシステム属性があれば、まずシステム属性に従って修正してください.
    AOSP (ASOP, Android Open Source Project)については後述するが、smaliのコードを逆コンパイルするのは難しいため、アンドロイド自体がオープンソースであるため、オープンソースプロジェクトのソースコードを表示して追跡を支援することができる(AOSPの内容をマザーボードの内容と完全に一致し、カスタマイズの程度が異なるとは思わないでください)
    科学的にインターネットを利用する方法をマスターすれば、AOSPはhttps://android.googlesource.com/ソースコードはオンラインで表示されますが、git倉庫を表示するときに対応するシステムバージョンのTAGを表示することに注意してください.
    科学的なインターネットがなければ、ubuntuシステムをインストールしてrepoを利用する必要があります.https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/すべてのコードを取得しますが、このプロセスにはメリットがあります.自分のアンドロイドシステムをコンパイルすることができます.
    分析プロセス:
    1.まず、ステータスバーの時間がどのように表示されるか、フォーマットがどのように設定されているか、誰が初期化を担当しているかを分析します.
    ステータスバーの表示に注目する理由がおかしいかもしれませんが、ステータスバーがどのように表示されているかを知るには、設定に関連していない場合、デフォルト値のソースが何なのか、つまり電源を入れた状態なのかを知る必要があります.これも修正の目的です.
    上部ステータスバーはSystemUIによって制御される.また、24時間制はシステム設定Settingsで変更された.では、まず保存プロセスを見てみましょう.ここでは、AOSPソースコードを使用して追跡を支援する必要があります.
    この手順を実行する前に、変更するターゲットファームウェアをパケット解除すると、Systemパーティション全体を簡単に取得できます.以下のすべてのパスは、対応するディレクトリを指し、説明しません.
  • は、AOSPより先にこのフロー
    //    Settings               24     ,                ,              ,             
    //Home/Garfield/Android/source/packages/apps/Settings/src/com/android/settings/DateTimeSettings.java
    public boolean onPreferenceTreeClick(Preference preference) {
            if (preference == mDatePref) {
                //......
            } else if (preference == mTimePref) {
                //......
            } else if (preference == mTime24Pref) {
                //       ,  set24Hour         ,    
                final boolean is24Hour = ((SwitchPreference)mTime24Pref).isChecked();
                set24Hour(is24Hour);
                //......
            }
            return super.onPreferenceTreeClick(preference);
        }
    
    //               
        private void set24Hour(boolean is24Hour) {
            //     java  ,   HOURS_24 HOURS_12     ,      "24" "12"
            //     Settings.System.putString,                   。
            Settings.System.putString(getContentResolver(),
                    Settings.System.TIME_12_24,
                    is24Hour? HOURS_24 : HOURS_12);
        }
    //            Settings.System.TIME_12_24    ,         :https://developer.android.com/reference/android/provider/Settings.System#TIME_12_24
    
    //           ,    "time_12_24",      "time_12_24"   "12"  "24"
    
    を見て、このフローを経て、表示時間フォーマットを本当に保存しているのはシステム属性"time_12_24"であることを発見することができ、デフォルト値が"24"であるようにする方法を見つければ理論的に実現することができる.
  • Androidがどのようにデフォルトシステムの属性を初期化するかを知る簡単な検索で、Androidシステムの最初の起動の各種設定のデフォルト値は基本的にframeworks/base/packages/SettingsProvider/res/values/defaults.xml、すなわちSettingsProviderから初期化され、次のステップは、設定されたデフォルト値をどのように提供するかを見つけることです.検索によると、このプロセスはDatabaseHelper.javaで完了し、この部分のソースコード
    //Settings/DatabaseHelper.java
        private void loadSettings(SQLiteDatabase db) {
            loadSystemSettings(db);//                
            loadSecureSettings(db);//                   、      
            // The global table only exists for the 'owner/system' user
            if (mUserHandle == UserHandle.USER_SYSTEM) {
                loadGlobalSettings(db);
            }
        }
    
    //    loadSystemSettings()    
        private void loadSystemSettings(SQLiteDatabase db) {
            SQLiteStatement stmt = null;
            try {
                //.......
                //     Settings.System.SCREEN_BRIGHTNESS         ,      Settings.System.TIME_12_24    ,            
                //        ,        、    ,         R.bool.def_       
                //  def_              
                loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
                        R.integer.def_screen_brightness);
                loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
                        R.bool.def_screen_brightness_automatic_mode);
                loadDefaultAnimationSettings(stmt);
                loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
                        R.bool.def_accelerometer_rotation);
                loadDefaultHapticSettings(stmt);
                loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE,
                        R.bool.def_notification_pulse);
                loadUISoundEffectsSettings(stmt);
                loadIntegerSetting(stmt, Settings.System.POINTER_SPEED,
                        R.integer.def_pointer_speed);
                //........
            } finally {
                if (stmt != null) stmt.close();
            }
        }
    
    を直接見ると、def_の先頭のパラメータがたくさんあり、R.の先頭はアプリケーションのリソースであり、アンドロイドアプリケーションのリソースファイルは/res/ディレクトリの下に単独で存在しているので、
    
    
    <resources>
        <bool name="def_dim_screen">truebool>
        <integer name="def_screen_off_timeout">60000integer>
        <integer name="def_sleep_timeout">-1integer>
        <bool name="def_airplane_mode_on">falsebool>
        <bool name="def_theater_mode_on">falsebool>
        
        <string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi,nfc,wimaxstring>
        <string name="airplane_mode_toggleable_radios" translatable="false">bluetooth,wifi,nfcstring>
        <string name="def_bluetooth_disabled_profiles" translatable="false">0string>
    
    を見てみましょう.SettingProviderdefault.xml24に追加し、loadSettingsの一部にloadStringSetting(stmt, Settings.System.TIME_12_24, R.string.def_time_12_24)を追加して追加された属性をロードする必要があります.後で完成した後、SettingProviderに初期パラメータが書き込まれていないときに誰がデフォルト値を提供したのか知りたいです.後にframework階で提供されている可能性があります.つまり、/system/framework.jarファイルを発掘しました.その具体的な流れは皆さんが掘り起こしています.

  • 2.逆コンパイルSettingsはAOSPが整理した過程を検証する
    apktool if /System/framework/framework-res.apk
    #                  apk    ,        (if  ),         。  ,-p         ,                       
    apktool d /System/priv-app/Settings/Settings.apk
    apktool d /System/priv-app/SettingProvider/SettingProvider.apk
    #                      (     )
    

    次に、逆コンパイルされたSettingsを表示し、そのプロセスが以前に述べたソースコードと類似しているかどうかを確認します.
    //System\priv-app\Settings\Settings\smali\com\android\settings
    .method private set24Hour(Z)V //  set24Hour    
        .locals 3
        .param p1, "is24Hour"    # Z
        .prologue
        .line 311
        invoke-virtual {p0}, Lcom/android/settings/DateTimeSettings;->getContentResolver()Landroid/content/ContentResolver;
    
        move-result-object v1
        .line 312
        const-string/jumbo v2, "time_12_24" //     ,       ,            
        .line 313
        if-eqz p1, :cond_0
        const-string/jumbo v0, "24"
        .line 311
        :goto_0
        //     ,     AOSP             ,      settings      
        invoke-static {v1, v2, v0}, Landroid/provider/Settings$System;->putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z
        .line 310
        return-void
        .line 313
            
        :cond_0
        const-string/jumbo v0, "12"
        goto :goto_0
    .end method
    

    ここでは、Settingsがこの属性を保存する方法がAOSPと同じであることを検証し、理論的にはSettingProviderを修正することによって24時間フォーマットへの初期化を実現することもできる.
    3.逆コンパイルSettingProvider以前の分析で追加すべき修正を完了
    まず、このプロパティをリソースファイルに追加します.ただし、コンパイル後に異なるプロパティのリソースが別々に保存され、リソーステーブルがあるため、両方を追加する必要があります.
    
    <string name="def_time_12_24">24string>
    
    
    <public type="string" name="def_time_12_24" id="0x7f060016" />
    

    これで、ソースコードにdefault.xmlを追加したのとほぼ等しいステップが完了し、次にDatabaseHelper.javaを修正します.
    //smali/com/android/providers/seetings/DatabaseHelper.smali
    //  loadSystemSettings    ,         string           
    .method private loadSystemSettings(Landroid/database/sqlite/SQLiteDatabase;)V
        //....
        .line 2407
        const-string/jumbo v1, "screenshot_location"
        const v2, 0x7f060014
        invoke-direct {p0, v0, v1, v2}, Lcom/android/providers/settings/DatabaseHelper;->loadStringSetting(Landroid/database/sqlite/SQLiteStatement;Ljava/lang/String;I)V
    	//     smali        
    	const-string/jumbo v1, "time_12_24"  //     "time_12_24"
        const v2, 0x7f060016				//       id 
        invoke-direct {p0, v0, v1, v2}, Lcom/android/providers/settings/DatabaseHelper;->loadStringSetting(Landroid/database/sqlite/SQLiteStatement;Ljava/lang/String;I)
        //...
    

    これで理論的に修正が完了し、最後にコンパイルしてテストする必要があります.
    4.リトリーブSettingProvider
       apktool b /System/priv-app/SettingProvider/SettingProvider.apk
       #       ,          dist,        apk,          
    

    同じ名前のファイルを置き換えた後、工場出荷時の設定を復元すると効果が観察されるか、ファームウェア修正ツールでファームウェアに作成されます.
    締めくくり
    これで、この流れは終わりました.皆さんにヒントを与えてほしいです.読んでくれてありがとう.
    apktool b/system/priv-app/settingProvider/settingProvider.apk#完成後、逆コンパイル先ディレクトリはdistより多く、中にはコンパイルされたapkを保存し、その応用システムに署名すればよい
    
    ​		         ,             ,               。
    
    ##   
    
    ​		  ,        ,            ,    。