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