在Nexus 7的使用中,發(fā)現(xiàn)使用常規(guī)的root方法,經(jīng)常會被超級用戶管理程序(如superuser,360root等)的更新給破壞掉。這樣導致的結(jié)果是需要再次對系統(tǒng)進行root操作。為了長期的獲取root權(quán)限,準備通過直接修改Android的安全屬性的方式,獲取較高的安全管理權(quán)限。但是這個與目前的root做法是否相同,就不得而知,但是唯一的好處是獲取這些安全管理權(quán)限以后,再次通過現(xiàn)有的root工具,可以很容易的完成root工作。
系統(tǒng)正常開機后,可以在文件系統(tǒng)的根目錄下看到default.prop文件,以及在system目錄下看到build.prop文件。在這兩個文件中,涉及了大量的系統(tǒng)屬性的設置。其中與安全管理相關(guān)的項目,主要存放在default.prop下,F(xiàn)以Nexus 7 Android 5.1.1的default.prop內(nèi)容實例說明。
#
# ADDITIONAL_DEFAULT_PROPERTIES
#
ro.secure=1(說明使用安全的操作,修改為0)
ro.allow.mock.location=0
ro.debuggable=0(不允許調(diào)試的操作,修改為1)
persist.sys.usb.config=mtp(,adb --- 開機后默認的USB連接方式為MTP模式,增加usb連接方式)
ro.adb.secure=1(即使使用adb調(diào)試,也有安全限制,修改為0)
ro.zygote=zygote32
dalvik.vm.dex2oat-Xms=64m
dalvik.vm.dex2oat-Xmx=512m
dalvik.vm.image-dex2oat-Xms=64m
dalvik.vm.image-dex2oat-Xmx=64m
ro.dalvik.vm.native.bridge=0
default文件存放在boot.img中,需要使用一個bootimg的工具進行拆包和重新打包工作。這個工具可以通過安裝完美刷機軟件得到(在完美刷機軟件的安裝目錄中,可以把這個完美刷機工具包整體復制到其它目錄下,以方便使用)。

在其tools目錄下,還有更多的工具可用。包括常用的adb連接工具,壓縮工具,設備安裝程序等。其中fastboot.exe 就是一種常用的刷機工具,用于在支持fastboot的設備上,把系統(tǒng)映像文件(boot.img,system.img等)寫入到設備中。

將Nexus 7 Android 5.1.1安裝包 全部展開,可以得到以下的文件:

其中幾個flash-all的文件,分別對應Windows和Linux下的刷機腳本。 而幾個映像文件(.img)就是要寫入Nexus 7的系統(tǒng)文件,燒寫的順序和方法在flash-all腳本中描述如下:
@ECHO OFF
:: Copyright 2012 The Android Open Source Project
::
:: Licensed under the Apache License, Version 2.0 (the "License");
:: you may not use this file except in compliance with the License.
:: You may obtain a copy of the License at
::
:: http://www.apache.org/licenses/LICENSE-2.0
::
:: Unless required by applicable law or agreed to in writing, software
:: distributed under the License is distributed on an "AS IS" BASIS,
:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
:: See the License for the specific language governing permissions and
:: limitations under the License.
rem 下面是添加 fastboot 以及ping 命令的路徑。
PATH=%PATH%;"%SYSTEMROOT%\System32"
rem 設備解鎖,才可以進行后續(xù)燒寫操作。
fastboot oem unlock
rem 后續(xù)擦除原有系統(tǒng) === 也可以不擦除,如果不怕出錯的話。 分別是引導區(qū),高速緩沖,恢復,系統(tǒng),用戶數(shù)據(jù)區(qū)等。
fastboot erase boot
fastboot erase cache
fastboot erase recovery
fastboot erase system
fastboot erase userdata
rem 燒寫設備冷啟動引導程序并重啟系統(tǒng)
fastboot flash bootloader bootloader-grouper-4.23.img
fastboot reboot-bootloader
rem 檢查本地連接是否正常 - 這是在設備重啟之后的動作。
ping -n 10 127.0.0.1 >nul
rem 把固件寫入到設備中。這里使用的是update命令,把系統(tǒng)壓縮包直接更新。
fastboot -w update image-nakasi-lmy47v.zip
rem 完成后重啟設備,完成刷機工作。
echo Press any key to exit...
pause >nul
exit
如果不需要擦除全部數(shù)據(jù),而只是更新個別分區(qū),則使用單獨的命令行進行。如僅更新system分區(qū),命令如下:
D:\APKide\tools>fastboot flash system system.img
這樣就可以完成單個分區(qū)的寫入。這樣寫入的速度雖然快速,但是存在系統(tǒng)不穩(wěn)定的風險,因此一般情況下把所有分區(qū)按順序?qū)懭氲皆O備中,然后在執(zhí)行重啟動作,完成刷機過程。
下面是使用bootimg工具對boot.img進行修改的過程。這個過程參考別人的操作經(jīng)驗(http://www.cnblogs.com/weisenz/archive/2012/03/30/2425452.html)進行的。但是可能是工具版本的不同,有部分地方需要做修訂才能進行下去。
1. boot.img解包過程。命令為: bootimg --unpack-bootimg。該命令默認尋找當前目錄下boot.img文件進行分解。操作后會出現(xiàn)以下關(guān)于boot.img的結(jié)構(gòu)信息,如base,ramdisk_addr,second_addr,tags_addr,page_size,...,這些信息必須記錄,在修改完成后再次打包時,需要繼續(xù)使用。如果需要了解這些信息的具體意義,可以在網(wǎng)上搜索關(guān)于Android boot.img文件結(jié)構(gòu)的詳細介紹資料,這里不再詳細敘述。

(這里有一點需要說明,這里給出的page_size和padding_size的值都是錯的,實際值應該是4096,而不是2048。按照2048制作的boot.img在寫入后會導致可用Flash空間少了整整一半,13.2GB可用空間變成了6.2GB了。這個問題查了兩天才搞清楚。至于這個數(shù)據(jù)為啥出錯,原因還沒搞清楚。)
操作完成后,會在當前目錄下生成一個initrd的目錄,以及cpiolist.txt,以及kernel,ramdisk.gz等文件。這些文件是否存在取決于在原始文件打包時是否包括了這些不同的部分。當前目錄的內(nèi)容列表如下:

其中,c[iolist.txt是ramdisk映像與拆解后的單獨文件和目錄的結(jié)構(gòu)描述文檔,內(nèi)容如下:
compress_level:6slink charger /sbin/healthd 0644
dir data 0771
file default.prop initrd/default.prop 0644
dir dev 0755
file file_contexts initrd/file_contexts 0644
file fstab.grouper initrd/fstab.grouper 0640
file init initrd/init 0750
file init.environ.rc initrd/init.environ.rc 0750
file init.grouper.rc initrd/init.grouper.rc 0750
file init.grouper.usb.rc initrd/init.grouper.usb.rc 0750
file init.rc initrd/init.rc 0750
file init.trace.rc initrd/init.trace.rc 0750
file init.usb.rc initrd/init.usb.rc 0750
file init.zygote32.rc initrd/init.zygote32.rc 0750
dir proc 0755
file property_contexts initrd/property_contexts 0644
dir sbin 0750
file sbin/adbd initrd/sbin\adbd 0750
file sbin/healthd initrd/sbin\healthd 0750
slink sbin/ueventd ../init 0750
slink sbin/watchdogd ../init 0750
file seapp_contexts initrd/seapp_contexts 0644
file selinux_version initrd/selinux_version 0644
file sepolicy initrd/sepolicy 0644
file service_contexts initrd/service_contexts 0644
dir sys 0755
dir system 0755
file ueventd.grouper.rc initrd/ueventd.grouper.rc 0644
file ueventd.rc initrd/ueventd.rc 0644
這里面把主要壓縮級別,鏈接關(guān)系,目錄結(jié)構(gòu),文件權(quán)限等都做了詳細說明。這是boot.img的磁盤結(jié)構(gòu)。
把ramdisk.gz 展開到initrd的目錄內(nèi)容如下,其中準備修改的default.prop就在其中。

按照前面的說明,對default.prop的內(nèi)容進行修改并保存,就可以開始重新打包的工作了。
2. 重新打包。 先刪除現(xiàn)有的ramdisk.gz,然后使用命令
bootimg --repack-bootimg 0x10000000 "" 2048 (正確值應該是4096) 2048(正確值應該是4096) cpiolist.txt
上述命令中,bootimg --repack-bootimg 是重新打包boot.img的命令。0x10000000是在拆包是輸出的基地址(base),后續(xù)的“”是一個空白的執(zhí)行命令行,拆包時如果CMD位置有內(nèi)容,需要照樣搬來放在這個地方。第一個2048 是page_size,第二個2048是pendding_size。最后是cpiolist文件的名稱。

該命令執(zhí)行后得到一個boot-new.img的文件。而原有的boot.img 被修改為boot-old.img保存起來。

以上過程完成后,就可以把新生成的文件boot-new.img作為修改后的引導區(qū)寫入到設備中,修改工作完成。
為了驗證是否有效,需要重新燒寫system分區(qū)(使用修改過的跳過開機網(wǎng)絡需求的system.img)以及userdata分區(qū)。燒寫完成后開機,可以看到ADB 功能已經(jīng)打開,可以直接與PC相連。進入adb shell后,可以通過getprop 命令檢查各種信息?梢钥吹角懊鎸oot.img中的default.prop的修改成功。
系統(tǒng)的存儲使用情況如下:
這個與原始固件的存儲空間大小一致。
至此,這個boot.img修改工作基本完成。
|