リバースコンパイルカスタムアンドロイドのデフォルトは24 H形式で時間を表示します
30344 ワード
文書ディレクトリ反コンパイルカスタムアンドロイドデフォルト24 H形式表示時間 警告 AOSP 分析プロセス: 1.まず、ステータスバーの時間がどのように表示されるか、フォーマットがどのように設定されているか、誰が初期化を担当しているかを分析する ..逆コンパイルSettingsはAOSPが整理したプロセス を検証する 3.逆コンパイルSettingProviderこれまでの分析で追加すべき修正 を完了4.リトリーブSettingProvider 結語 リバースコンパイルカスタムアンドロイドのデフォルトは24 H形式で時間を表示します
この文章の作成の目的は1つは個人の学習ノートとして、2つは各位の技術の同僚に対して啓発することを望んで、全体の過程も一部のシステムの流れに対する理解を深めることができます.以前は個人のメモは比較的簡単でしたが、初めてこのような共有可能な形式に書きましたので、不合理な点があればご了承ください.
この過程では、簡単な反コンパイル知識とコードを少し読む能力に関連し、最初は接触するのは難しいかもしれませんが、成功の喜びは価値があると感じさせます.
警告
逆コンパイルカスタマイズはリスクの高い方法であり、必ずしもどこにも適用されるわけではありません.変更されたターゲットのプロセスが不明であれば、このプロセスは未知のリスクをもたらす可能性があります.この方法は優先的に使用されるべきではありません.既存のシステム属性があれば、まずシステム属性に従って修正してください.
AOSP
科学的にインターネットを利用する方法をマスターすれば、
科学的なインターネットがなければ、
分析プロセス:
1.まず、ステータスバーの時間がどのように表示されるか、フォーマットがどのように設定されているか、誰が初期化を担当しているかを分析します.
ステータスバーの表示に注目する理由がおかしいかもしれませんが、ステータスバーがどのように表示されているかを知るには、設定に関連していない場合、デフォルト値のソースが何なのか、つまり電源を入れた状態なのかを知る必要があります.これも修正の目的です.
上部ステータスバーは
この手順を実行する前に、変更するターゲットファームウェアをパケット解除すると、Systemパーティション全体を簡単に取得できます.以下のすべてのパスは、対応するディレクトリを指し、説明しません.は、 Androidがどのようにデフォルトシステムの属性を初期化するかを知る簡単な検索で、Androidシステムの最初の起動の各種設定のデフォルト値は基本的に
2.逆コンパイルSettingsはAOSPが整理した過程を検証する
次に、逆コンパイルされた
ここでは、
3.逆コンパイルSettingProvider以前の分析で追加すべき修正を完了
まず、このプロパティをリソースファイルに追加します.ただし、コンパイル後に異なるプロパティのリソースが別々に保存され、リソーステーブルがあるため、両方を追加する必要があります.
これで、ソースコードに
これで理論的に修正が完了し、最後にコンパイルしてテストする必要があります.
4.リトリーブSettingProvider
同じ名前のファイルを置き換えた後、工場出荷時の設定を復元すると効果が観察されるか、ファームウェア修正ツールでファームウェアに作成されます.
締めくくり
これで、この流れは終わりました.皆さんにヒントを与えてほしいです.読んでくれてありがとう.
apktool b/system/priv-app/settingProvider/settingProvider.apk#完成後、逆コンパイル先ディレクトリはdistより多く、中にはコンパイルされたapkを保存し、その応用システムに署名すればよい
この文章の作成の目的は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"
であるようにする方法を見つければ理論的に実現することができる.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>
を見てみましょう.SettingProvider
のdefault.xml
を24
に追加し、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を保存し、その応用システムに署名すればよい
, , 。
##
, , , 。