【實現邏輯】 通過在property_service.c中設置標志位,在設置中實現接口改變標志位, 使用init.rc中聲明的服務來偵聽標志位的變化,顯式啟動聲明的服務,執行對應的腳本,把應用后綴從apk重命名為bak,從而實現隱藏(顯示邏輯相反)。
【實現步驟】以隱藏Google Play Store(system/priv-app/Phonesky.apk)為例: 1.首先在system/core/init/property_service.c中聲明并初始化標志位,0為隱藏,1為顯示,默認隱藏
1 2 3 | ????? { 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 ①聲明和初始化:
1 2 3 | private static final String SHOW_PHONESKY = show_phonesky; private CheckBoxPreference mShowPhonesky; mShowPhonesky = findAndInitCheckboxPref(SHOW_PHONESKY); |
②CheckBox的邏輯:
1 2 3 4 5 6 7 8 9 | ??????? (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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | ????? android:targetClass=com.android.settings.SetFullBackupPassword /> ????? ?+?????? <checkboxpreference android:key= "show_phonesky" android:title= "@string/show_phonesky" > ????? <checkboxpreference pre= "" > ④添加對應語言的string字符:<pre class = "brush:java;" ><string name= "show_phonesky" >Show Google Play Store</string></pre> <br> <br> ⑤設置中新增一個監聽,初始化Checkbox的邏輯: packages/apps/Settings/src/com/android/settings/BootReceiver.java 內容如下: <pre class = "brush: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 );???? ??????????????? } ?????????? } ????? } }</pre> <br> <br> ⑥在Settings的AndroidManifest文件中添加BroadcastReceiver的權限和聲明: <pre class = "brush:java;" ><uses-permission android:name= "android.permission.RECEIVE_BOOT_COMPLETED/" > </uses-permission></pre> <br> 3 .在init.rc中添加對應的服務和觸發條件: 路徑:mediatek/config/esky27_tb_ccn_mlc_kk/init.rc <pre class = "brush:java;" >+# 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</pre> <br> <br> 4 .隱藏和顯示應用的腳本: 隱藏應用:vendor/ThirdParty/App/dte/hidePhonesky 內容:<br> <pre class = "brush:java;" >#!/system/bin/sh #!/system/bin/busybox mount -o remount,rw /system; mv /system/priv-app/Phonesky.apk /system/priv-app/Phonesky.bak</pre> <br> 顯示應用:vendor/ThirdParty/App/dte/showPhonesky<br> 內容:<br> <pre class = "brush:java;" >#!/system/bin/sh #!/system/bin/busybox mount -o remount,rw /system; mv /system/priv-app/Phonesky.bak /system/priv-app/Phonesky.apk</pre> <br> <br> 5 .拷貝腳本到system/bin目錄下: 參考以下格式添加到對應的mk文件: <pre class = "brush:java;" >+#添加重命名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</pre> </checkboxpreference></checkboxpreference><br> <br> <br> <br> <br> |
結伴旅游,一個免費的交友網站:www.jieberu.com
init程序的啟動流程。推推族,免費得門票,游景區:www.tuituizu.com