最近工作中,需要開發(fā)一個(gè)功能----聯(lián)網(wǎng)控制,這個(gè)功能其實(shí)用過(guò)root的安卓機(jī)應(yīng)該都知道,禁止某個(gè)應(yīng)用連接移動(dòng)網(wǎng)絡(luò)或者wifi。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、成都做網(wǎng)站、泰安網(wǎng)絡(luò)推廣、小程序設(shè)計(jì)、泰安網(wǎng)絡(luò)營(yíng)銷、泰安企業(yè)策劃、泰安品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供泰安建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.chinadenli.net
root后,通過(guò)su去執(zhí)行iptable的命令就可以根據(jù)uid去控制應(yīng)用聯(lián)網(wǎng)權(quán)限
但是由于公司是做手機(jī)系統(tǒng)開發(fā),手機(jī)生產(chǎn)出來(lái)不允許帶有root權(quán)限,所以我們完成這個(gè)功能也是不可以使用root權(quán)限去實(shí)現(xiàn)的。
由于第一次做這種功能,剛開始我居然天真的以為系統(tǒng)中帶有這種控制權(quán)限的接口,然后只有個(gè)Internet權(quán)限,無(wú)法區(qū)分?jǐn)?shù)據(jù)流量和wifi。
嗯,直接上最終實(shí)現(xiàn)的方式。
當(dāng)時(shí)發(fā)現(xiàn)手機(jī)上有個(gè)功能是限制應(yīng)用后臺(tái)數(shù)據(jù)流量,該功能如其所述就是限制應(yīng)用在后臺(tái)狀態(tài)下無(wú)法使用流量。通過(guò)代碼追溯,找到其調(diào)用到的是一個(gè) NetworkManagementService.java 這個(gè)Service,方法就是下面這個(gè),里面的mConnector就是用來(lái)封裝發(fā)送命令的類。有興趣的可以自己去看一下 ---> 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();
}
}
}
通過(guò)搜索addnaughtyapps這個(gè)關(guān)鍵字,在 CommandListener.cpp 這個(gè)類中找到了解析這個(gè)命令的地方,

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這個(gè)類中執(zhí)行操作iptable的命令,
Ok,既然這個(gè)Service擁有直接執(zhí)行iptable的權(quán)限,那么我們就直接在里面添加我們需要的方法不就OK了嗎。
因此,
1. 在CommandListener.cpp 中加入過(guò)濾關(guān)鍵字的判斷,
2. 在NetworkManagementService.java中加入接口去發(fā)送命令,
3. 最終實(shí)現(xiàn)在BandwidthController.cpp 中進(jìn)行。
第三步主要就是iptable的操作了,如何使用網(wǎng)上很多,不過(guò)當(dāng)時(shí)我還真是看了好久才弄懂iptable的操作......用到的主要就是 -I 和 -D 命令。
其實(shí)比起這些,我更好奇netd 進(jìn)程是如何擁有執(zhí)行root命令的權(quán)限的。等有空了一定要研究下。
目前只知道在init.rc中可以配置以root權(quán)限去啟動(dòng)service。
網(wǎng)頁(yè)題目:framework層和native層實(shí)現(xiàn)聯(lián)網(wǎng)控制(iptable方式)
轉(zhuǎn)載來(lái)源:http://www.chinadenli.net/article36/isphsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、外貿(mào)建站、服務(wù)器托管、響應(yīng)式網(wǎng)站、ChatGPT、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)