編輯:關於android開發
最近工作中,需要開發一個功能----聯網控制,這個功能其實用過root的安卓機應該都知道,禁止某個應用連接移動網絡或者wifi。
root後,通過su去執行iptable的命令就可以根據uid去控制應用聯網權限
但是由於公司是做手機系統開發,手機生產出來不允許帶有root權限,所以我們完成這個功能也是不可以使用root權限去實現的。
由於第一次做這種功能,剛開始我居然天真的以為系統中帶有這種控制權限的接口,然後只有個Internet權限,無法區分數據流量和wifi。
嗯,直接上最終實現的方式。
當時發現手機上有個功能是限制應用後台數據流量,該功能如其所述就是限制應用在後台狀態下無法使用流量。通過代碼追溯,找到其調用到的是一個 NetworkManagementService.java 這個Service,方法就是下面這個,裡面的mConnector就是用來封裝發送命令的類。有興趣的可以自己去看一下 ---> NativeDaemonConnector.java
@Override
public void setUidNetworkRules(int uid, boolean rejectOnQuotaInterfaces) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
// silently discard when control disabled
// TODO: eventually migrate to be always enabled
if (!mBandwidthControlEnabled) return;
synchronized (mQuotaLock) {
final boolean oldRejectOnQuota = mUidRejectOnQuota.get(uid, false);
if (oldRejectOnQuota == rejectOnQuotaInterfaces) {
// TODO: eventually consider throwing
return;
}
try {
mConnector.execute("bandwidth",
rejectOnQuotaInterfaces ? "addnaughtyapps" : "removenaughtyapps", uid);
if (rejectOnQuotaInterfaces) {
mUidRejectOnQuota.put(uid, true);
} else {
mUidRejectOnQuota.delete(uid);
}
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
}
}
通過搜索addnaughtyapps這個關鍵字,在 CommandListener.cpp 這個類中找到了解析這個命令的地方,
if (!strcmp(argv[1], "addnaughtyapps") || !strcmp(argv[1], "ana")) {
if (argc < 3) {
sendGenericSyntaxError(cli, "addnaughtyapps <appUid> ...");
return 0;
}
int rc = sBandwidthCtrl->addNaughtyApps(argc - 2, argv + 2);
sendGenericOkFail(cli, rc);
return 0;
}
最終在BandwidthController.cpp這個類中執行操作iptable的命令,
Ok,既然這個Service擁有直接執行iptable的權限,那麼我們就直接在裡面添加我們需要的方法不就OK了嗎。
因此,
1. 在CommandListener.cpp 中加入過濾關鍵字的判斷,
2. 在NetworkManagementService.java中加入接口去發送命令,
3. 最終實現在BandwidthController.cpp 中進行。
第三步主要就是iptable的操作了,如何使用網上很多,不過當時我還真是看了好久才弄懂iptable的操作......用到的主要就是 -I 和 -D 命令。
其實比起這些,我更好奇netd 進程是如何擁有執行root命令的權限的。等有空了一定要研究下。
目前只知道在init.rc中可以配置以root權限去啟動service。
Android 博客園客戶端 (五) 查看評論、搜索博主,android查看評論
Android 博客園客戶端 (五) 查看評論、搜索博主,android查看評論項目地址:https://github.com/ZhangTingkuo/AndroidC
Android應用開發教程之四:TextView詳解
TextView的API 中文文檔中說明了它的結構: 結構 java.lang.Object android.view.View andro
Android特效專輯(六)——仿QQ聊天撒花特效,無形裝逼,最為致命
Android特效專輯(六)——仿QQ聊天撒花特效,無形裝逼,最為致命 Android特效專輯(六)——仿QQ聊天撒花特效,無形裝逼,最為致命
安卓第十天筆記-fragment,安卓-fragment
安卓第十天筆記-fragment,安卓-fragment安卓第十天筆記-fragment Fragment(片段) 一.Fragment簡介 *Fragment是3.0引