標籤:android init.rc shell 設定 開發人員選項
【實現邏輯】通過在property_service.c中設定標誌位,在設定中實現介面改變標誌位,使用init.rc中聲明的服務來偵聽標誌位的變化,顯式啟動聲明的服務,執行對應的指令碼,把應用尾碼從apk重新命名為bak,從而實現隱藏(顯示邏輯相反)。
【實現步驟】以隱藏Google Play Store(system/priv-app/Phonesky.apk)為例:1.首先在system/core/init/property_service.c中聲明並初始化標誌位,0為隱藏,1為顯示,預設隱藏
{ "app.launcher.start", AID_SYSTEM, 0},+ { "app.phonesky.show", AID_SYSTEM, 0}, //Add By zj { "cdma.", AID_RADIO, 0 }, //Add by gfzhu VIA
2.在設定的開發人員選項中實現對應的介面:檔案路徑:packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java①聲明和初始化:
private static final String SHOW_PHONESKY = "show_phonesky";private CheckBoxPreference mShowPhonesky;mShowPhonesky = findAndInitCheckboxPref(SHOW_PHONESKY);
②CheckBox的邏輯:
(BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB) : 0);+ } else if (preference == mShowPhonesky) { // ZJ Add+ if(mShowPhonesky.isChecked())+ {+ SystemProperties.set("app.phonesky.show","1");+ }else{+ SystemProperties.set("app.phonesky.show","0");+ } } else if (preference == mBtHciSnoopLog) {
③增加一個Preference:packages/apps/Settings/res/xml/development_prefs.xml
android:targetClass="com.android.settings.SetFullBackupPassword" /> </PreferenceScreen>+ <CheckBoxPreference + android:key="show_phonesky" + android:title="@string/show_phonesky" + /> <CheckBoxPreference
④添加對應語言的string字元:
<string name="show_phonesky">Show Google Play Store</string>
⑤設定中新增一個監聽,初始化Checkbox的邏輯:packages/apps/Settings/src/com/android/settings/BootReceiver.java內容如下:
package com.android.settings;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.os.SystemClock;import android.util.Log;import android.os.SystemProperties;public class BootReceiver extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub String action = arg1.getAction(); if(action.equals(Intent.ACTION_BOOT_COMPLETED)) { SharedPreferences shared = arg0.getSharedPreferences("com.android.settings_preferences", Context.MODE_PRIVATE); boolean show_phonesky = shared.getBoolean("show_phonesky", false); if(show_phonesky){ SystemProperties.set("app.phonesky.show","1"); }else{ SystemProperties.set("app.phonesky.show","0"); } } }}
⑥在Settings的AndroidManifest檔案中添加BroadcastReceiver的許可權和聲明:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><receiver android:name=".BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>
3.在init.rc中添加對應的服務和觸發條件:路徑:mediatek/config/esky27_tb_ccn_mlc_kk/init.rc
+# ZJ Add START+#Hide or Show Google Play Dynamicly+#disabled:服務不會自動運行,必須顯式地通過伺服器來啟動。+#oneshot:當此服務退出時不會自動重啟。+service hidePhonesky /system/bin/hidePhonesky+ disabled+ oneshot +service showPhonesky /system/bin/showPhonesky+ disabled+ oneshot +#on property:sys.boot_completed=1+# start renamePhonesky+on property:app.phonesky.show=1+ start showPhonesky+on property:app.phonesky.show=0+ start hidePhonesky+# ZJ Add END
4.隱藏和顯示應用的指令碼:隱藏應用:vendor/ThirdParty/App/dte/hidePhonesky內容:
#!/system/bin/sh#!/system/bin/busyboxmount -o remount,rw /system;mv /system/priv-app/Phonesky.apk /system/priv-app/Phonesky.bak
顯示應用:vendor/ThirdParty/App/dte/showPhonesky
內容:
#!/system/bin/sh#!/system/bin/busyboxmount -o remount,rw /system;mv /system/priv-app/Phonesky.bak /system/priv-app/Phonesky.apk
5.拷貝指令碼到system/bin目錄下:參考以下格式添加到對應的mk檔案:
+#添加重新命名GooglePlay指令碼+PRODUCT_COPY_FILES += + vendor/ThirdParty/App/dte/hidePhonesky:system/bin/hidePhonesky + vendor/ThirdParty/App/dte/showPhonesky:system/bin/showPhonesky + vendor/ThirdParty/App/dte/Phonesky.bak:system/priv-app/Phonesky.bak
Android使用init.rc觸發指令碼實現隱藏內建應用程式