一、背景
修改system/etc/hosts,需要具备root权限,而且remount后,才能修改,本文介绍非root状态下修改system/etc/hosts方案。
环境:高通 Android 13
二、方案
非root,system/etc/hosts只有只读权限,无权限修改,如果需要修改,需要将system/etc/hosts软链到data目录,然后就可以达到修改的效果。
三、实现步骤
1、实现软链
1.1 将system/etc/hosts软链到/data/misc/hosts,涉及到的文件如下:
android/system/core/rootdir/Android.mk
LOCAL_POST_INSTALL_CMD += ; ln -sf /data/misc/hosts $(TARGET_OUT_ETC)/hosts
1.2 屏蔽原来的system/etc/hosts 拷贝动作,涉及到的mk文件修改如下
device/generic/uml/uml.mk
device/generic/goldfish/minimal_system.mk
build/make/target/product/base_system.mk
device/generic/trusty/qemu_trusty_base.mk
在以上文件中,找到system/core/rootdir/etc/hosts:system/etc/hosts语句,并删除或者注释掉,下面列出其中一个uml.mk的修改方法,其他类似:
PRODUCT_COPY_FILES += \
system/core/rootdir/init.usb.rc:system/etc/init/hw/init.usb.rc \
system/core/rootdir/init.usb.configfs.rc:system/etc/init/hw/init.usb.configfs.rc \
# system/core/rootdir/etc/hosts:system/etc/hosts
1.3 1.2中拷贝时机不对,因此,参考env.txt的拷贝实现逻辑,在qssi/LA.QSSI.13.0/LINUX/android/vendor/qcom/proprietary/prebuilt_HY11/target/product/qssi/prebuilt.mk中实现system/etc/hosts拷贝,这个修改很关键,将决定是否能将system/etc/hosts编译到out目录下
PRODUCT_COPY_FILES += vendor/qcom/proprietary/prebuilt_HY11/target/product/qssi/system/etc/hosts:system/etc/hosts
编译完后,可以不用刷机,先查看是否软链成功,软链成功,out目录如下将可以查看如下(不同平台,目录可能不一样):
1.4 根据上面的修改后,原来的system/etc/hosts是软链到data/misc/hosts,为了兼容以前的system/etc/hosts中的值,因此,需要开机时,检测 一下data/misc/hosts中是否有该文件,如果没有,需要启动脚本,写入初始值一次,详细实现请看下面
2、开机启动脚本
原理:定义一个开机自启一次service,检测data/misc/hosts是否存在
2.1 external 目录下,新建一个copyhost目录
2.2 定义一个Android.mk,/external/copyhost/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := copyhost
LOCAL_MODULE := copyhost
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/bin
LOCAL_INIT_RC := copyhost.rc
include $(BUILD_PREBUILT)
2.3 定义一个copyhost脚本,/external/copyhost/copyhost
#!/system/bin/sh
filePath="/data/misc/hosts"
TAG="copyhost"
echo "start copyhost"
log -t "$TAG" "begin copyhost"
if [ ! -f "$filePath" ]; then
log -t "$TAG" "$filePath not exit,write value"
echo "文件不存在:$file"
echo "127.0.0.1 localhost" >$filePath
echo "::1 ip6-localhost" >> $filePath
echo "127.0.0.1 hostname" >> $filePath
else
echo "文件存在:$file"
log -t "$TAG" "$filePath exit"
fi
2.4 定义copyhost.rc,/external/copyhost/copyhost.rc
service copyhost /system/bin/sh /system/bin/copyhost
class main
user root
group root
disabled
oneshot
seclabel u:r:init:s0
on property:sys.boot_completed=1
start copyhost
2.5 将copyhost 服务添加到构建模块,vendor/qcom/proprietary/prebuilt_HY11/target/product/qssi/prebuilt.mk
PRODUCT_PACKAGES += copyhost
3、编译镜像验证
四、host简介
1、概念
Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”
2、修改host作用
强制指定域名的 IP,加快域名解析 (省略了联网查询 DNS 的步骤),也能绕过 DNS 污染与劫持。
为局域网某些 IP 的机器配置一个“网址别名”,方便自己记忆和访问。比如配置一个 nas.com 访问局域网里的 NAS;gongsi 访问公司网站等等。
将域名指向到不可访问的IP地址,达到屏蔽不健康网站、屏蔽垃圾广告网址的效果;同理也能禁止系统、软件、网站访问某些指定的网址;
开发或测试应用时,利用 hosts 将域名临时指向到测试服务器IP,可以方便自己测试,同时又不影响他人和线上的应用。
附补丁链接:https://download.csdn.net/download/banzhuantuqiang/89503999