Android5.1修改以太网MAC地址(SElinux)
點(diǎn)擊打開鏈接
最近高通平臺(tái)Android5.1項(xiàng)目中有個(gè)關(guān)于設(shè)置以太網(wǎng)MAC的需求,大致流程是windows寫到一塊flash片區(qū)去保存序列號(hào)和以太網(wǎng)MAC地址,然后Android客戶端通過(guò)相關(guān)接口去讀取該字符串并加以顯示,需要將其MAC地址同步到Android系統(tǒng)中MAC地址。
首先我加了個(gè)設(shè)備信息顯示序列號(hào)和以太網(wǎng)的應(yīng)用程序,通過(guò)LOCAL_JAVA_LIBRARIES加載所需要加載的相關(guān)接口庫(kù),然后再manifest中通過(guò)<uses-library></uses-library>加載相關(guān)聲明(注:此聲明在application節(jié)點(diǎn)下)。這樣一來(lái)我們的應(yīng)用層可以正常讀取相關(guān)flash片區(qū)的保存的內(nèi)容了。
那么后面問(wèn)題來(lái)了,我們?nèi)绾瓮紸ndroid系統(tǒng)內(nèi)的保存的以太網(wǎng)的MAC地址呢?通過(guò)網(wǎng)上查詢相關(guān)資料文獻(xiàn)發(fā)現(xiàn),我們可以通過(guò)執(zhí)行相關(guān)Linux命令得到結(jié)果。通過(guò)串口執(zhí)行相關(guān)命令發(fā)現(xiàn)如下命令是可以有效的修改Android5.1的/sys/class/net/eth0/address內(nèi)保存的地址的:
netcfg(ifconfig) eth0 down
netcfg eth0 hwaddr 10:10:10:10:10:10
netcfg(ifconfig) eth0 up
所以通過(guò)增加Java代碼執(zhí)行這三條命令即可:
private void executeCMD(String cmd){
try {
? ? ? ? ? ?Log.w(TAG, "cmd= " +cmd);
? ? ? ? ? ?Runtime runtime = Runtime.getRuntime();
? ? ? ? ? ?Process proc = runtime.exec(cmd);
? ? ? ?} catch (IOException e) {
? ? ? ? ? ?Log.w(TAG, "exe fail!!!!");
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
}
我們依次執(zhí)行上述三條linux命令應(yīng)該就可達(dá)到我們的需求。Okay,基本邏輯已經(jīng)完成,下面進(jìn)入調(diào)試階段,筆者調(diào)試的是項(xiàng)目中的產(chǎn)品MSM8909 Android5.1的一款平板電腦。當(dāng)我們編譯結(jié)束后,通過(guò)運(yùn)行應(yīng)用程序查看日志發(fā)現(xiàn)我們的應(yīng)用確實(shí)已經(jīng)讀取到了保存的序列號(hào)和MAC地址,可是后面設(shè)置系統(tǒng)MAC地址時(shí)報(bào)了Permission Denied!那么這樣一來(lái),就進(jìn)入了Android權(quán)限的賦予和調(diào)試的階段。首先,我們需要給我們的apk是system apk,于是我將其放到系統(tǒng)/system/app下,后面運(yùn)行發(fā)現(xiàn)仍然報(bào)IOExeption:Permission Denied!那么后面我在manifest中加入了android:sharedUserId="android.uid.system"讓其運(yùn)行的進(jìn)程uid為system,然后需要給其簽名platform證書,我也對(duì)其進(jìn)行了相關(guān)的簽名。后面抱著滿滿的信息去調(diào)試的時(shí)候發(fā)現(xiàn)又有新的權(quán)限異常,后面便進(jìn)入了Adnroid5.1引入的SElinux相關(guān)的權(quán)限調(diào)試當(dāng)中,過(guò)濾有效日志如下:
avc: denied { net_admin } for capability=12 scontext=u:r:system_app:s0 tcontext=u:r:system_app:s0?
tclass=capability permissive=0
如此avc權(quán)限問(wèn)題一般都是selinux相關(guān)的問(wèn)題所在,selinux中我們的解決思路就是缺什么權(quán)限我們就加什么權(quán)限,這樣至少不會(huì)導(dǎo)致權(quán)限的亂序了。關(guān)于selinux的賦權(quán)都在源碼目錄/external/sepolicy/文件下進(jìn)行代碼編輯,下面我們順藤摸瓜找到我們的system_app的權(quán)限配置文件(system_app.te),加上對(duì)日志的理解我們嘗試著加入為我們的apk賦權(quán)的語(yǔ)句:
allow system_app system_app:capability { net_admin };
對(duì)于此語(yǔ)句的語(yǔ)法我們可以網(wǎng)上百度或者參照原本有的內(nèi)容進(jìn)行理解,allow后面跟的幾個(gè)參數(shù)分別是scontext(表示一個(gè)group),后面跟上需要為此組所添加的權(quán)限,分別是tcontext和tclass和權(quán)限的名稱(關(guān)于權(quán)限的分類我們可以參考out/target/product/msm8909/obj/ETC/sepolicy_intermediates/policy.conf相關(guān)即可。好了,做完這步我們需要重新編譯內(nèi)核bootimage進(jìn)行燒寫。抱著滿滿的自信心進(jìn)行編譯,結(jié)果發(fā)現(xiàn)天哪竟然編譯不過(guò),看看服務(wù)器報(bào)的錯(cuò)誤信息發(fā)現(xiàn),也就是說(shuō)在app.tc中不允許添加類似的capability相關(guān)類的權(quán)限,我們進(jìn)入app.tc中發(fā)現(xiàn)如下語(yǔ)句:
neverallow { appdomain -bluetooth } self:capability *;
初步的理解是絕不能允許appdomain除了是bluetooth group的,而我們的system_app.tc中恰好定義了appdomain,那么我們大膽的理解我們可以在app.tc中將我們的group也加進(jìn)去就行啦。于是就有下面的修改:
neverallow { appdomain -bluetooth -system_app} self:capability *;
Okay , 大功告成,再次對(duì)內(nèi)核進(jìn)行編譯。哈哈,竟然編譯通過(guò)了,這時(shí)候感覺(jué)比之前的每次調(diào)試都更加信心滿滿了。拷貝出bootimage后進(jìn)行燒錄,重啟,運(yùn)行,查看日志,netcfg查看以太網(wǎng)MAC地址。哈哈,Android系統(tǒng)的MAC地址已經(jīng)改為我所讀出來(lái)的MAC地址了,此項(xiàng)需求圓滿結(jié)束!
通過(guò)此次的需求變更,這讓我對(duì)Android5.1的SElinux又有了更加深層次的認(rèn)識(shí)了。遇到問(wèn)題,不慌不忙,我們慢慢的分析問(wèn)題,定位問(wèn)題,解決問(wèn)題(離不開對(duì)日志的重要信息的提取和理解)。
總結(jié)
以上是生活随笔為你收集整理的Android5.1修改以太网MAC地址(SElinux)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Adb shell命令打电话测试4G
- 下一篇: 修改 framework 代码的经验和踩