Androidカスタマイズ:出荷時の設定を復元してSystemUIを削除する
7897 ワード
プラットフォーム:android M
必要:
1.お客様のニーズ、Launcher機能付きapkを予め設定する.システムのすべてのapkを除去する.SystemUIを含む.
2.工場はシステムのLauncher 3とsystemUIを必要としてテスト操作を完成する.
考え方:
以上のニーズに基づいて、1つの解決策を考えて、初めてソフトウェアをダウンロードして、システムUIとLauncher 3を持っています.工場試験完了後、工場出荷時の設定を復元し、システムUIとLauncher 3を除去する.
ソリューション1:
1.Launcherはdata/appの下に予め設定する.
修正:Launcher 3/Android.mk
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
2.SystemUIの変更
2.1工場出荷時の設定を認識する方法を追加する.
プリセットdevice/mediatek/common/setupファイル
デバイス/mediatek/common/deviceを変更します.mk
+#setup +PRODUCT_COPY_FILES += device/mediatek/common/setup:data/app/setup
出荷時の設定を復元すると、そのファイルが削除され、そのファイルの存在を判断することにより、出荷時の設定を復元することができる.
2.2システムuiで判定を開始する:
SystemServer.java
+if(isFirst()){ + try { + startSystemUi(context); + } catch (Throwable e) { + reportWtf("starting System UI", e); + } + }else{ + Slog.i(TAG, "Do not startSystemUi"); + }
+ private boolean isFirst(){ + File file = new File(path); + if (file.exists()) { + return true; + } + return false; + }
SystemUIApplication.java
- if (mServicesStarted) { - final int N = mServices.length; - for (int i = 0; i < N; i++) { - mServices[i].onBootCompleted(); - } - } + if(isFirst()){ + if (mServicesStarted) { + final int N = mServices.length; + for (int i = 0; i < N; i++) { + mServices[i].onBootCompleted(); + } + }++ } +
if (mServicesStarted) { return; } + if(!isFirst()){ + Log.d(TAG, "do not startServicesIfNeeded"); + return; + }else{ + Log.d(TAG, "startServicesIfNeeded"); + }
- if (mServicesStarted) { + if (mServicesStarted && isFirst()) { int len = mServices.length; for (int i = 0; i < len; i++) { mServices[i].onConfigurationChanged(newConfig);
SystemUIService.java
@Override public void onCreate() { super.onCreate(); - ((SystemUIApplication) getApplication()).startServicesIfNeeded(); + if(isFirst()){ + ((SystemUIApplication) getApplication()).startServicesIfNeeded(); + }else{++ } + } @Override @@ -38,21 +45,33 @@ public class SystemUIService extends Service { @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - SystemUI[] services = ((SystemUIApplication) getApplication()).getServices(); - if (args == null || args.length == 0) { - for (SystemUI ui: services) { - pw.println("dumping service: "+ ui.getClass().getName()); - ui.dump(fd, pw, args); - } - } else { - String svc = args[0]; - for (SystemUI ui: services) { - String name = ui.getClass().getName(); - if (name.endsWith(svc)) { - ui.dump(fd, pw, args); - } - } - } + if(isFirst()){ + SystemUI[] services = ((SystemUIApplication) getApplication()).getServices(); + if (args == null || args.length == 0) { + for (SystemUI ui: services) { + pw.println("dumping service: "+ ui.getClass().getName()); + ui.dump(fd, pw, args); + } + } else { + String svc = args[0]; + for (SystemUI ui: services) { + String name = ui.getClass().getName(); + if (name.endsWith(svc)) { + ui.dump(fd, pw, args); + } + } + } + } + }
2.3シールドロック
frameworks/base/packages/SystemUI/res/values/config.xml
false
以上の変更により、工場出荷時の設定を復元するシステムUIをマスクすることができる.
ソリューション2:
こんな操作があるなんて.意外です.
必要:
1.お客様のニーズ、Launcher機能付きapkを予め設定する.システムのすべてのapkを除去する.SystemUIを含む.
2.工場はシステムのLauncher 3とsystemUIを必要としてテスト操作を完成する.
考え方:
以上のニーズに基づいて、1つの解決策を考えて、初めてソフトウェアをダウンロードして、システムUIとLauncher 3を持っています.工場試験完了後、工場出荷時の設定を復元し、システムUIとLauncher 3を除去する.
ソリューション1:
1.Launcherはdata/appの下に予め設定する.
修正:Launcher 3/Android.mk
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
2.SystemUIの変更
2.1工場出荷時の設定を認識する方法を追加する.
プリセットdevice/mediatek/common/setupファイル
デバイス/mediatek/common/deviceを変更します.mk
+#setup +PRODUCT_COPY_FILES += device/mediatek/common/setup:data/app/setup
出荷時の設定を復元すると、そのファイルが削除され、そのファイルの存在を判断することにより、出荷時の設定を復元することができる.
2.2システムuiで判定を開始する:
SystemServer.java
+if(isFirst()){ + try { + startSystemUi(context); + } catch (Throwable e) { + reportWtf("starting System UI", e); + } + }else{ + Slog.i(TAG, "Do not startSystemUi"); + }
+ private boolean isFirst(){ + File file = new File(path); + if (file.exists()) { + return true; + } + return false; + }
SystemUIApplication.java
- if (mServicesStarted) { - final int N = mServices.length; - for (int i = 0; i < N; i++) { - mServices[i].onBootCompleted(); - } - } + if(isFirst()){ + if (mServicesStarted) { + final int N = mServices.length; + for (int i = 0; i < N; i++) { + mServices[i].onBootCompleted(); + } + }++ } +
if (mServicesStarted) { return; } + if(!isFirst()){ + Log.d(TAG, "do not startServicesIfNeeded"); + return; + }else{ + Log.d(TAG, "startServicesIfNeeded"); + }
- if (mServicesStarted) { + if (mServicesStarted && isFirst()) { int len = mServices.length; for (int i = 0; i < len; i++) { mServices[i].onConfigurationChanged(newConfig);
SystemUIService.java
@Override public void onCreate() { super.onCreate(); - ((SystemUIApplication) getApplication()).startServicesIfNeeded(); + if(isFirst()){ + ((SystemUIApplication) getApplication()).startServicesIfNeeded(); + }else{++ } + } @Override @@ -38,21 +45,33 @@ public class SystemUIService extends Service { @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - SystemUI[] services = ((SystemUIApplication) getApplication()).getServices(); - if (args == null || args.length == 0) { - for (SystemUI ui: services) { - pw.println("dumping service: "+ ui.getClass().getName()); - ui.dump(fd, pw, args); - } - } else { - String svc = args[0]; - for (SystemUI ui: services) { - String name = ui.getClass().getName(); - if (name.endsWith(svc)) { - ui.dump(fd, pw, args); - } - } - } + if(isFirst()){ + SystemUI[] services = ((SystemUIApplication) getApplication()).getServices(); + if (args == null || args.length == 0) { + for (SystemUI ui: services) { + pw.println("dumping service: "+ ui.getClass().getName()); + ui.dump(fd, pw, args); + } + } else { + String svc = args[0]; + for (SystemUI ui: services) { + String name = ui.getClass().getName(); + if (name.endsWith(svc)) { + ui.dump(fd, pw, args); + } + } + } + } + }
2.3シールドロック
frameworks/base/packages/SystemUI/res/values/config.xml
false
以上の変更により、工場出荷時の設定を復元するシステムUIをマスクすることができる.
ソリューション2:
こんな操作があるなんて.意外です.
/**
* Uses Root access to enable and disable SystemUI.
* @param enabled Decide whether to enable or disable.
*/
public void setSystemUIEnabled(boolean enabled){
try {
Process p = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(p.getOutputStream());
os.writeBytes("pm " + (enabled ? "enable" : "disable")
+ " com.android.systemui
");
os.writeBytes("exit
");
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
setSystemUIEnabled(true); // Enable SystemUI
setSystemUIEnabled(false); // Disable SystemUI