Android Root等。
TODOS
1 | 使用KernelSU_Action编译自己的KernelSU内核 |
基本知识
恢复模式
即Recovery Mode,该模式将会启动recovery分区,可在该模式下执行擦除数据等操作。通过刷入第三方recovery可达到更高级的功能。
对于三星设备,在关机状态下同时按音量上键+Home键+电源键即可进入Recovery模式。
下载模式
即Download Mode,也被称为Bootloader/Fastboot Mode,用于刷机。在三星上也被称为Odin Mode。
对于三星设备,在关机状态下按音量下键+Home键+电源键,同时将手机连接到电脑,即可进入下载模式。或先进入恢复模式,再选择Reboot to bootloader进入到下载模式。
ADB工具
Google提供的用电脑命令行对手机进行相关操作的工具,注意需要在手机上打开USB调试模式。注意应当用最新的ADB工具,否则可能会识别不到设备,运行命令行可能会提示device offline。
下载链接如下。
1 | https://developer.android.com/studio/command-line/adb |
对于Mac,可通过Homebrew安装。
1 | brew cask install android-platform-tools |
该工具包包含adb和fastboot两个工具,其中adb用于普通模式,fastboot用于fastboot模式。
注意,adb和fastboot需要不同的驱动。如果运行命令行时找不到设备,可能是驱动问题,可尝试下载以下驱动。
1 | # 通用驱动 |
若安装后仍不行,可尝试手动安装。Windows下打开设备管理器,将fastboot模式下的手机与电脑连接。检查手机是否被识别为未知设备,若是则右键选择安装驱动程序,驱动程序路径位于SDK包中的sdk/extras/google/usb_driver,SDK包下载链接如下。
1 | https://developer.android.com/studio |
也可直接使用工具和驱动一键下载脚本,链接如下。
1 | https://forum.xda-developers.com/t/tool-latest-adb-fastboot-and-usb-driver-installer-tool-for-windows.3999445/ |
命令行切换到工具目录后即可使用,注意需要以管理员身份运行。adb常用命令如下。
1 | # 查看当前连接的设备 |
fastboot常用命令如下。
1 | # 查看当前连接的设备 |
对于Samsung,因为其使用自定义的Odin 3 协议,因此fastboot命令将看不到设备。需要使用Heimdall,仓库如下。
1 | https://github.com/Benjamin-Dobell/Heimdall |
解锁Bootloader
即OEM解锁。一般而言,进入下载模式意味着需要更改系统,此时需要先解Bootloader锁,否则无法完成刷入。对于三星,可在下载模式下查看CROM SERVICE一栏,若为Lock则未解锁。
对于三星设备,可在设置-开发者设置下点击OEM解锁。若没有该选项则可使用官方OEM解锁工具CROM Service,下载链接如下。
1 | https://www.apkmirror.com/apk/samsung-electronics-co-ltd/crom-service/crom-service-1-0-8-release/crom-service-1-0-8-android-apk-download/ |
对于一加设备,需要通过ADB工具。在手机上进入设置-关于手机,点击7次版本号启用开发者选项。启用开发者选项后,Google服务框架会被自动取消隐藏。然后前往设置-系统-开发者选项,启用OEM解锁和高级重启。
长按电源键,从电源菜单中选择引导器模式,手机将会自动重启进入Bootloader模式。打开电脑的终端,使用以下命令解锁Bootloader。
1 | fastboot devices # 检查设备是否连接 |
手机会提示解锁Bootloader的风险警告信息,需要用音量键操作选择是否解锁,并使用电源键确认。解锁后手机会自动抹掉所有数据并执行重启。
开发者设置
在安卓设置中有一项隐藏的开发者设置,在该设置中可开启USB调试。一般进入关于手机
,连续点击十次版本号,即可解除隐藏。
Recovery
第三方包
第三方Recovery与原生Recovery相比,可实现更多功能。
TWRP
1 | https://twrp.me/ |
特定机型的非官方TWRP包如下。
1 | # LG G3 |
SHRP
1 | https://skyhawkrecovery.github.io/ |
OrangeFox
1 | https://orangefox.download/zh-CN |
PitchBlack
1 | https://pitchblackrecovery.com/ |
CWM
支持较老的机型。
刷入
以TWRP为例,对于官方提供支持的设备,可从Google Play商店中下载TWRP应用完成刷入。对于其它设备,可通过线刷的方式,如三星可将相应的recovery.img打包为tar后,通过Odin的AP包方式刷入。
机型适配
对于官方未提供支持机型的第三方包,可自行编译。
提取设备树
编译第三方Recovery需要与本设备相关的设备树。
可尝试在Github搜索device [设备名]
、kernel [设备名]
以及vendor [设备名]
查找设备树。
【进阶】编译TWRP和Android所需设备树的不同
Android.mk、AndroidProduct.mk、omni_cheryl.mk一般情况下相同。编译TWRP需要对BoardConfig.mk等文件进行修改。
通过twrpdtgen
twrpdtgen为python下的工具,可从原生Recovery中提取设备树,支持Android 4.4-12。仓库及相关说明如下。
1 | https://github.com/SebaUbuntu/TWRP-device-tree-generator |
建议在Linux环境下进行。以三星为例,从ROM中的AP压缩包提取recovery.img,如果是A/B分区则用Boot.img。然后打开终端,输入以下命令。
1 | # 进入root模式 |
把提取的recovery.img复制到twrpdtgen目录下,然后运行以下命令生成设备树。
1 | python3 -m twrpdtgen -k --no-git -v recovery.img |
output/[厂商名]/[设备名]
下的内容即为本设备的设备树。
通过修改模版
下载以下仓库作为模版,以下根据该模版进行修改。
1 | https://github.com/shakalaca/android_device_asus_Z01G/tree/sample |
编译系统从build/make/core/product_config.mk开始,读取设备参数文件目录device/下所有的AndroidProducts.mk,得到设备Makefile的列表。然后在列表中搜索用户指定设备的设备Makefile即omni_<设备名>.mk
,若能搜索到则从设备Makefile中读取设备信息,配置好编译环境。
Android.mk
主要进入点。
1 | # 将Z01G修改为设备名 |
AndroidProducts.mk
载入[ROM]_[设备].mk
。
1 | # ROM一般为omni,无需改变 |
omni_Z01G.mk
相当于Makefile,定义设备的基本信息。
对于OmniROM,文件名为omni_<设备名>.mk
。对于CyanogenMod为cm.mk
,对于魔趣为mokee.mk
(旧版本)或mk_<设备名>.mk
(Android 9)。统一命名为omni_<设备名>.mk
即可。
1 | # 使当前配置文件继承其他配置文件 |
device.mk
只对Android UI起作用,对TWRP无效。
vendorsetup.sh
1 | # 将Z01G修改为设备名 |
recovery.fstab
手机分区信息。可在手机打开Termux等终端工具,通过df命令查看。
1 | # 从/system到/recovery基本可以共用 |
system.prop
放置额外property,通常不需要。
omni.dependencies
编译时TWRP会通过该文件获取额外的source code编译,一般为SoC相关的设定与核心源码。此处获取Qualcomm共享代码。
BoardConfig.mk
编译TWRP需要的所有参数。
基本参数
1 | # 主板型号 |
内核打包参数
1 | # 内核的运行参数 |
内核编译参数
如果有可编译的内核源码,则可使用以下参数,然后在omni.dependencies中加入kernel source repository。这种方法编译出来的recovery将可用于各个版本的系统。
1 | # 指定编译内核使用的配置文件 |
如果使用预编译好的内核,如从能正常运行的boot.img与recovery.img中提取出来的内核,则使用以下参数。因为已编译的内核映像无法修改,因此这种方法编译出来的recovery只能适用于特定版本的系统。
1 | # TARGET_KERNEL_CONFIG := ze520kl-userdebug_defconfig |
其它可能用到的参数如下。
1 | # 指定用于编译内核的交叉工具链 |
Recovery参数
1 | # 指定Recovery显示的像素格式 |
TWRP专用参数
1 | # 指定TWRP的主题。不同的主题决定TWRP显示的不同样式,包括分辨率、屏幕方向等 |
加密相关参数
data分区通常会加密,若TWRP没有包含相关解密工具,将无法备份或root该分区,但可以格式化。对于Qualcomm平台,加解密通过qseecomd完成。因此需要另外独立出一个目录,让TWRP编译时可以将内部/system/bin/linker64的链接改为/sbin/linker64,从而使工具在没有挂载/system时也能运行。
加解密的流程由init.recovery.qcom_decrypt.rc控制,基本上不用修改,会由init.recovery.qcom.rc导入。本例所用的init.recovery.qcom.rc可以只留下第一行import,其余的是载入手机专用exfat kernel module与让TWRP可以刷ASUS原厂ROM的hack。
会用到的so动态库则放在root/vendor/lib64目录。root/vendor/lib64/hw目录里有一个keystore.msm8998.so,中间的msm8998即为TARGET_BOARD_PLATFORM,需要按照机型进行修改。
1 | # 指定TWRP是否包含加密组件,并启用加密解密功能 |
调试相关参数
1 | # 指定是否在TWRP中包含logcat |
编译出包
通过Github Actions
在Github上新建仓库,将设备树的内容上传,示例如下。
1 | https://github.com/guanpeiheng1/TWRP_device_samsung_j3300 |
Fork以下仓库,然后点击Actions-Make Recovery-Run Workflow。
1 | https://github.com/azwhikaru/Action-Recovery-builder |
LIBRARY_NAME一般无需修改。LIBRARY_URL根据需要编译的包类型修改,列表如下。
1 | # TWRP |
LIBRARY_BRANCH需要跟Android版本匹配。如编译TWRP时,若Android版本为7.1,则需要选择的源码分支为twrp-7.1。选择错误的源码分支会导致无法启动到recovery。
DEVICE_URL和DEVICE_BRANCH为刚才上传的设备树仓库地址及分支,DEVICE_PATH为device/[厂商名]/[设备名]
,DEVICE_NAME为设备名。填写完成后运行,运行结束后即可在Release获取编译好的包。
通过源码
以下均在Linux环境下进行。
TWRP
打开终端并输入以下命令。
1 | # 安装必要依赖 |
打开~/.bashrc
,在文件尾部加入以下语句以开启ccache,保存后重启终端。
1 | # 启用ccache |
开始时可先使用minimal-manifest-twrp,该仓库为编译TWRP所需要的最小单位。输入以下命令以拉取代码。
1 | # 下载repo工具 |
建议拉取代码前先配置Github的SSH密钥,并输入以下命令配置以免输密码。配置完成后pull一次并输入密码,以后便不需要再输入。
1 | git config --global credential.helper store |
注意拉取代码需要设置为全局翻墙,图形工具可使用Clash for Windows。注意需要在~/.bashrc
写入以下内容后重启终端,否则可能会出现curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to android.googlesource.com:443错误。
1 | # Clash for Windows的默认代理端口为7890 |
同时需要在hosts文件添加规则。输入以下命令打开hosts文件。
1 | sudo gedit /etc/hosts |
添加以下规则。
1 | [IP地址] android.googlesource.com |
IP可在以下网站找到。
1 | https://check-host.net/ip-info?host=android.googlesource.com |
建议设置Github代理,以排除可能错误。
1 | git config --global http.proxy 'socks5://127.0.0.1:7890' |
【进阶】不翻墙的其它方法
不建议,拉取过程中仍可能出现gnutls_handshake() failed: Error in the pull function错误,此时翻墙是最快捷的方法。
在终端输入以下命令打开repo工具的配置文件。
1 | sudo gedit /usr/bin/repo |
然后按照以下内容修改。
1 | # REPO_URL = os.environ.get('REPO_URL', None) |
修改后保存,然后输入以下命令关闭git证书认证。
1 | git config --global http.sslverify false |
还需要修复连接不上Github的问题。输入以下命令打开hosts文件。
1 | sudo gedit /etc/hosts |
在hosts文件中添加Github网址和IP的对应规则,可直接使用以下文件的内容。添加后保存即可。
1 | https://cdn.jsdelivr.net/gh/ineo6/hosts/hosts |
将刚才设备树的文件复制到对应位置,然后通过以下命令执行编译。编译而成的Recovery位于out/target/product/[设备名]/recovery.img
。
1 | source build/envsetup.sh |
编译完成后,建议在OmniROM环境下再次编译,但拉取android-9.0分支代码时提示有库不存在。可参考以下链接。
1 | # TWRP |
调试查错
提取日志
若recovery不能正常启动,可查看内核日志。高通和瑞芯微(如RK3188)的内核日志存储在/proc/last_kmsg,海思早期芯片(如K3V2)存储在内核参数CONFIG_APANIC_PLABEL所指定的分区中,一般是splash。
但由于有些故障发生在Android初始化程序init的运行过程中,而在使用调试方式构建的ROM中,若遇到panic则自动重启进入Bootloader,阻碍内核转存日志,因此需要禁用此功能。
将以下代码保存为system/core/init/no_reboot_into_bootloader.diff。
1 | diff --git a/init/Android.bp b/init/Android.bp |
打开init所在的目录system/core/init,运行以下命令以应用补丁即可。
1 | patch -p2 < no_reboot_into_bootloader.diff |
功能测试
可检查以下项目是否正常。
挂载
进入主菜单的Mount,点击每个分区的选项,检查是否能够正常挂载。
解密
对于高通设备,观察解密是否正常的最直接方法,是看日志中是否有解密失败(decryption failed)的提示,以及“Mount”菜单中的data分区是否无法挂载。
ADB
连接电脑,运行adb devices,是否能检测到设备处在Recovery状态。
运行adb shell是否能进入设备上的终端,并拥有Root权限。
MTP
连接电脑,检查是否出现MTP设备。如未出现,在Mount中点击Enable MTP。
OTG
2014年起的大部分主流机型都支持OTG。插入一根OTG数据线,在TWRP终端中运行lsusb,看是否检测到一个USB设备。
再插入一个新设备,看lsusb的输出里是否多出了另外一个设备。如果插入的是U盘,还可检查/dev/block/下是否多出了设备sdx(x为任意一个小写英文字母)。
备份/恢复系统
测试一下系统是否能正常备份和恢复,检查可选的备份分区是否包含必要的分区(system、data、boot、recovery)。
常见问题
出现Recovery is not SEANDROID enforcing/set warrenty bit: recovery
若出现这几条消息,且设备陷入重启循环,则说明刷入的recovery与本机不匹配,拔电池或等待手机电量完全耗尽后进入下载模式并重刷即可。
若设备没有重启,由于从5.1.1版本开始的系统写保护/安全策略,出现这几条消息是正常的。Recovery is not SEANDROID enforcing来自TWRP,表示selinux处于所需状态。内核必须允许selinux宽容模式(permissive)而非强制模式(enforcing),以便授予TWRP root权限。Set Warranty Bit: recovery来自Bootloader,表示Bootloader已解锁,且设备处于第三方recovery模式。
若出现这几条消息并卡住,则说明刷入的recovery不匹配,可能是编译第三方recovery时选择的源码树不正确,重新选择与系统版本对应的源码树即可。
Root
Root后将无法通过OTA升级的方式升级系统,只能通过线刷的方式。
Magisk
安装
从以下链接下载Magisk Manager。
1 | https://github.com/topjohnwu/Magisk |
打开APP,如果一直在更新,则需要先翻墙。
查看设备相关信息,一般而言Ramdisk为Yes,较低版本的系统上A/B为No,SAR为No。这种情况下,可从官方ROM包中提取boot.img,以三星为例,用压缩软件打开AP包即可看到。将提取出来的包复制到手机根目录。然后APP点击安装,选择刚才复制进去的包,APP将完成修补并输出修补好的boot.img。将输出的修补包改名为boot.img,在普通设备上即可通过ADB工具包的fastboot命令刷入,对于有TWRP的也可以在recovery模式下刷入。
对于三星,需要将boot.img压缩为tar,然后用Odin刷入,注意需要将ROM的所有部分都刷入,仅将AP包替换为Magisk修补过的包。
刷入后重启即完成,若Magisk Manager消失则重新下载即可。
若SAR(System-as-root)为Yes,其余一致,这种情况一般出现在三星Android 9.0及以上系统,修补时需要将整个AP包传入而不是只取boot.img,用Odin刷入时需要将ROM的所有部分都刷入,仅将AP包替换为Magisk修补过的包。注意,将修补的AP包复制到电脑时,手机与电脑的连接方式不要使用MTP,因为MTP会损坏大文件。
若Ramdisk为No,其余一致,Magisk只能劫持recovery分区,此时则需要修补recovery.img,步骤与上面基本一致,注意修补时需要确保Recovery Mode为勾选状态。这种修补下正常开机Magisk将不运行,需要按下进入恢复模式的按键组合,等待设备屏幕亮起后松开按键,此时Magisk将正常运行。若需要进入到真正的恢复模式,需要在屏幕亮起时长按音量上键。这种情况下不能用第三方recovery安装或升级Magisk。
模块
其它方法
通过CF-Auto-Root
不推荐,在Samsung J3300下实测失败。
下载CF包,然后通过线刷工具刷入即可。对于三星设备为刷入AP包。
1 | https://autoroot.chainfire.eu/ |
通过工具
PurpleDrake
可用于LG G3。
需要先将手机降级至KitKat。下载以下包,将手机连接到电脑,然后按照平台执行即可。
1 | https://forum.xda-developers.com/t/root-root-your-lg-g3-easily-with-purpledrake-lite-osx-linux-windows.2821000/ |
刷入官方系统
系统
官方ROM
三星
下载
可在以下网站下载固件。
1 | # 可查看和下载固件 |
以下适用于J3300。
1 | # 7.1.1版本 |
刷入
三星需要专用的线刷工具Odin,下载链接如下。
1 | https://odindownload.com/ |
让手机进入下载模式,连接到电脑并打开Odin,依次选择ROM包中对应的组件即可。注意CSC应当选择HOME_CSC前缀的包。如果找不到手机,需要安装驱动。
1 | # 官方下载 |
三星ROM各文件的含义如下。
文件前缀 | 说明 |
---|---|
CP | Core Processor,调制解调器 |
AP | Application Processor or PDA,包含boot.img、system.img、recovery.img、hboot.nb0、data.img、cache.img、radio.img等 |
BL | Bootloader |
PIT | 分区信息表,一般不需要 |
CSC | 消费者软件定制,包含特定于该地区的软件包、运营商品牌和APN设置 |
【进阶】三星线刷包说明
每个包会写特定的部分,且为覆盖写。如果AP包中仅包含recovery.img,则刷入时只会更新Recovery分区。
在刷第三方recovery时,可刷只包含recovery.img的tar格式的AP包,以仅更新Recovery分区。若Recovery分区损坏,可提取原版AP包的recovery.img,打包为tar后刷入即可,无需全量刷入。
但刷入boot时建议要把其他部分也选上,防止只刷AP包导致Odin将data分区缩小。将AP包替换为仅包含要刷入的boot.img的tar包即可。
Odin通过名称识别该包需要刷入的分区,因此tar包中需要刷入到boot分区的必须命名为boot.img,刷入到recovery分区的必须命名为recovery.img,否则刷入将出错。
参见问题
刷入时提示SW REV CHECK FAIL
刷入版本低的ROM时会出现该错误。更新ROM时会同时更新Bootloader,更新的Bootloader不允许刷入旧的Bootloader。
氧OS
适用于一加手机。
下载
1 | # OnePlus 7 |
刷入
刷入前需先下载好氧OS,并解锁Bootloader。
到TWRP官网下载OnePlus 7的TWRP。在手机上进入设置-系统-开发者选项并启用高级重启后,长按电源键并选择Bootloader模式。在电脑终端使用以下指令以临时启动TWRP。
1 | fastboot boot [TWRP的img包路径] |
正常情况下,手机会临时进入一次TWRP。在TWRP中刷入氧OS,注意刷完后先不要重启,将TWRP包导入手机存储,并在TWRP中刷入,使TWRP在手机中持久化。安装包会在AB两个分区中都安装一次TWRP,这样无论手机从哪个分区启动都可以进入TWRP。
若未正常进入TWRP,由于氢氧OS可以无缝互刷但不能从高版本降级到低版本,若当前的氢OS并非最新,可直接将氧OS的固件导入手机存储中,直接在设置-系统-系统升级-右上角齿轮按钮-本地升级中选择氧OS固件以升级。
若上述方法失败,可使用氢氧互刷工具,如下。
1 | http://www.oneplusbbs.com/thread-2805359-1.html |
【进阶】
如果希望下一次通过TWRP刷入ROM时要保留所有TWRP和Magisk,需要在刷入ROM之前尽量关闭所有Magisk 模块,将ROM、TWRP包和magisk安装包全部导入手机存储中,按顺序刷入后重启手机。如果希望在系统内升级并保留TWRP和Magisk,需要将ROM、TWRP包和magisk安装包全部导入手机存储中,使用系统设置中的系统升级来升级系统后,在Magisk Manager的Modules页面,通过+按钮刷入TWRP包,然后点击Magisk旁边的Install-Install-Direct Install以及Install-Install-Install to Inactive Slot,重启手机。
自定义ROM
自定义ROM有LineageOS、pixel-experience、MoKee ROM、Havoc OS、Nitrogen-OS、OmniROM等。Samsung J3300均不支持这些自定义ROM。
使用自定义ROM前一般均需对手机进行Root,解锁Bootloader,刷入TWRP。刷入自定义ROM前一般需要擦除数据,以TWRP为例,进入TWRP recovery后,选择Wipe-Advanced Wipe,勾选Dalvik/ART Cache、Cache、Data、Internal Storage、System以完成擦除。
1 | # PixelExperience |
LineageOS
CyanogenMod的继承者。LineageOS可在旧款Android手机上流畅运行。
1 | https://www.lineageos.org/ |
LineageOS不带Google框架,需要自行下载,链接如下。
1 | https://opengapps.org/ |
机型适配
自行编译ROM必须获得内核源码、设备树和供应商文件。
其中内核源码kernel source需要厂商开源,如三星可在以下网站查找。
1 | https://opensource.samsung.com/main |
设备树device tree示例如下。
1 | https://forum.xda-developers.com/t/guide-how-to-make-a-device-tree-for-your-phone.3698419/ |
供应商文件vendor files示例如下。
1 | <?xml version="1.0" encoding="UTF-8"?> |
LineageOS
如果设备有官方维护,则直接运行以下命令即可。
1 | brunch <设备代号> |
如果设备没有官方维护,但已有非官方源码,可将非官方代码clone到本地,并放置到对应位置,一般为device(kernel, vendor)/设备厂商名/设备代号,再运行以上命令。
如果没有官方维护及非官方源码,但有其它自定义ROM的源码,同理将代码clone到对应位置,在此基础上进行修改,再运行以上命令。修改方式可参照以下链接。
1 | https://github.com/GuaiYiHu/android_device_xiaomi_clover-oss/commit/c9426d95559576e61f7544443a24df42786b7aab |
参考教程如下。
1 | https://www.link-nemo.com/u/10156/post/260119 |
参考教程
ADB出现devices offline的解决方法
1 | https://blog.csdn.net/qq_33924155/article/details/79153000 |
Difference between Bootloader, Download and Recovery mode ?
1 | https://forum.xda-developers.com/t/difference-between-bootloader-download-and-recovery-mode.3661049/ |
LG G3 LineageOS Tutorial
1 | https://linustechtips.com/topic/1058206-lg-g3-lineageos-tutorial/ |
一加 OnePlus 7 刷入氧 OS、TWRP、Magisk (Root)
1 | https://blog.skk.moe/post/op7-oos-twrp-magisk/ |
适用于任何机型的自编译 TWRP Recovery 和生成设备树
1 | https://www.bilibili.com/video/BV12P4y1t7ZZ/ |
Doc: fastboot intro
1 | https://web.archive.org/web/20161224194012/https://wiki.cyanogenmod.org/w/Doc:_fastboot_intro#.3Cwaiting_for_device.3E_errors |
Samsung tablet root process
1 | https://www.jianshu.com/p/f4f62fd2c93f |
Recovery is not Seandroid Enforcing(Samsung A5)
1 | https://android.stackexchange.com/questions/159436/recovery-is-not-seandroid-enforcingsamsung-a5s |
Recovery is not SEAndroid enforcing.
1 | https://forum.xda-developers.com/t/recovery-is-not-seandroid-enforcing.3158482/ |
Magisk Documentation | Magisk
1 | https://topjohnwu.github.io/Magisk/ |
三星手机获取 root 权限:使用 Magisk Manager 为 Android 8.0/9 创建 root 文件
1 | https://www.cnroms.com/samsung-root-with-magisk-manager.html |
SELinux 宽容模式(permissive) 强制模式(enforcing) 关闭(disabled) 几种模式之间的转换
1 | https://blog.csdn.net/tangsilian/article/details/80144112 |
How to Root Samsung Galaxy J3-2017 SM-J3300 | Odin Tool
1 | https://www.rootdroids.com/how-to-root-samsung-galaxy-j3-2017-sm-j3300-odin-tool/ |
如何讓 TWRP 正式支援你的裝置
1 | https://medium.com/@shakalaca/%E5%A6%82%E4%BD%95%E8%AE%93-twrp-%E6%AD%A3%E5%BC%8F%E6%94%AF%E6%8F%B4%E4%BD%A0%E7%9A%84%E8%A3%9D%E7%BD%AE-ba942c72dfa2 |
常用ROM的各大官网
1 | https://www.jianshu.com/p/88066f6c12b3 |
TWRP Recovery 编译适配教程
1 | https://www.twblogs.net/a/5be370f62b717720b51d82d1 |