永久root帶文件linux
由於開發須要,我常常會用到adb這個工具(Android Debug Bridge),咱們都知道adb shell默認是沒有root權限的,修改系統文件就很不方便了,adb push一個文件就提示Permission Denied。刪除system下的文件也沒有權限。其實有兩種方法能夠獲取adb shell的root權限,這兩種方法的前提都是手機已經root。 一、用su能夠提權,直接執行su就會看到用戶命令提示符由」$」變成了」#」,若是手機沒有root,會提示su: Permission Denied。這個文件不是每一個手機都有的,能夠百度。 解壓後把su放在adb同一目錄下,執行:android
adb push su /system/bin/adb shell chmod4755/system/bin/sushell
若是提示Read-only filesystem,那麼就要從新掛載一下/system,把只讀掛載成可讀寫,只有手機root了才能運行:安全
mount -o remount,rw/dev/block/mtdblock0/system /less
再運行su就能讓adb shell獲取root權限了。 二、能夠修改根目錄下的default.prop提權: 根目錄默認是不容許修改的,執行工具
mount -o remount,rw rootfs/ui
用vi打開default.prop,找到ro.secure,修改成ro.secure=0,保存後重啓,再adb shell一下,就會有root權限了。 方法:this
修改./default.propspa
把ro.secure設爲0,persist.service.adb.enable設爲1,adbd進程就會以root用戶的身份啓動。debug
其實兩篇文章大致效果不一樣,這個是徹底破除限制,下文只是部分 至於文中所提到的su文件,是指被修改過的,無任何驗證的,這樣安全性大大下降,推薦完整root前,先備份原su文件。
原理:
能夠看一下Android系統根目錄下的/init.rc的片斷:
... ...
# adbd is controlled by the persist.service.adb.enable system property
service adbd /sbin/adbd
disabled
# adbd on at boot in emulator
on property:ro.kernel.qemu=1
start adbd
on property:persist.service.adb.enable=1
start adbd
on property:persist.service.adb.enable=0
stop adbd
... ...
這裏定義了一個觸發器,只要persist.service.adb.enable值被置爲1,就會啓動/sbin/adbd。
在build目錄下搜索一下,發現了main.mk中有這樣的代碼片斷
## user/userdebug ##
user_variant := $(filter userdebug user,$(TARGET_BUILD_VARIANT))
enable_target_debugging := true
ifneq (,$(user_variant))
# Target is secure in user builds.
ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1
tags_to_install := user
ifeq ($(user_variant),userdebug)
# Pick up some extra useful tools
tags_to_install += debug
else
# Disable debugging in plain user builds.
enable_target_debugging :=
endif
# TODO: Always set WITH_DEXPREOPT (for user builds) once it works on OSX.
# Also, remove the corresponding block in config/product_config.make.
ifeq ($(HOST_OS)-$(WITH_DEXPREOPT_buildbot),linux-true)
WITH_DEXPREOPT := true
endif
# Disallow mock locations by default for user builds
ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=0
else # !user_variant
# Turn on checkjni for non-user builds.
ADDITIONAL_BUILD_PROPERTIES += ro.kernel.android.checkjni=1
# Set device insecure for non-user builds.
ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0
# Allow mock locations by default for non user builds
ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=1
endif # !user_variant
ifeq (true,$(strip $(enable_target_debugging)))
# Target is more debuggable and adbd is on by default
ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1 persist.service.adb.enable=1
# Include the debugging/testing OTA keys in this build.
INCLUDE_TEST_OTA_KEYS := true
else # !enable_target_debugging
# Target is less debuggable and adbd is off by default
ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=0 persist.service.adb.enable=0
endif # !enable_target_debugging
這段代碼我大體解釋一下:
主要經過判斷當前的編譯模式來給幾個屬性賦予不一樣的值,而後把屬性存儲在ADDITIONAL_DEFAULT_PROPERTIES這個變量中,這個變量在後面是要寫到根目錄下的/default.prop中去,在系統啓動時被屬性服務加載的。也就是說咱們在/default.prop中看到的幾個屬性的值是在這裏設置的。
只看兩個屬性ro.secure,persist.service.adb.enable。當前是user模式的話,編譯系統會把ro.secure置爲1,把persist.service.adb.enable置爲0.也就是說,用user模式編譯出來的系統運行在安全模式下,adbd默認關閉。即便經過設置屬性的方式打開,adbd進程的用戶也是shell,不具備root權限。這樣,普通用戶或者開發者拿到一個機器後,經過PC運行adb shell時,是以shell用戶登陸機器的。
好了,如今把ro.secure置爲0,再從新編譯,只要設置屬性persist.service.adb.enable的值爲1,adbd進程就會以root用戶的身份啓動。