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

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

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

其中幾個(gè)flash-all的文件,分別對(duì)應(yīng)Windows和Linux下的刷機(jī)腳本。 而幾個(gè)映像文件(.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 設(shè)備解鎖,才可以進(jìn)行后續(xù)燒寫操作。
fastboot oem unlock
rem 后續(xù)擦除原有系統(tǒng) === 也可以不擦除,如果不怕出錯(cuò)的話。 分別是引導(dǎo)區(qū),高速緩沖,恢復(fù),系統(tǒng),用戶數(shù)據(jù)區(qū)等。
fastboot erase boot
fastboot erase cache
fastboot erase recovery
fastboot erase system
fastboot erase userdata
rem 燒寫設(shè)備冷啟動(dòng)引導(dǎo)程序并重啟系統(tǒng)
fastboot flash bootloader bootloader-grouper-4.23.img
fastboot reboot-bootloader
rem 檢查本地連接是否正常 - 這是在設(shè)備重啟之后的動(dòng)作。
ping -n 10 127.0.0.1 >nul
rem 把固件寫入到設(shè)備中。這里使用的是update命令,把系統(tǒng)壓縮包直接更新。
fastboot -w update image-nakasi-lmy47v.zip
rem 完成后重啟設(shè)備,完成刷機(jī)工作。
echo Press any key to exit...
pause >nul
exit
如果不需要擦除全部數(shù)據(jù),而只是更新個(gè)別分區(qū),則使用單獨(dú)的命令行進(jìn)行。如僅更新system分區(qū),命令如下:
D:\APKide\tools>fastboot flash system system.img
這樣就可以完成單個(gè)分區(qū)的寫入。這樣寫入的速度雖然快速,但是存在系統(tǒng)不穩(wěn)定的風(fēng)險(xiǎn),因此一般情況下把所有分區(qū)按順序?qū)懭氲皆O(shè)備中,然后在執(zhí)行重啟動(dòng)作,完成刷機(jī)過程。
下面是使用bootimg工具對(duì)boot.img進(jìn)行修改的過程。這個(gè)過程參考別人的操作經(jīng)驗(yàn)(http://www.cnblogs.com/weisenz/archive/2012/03/30/2425452.html)進(jìn)行的。但是可能是工具版本的不同,有部分地方需要做修訂才能進(jìn)行下去。
1. boot.img解包過程。命令為: bootimg --unpack-bootimg。該命令默認(rèn)尋找當(dāng)前目錄下boot.img文件進(jìn)行分解。操作后會(huì)出現(xiàn)以下關(guān)于boot.img的結(jié)構(gòu)信息,如base,ramdisk_addr,second_addr,tags_addr,page_size,...,這些信息必須記錄,在修改完成后再次打包時(shí),需要繼續(xù)使用。如果需要了解這些信息的具體意義,可以在網(wǎng)上搜索關(guān)于Android boot.img文件結(jié)構(gòu)的詳細(xì)介紹資料,這里不再詳細(xì)敘述。

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

其中,c[iolist.txt是ramdisk映像與拆解后的單獨(dú)文件和目錄的結(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
這里面把主要壓縮級(jí)別,鏈接關(guān)系,目錄結(jié)構(gòu),文件權(quán)限等都做了詳細(xì)說明。這是boot.img的磁盤結(jié)構(gòu)。
把ramdisk.gz 展開到initrd的目錄內(nèi)容如下,其中準(zhǔn)備修改的default.prop就在其中。

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

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

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