ChinaTunnel 開啟錯誤

系統 4.2.2,已 ROOT (SuperSU v2.79),Busybox 1.26.2
Error Code:
Error writing redirect table with exit code:2(null,/data/data/com.yanggis.chinatunnel/files/redirect.sh: line 111: syntax error: unexpected “(” (expecting “done”))

你是刚刚root了你的手机吗?root之后有没有打开一下superSU更新一下superSU的binary file?

我是刷入的,su file 自然也是新的,其他 app 要求 root 權限也沒有問題,其實 ChinaTunnel 也成功獲取 root 權限,所以我想應該不是 root 問題

那你觉得是什么问题啊?按你这想法chinatunnel现在在一万多台设备上安装,都可以成功运行,我觉得也不是chinatunnel的问题哦。
SuperSU刷入并不能就说su file就是新的。SuperSU.apk和su binary file是两个文件,相互独立,SuperSU和ChinaTunnel都要依赖su binary file才能运行。

SuperSU 刷入是先把舊的 su file 移除再刷入新的。。。

算了不討論這些,我只是想解決問題,我嘗試過省電模式沒出現錯誤,但貌似沒有效果,另外根據錯誤提示,出錯的應該是 /data/data/com.yanggis.chinatunnel/files/redirect.sh,但是我也在 Terminal Emulator 執行 /data/data/com.yanggis.chinatunnel/files/redirect.sh 也沒發現錯誤,會不會是 ChinaTunnel 調用 redirect.sh 時出錯?

/redirect.sh 没有传入参数就不会执行任何东西,自然也不会报错,因为根本就没进入程序执行。ChinaTunnel调用的时候在你的设备上出错,最大可能就是你的设备root的有问题,或者su binary file有问题,因为错误信息说的很明确:
Error writing redirect table with exit code:2(null,/data/data/com.yanggis.chinatunnel/files/redirect.sh: line 111: syntax error: unexpected “(” (expecting “done”))
说明redirect.sh文件第111行在你的设备上执行不了,可能就是这一行里面的那个函数你的设备识别不了才报错的。

你可以查找su文件,基本都是/system/下的某个子目录里,删除su,卸载supersu.apk,然后安装kingroot 4.9.0 (142),然后root你的设备试试。
http://www.androidapksfree.com/apk/kingroot-4-9-0-142-apk-download/

1 个赞

不是魅族吧。。魅族有bug好像没法使用chinatunnel

新版可以用了,謝謝!
不過還有一個小問題,就是如果原來的 hosts 比較大(我的有 2M多),在第一次按開啟時通常都不成功,然後再按一次會自動退出,但這時候 hosts 文件已經被清空了,然後再進去按開啟能成功,不過它會把已經被清空的 hosts 文件再做一次備份,就是說當關閉時它回復的是一個空的 hosts 文件

PS:雖然感覺你有點倔,不過還是願意自己做 debug,也是一個負責任的開發者,不錯嘛!就多按幾次廣告表示支持

不是,是一台老 rk3188 的盒子

第一次开启不成功是因为你hosts文件太大,写入数据太慢,再加上你的盒子又比较老,CPU比较慢,在规定时间内没法完成所有的配置操作,所以会timeout返回。
chinatunnel设定30秒内完成所有配置操作,30秒还没有操作完成就会timeout强制返回。如果CPU足够快,通常5秒钟即可配置完成。
这可能是最后一个版本支持android 4.0 ~ 4.2.2的设备。下月更新直接跳到chinatunnel 2.0版本,不支持这些老的设备了,这些低版本的android系统本身就存在诸多问题,维护太麻烦。

抱歉我要考一考古
我是因為別的問題才搜到這個貼子
但是這個貼子的問題正好和我所遇上的問題一樣
而我已經查出這問題的答案
我認為這問題對ChinaTunnel的兼容性有莫大的影響
所以我必須說一說樓主到底是出現什麼錯誤

根據錯誤提示
出錯的應該是arr=($line)這句
這句是用了bash獨有的陣列功能
在Android預設的POSIX shell上根本運行不了
出現的錯誤就會如樓主所示一樣
除非安裝了bash或者帶有bash的busybox
否則出錯是必然的事
不過通常root機時都會自帶安裝busybox
所以大部分使用者的shell一早被換成bash
在使用ChinaTunnel時才不會出問題

雖然要所有使用者都安裝busybox不失為一個辦法
但考慮到ChinaTunnel使用者有可能使用一些冷門平台
例如山寨盒子等
這些裝置可能使用一些冷門MIPS SOC
不一定有對應的basybox或者對應的basybox不是用bash而是用ash等不一定兼容bash語法的shell
再看回redirect.sh原始碼並不是不能用POSIX標準語法去取代
redirect.sh原始碼中有兩段這樣的代碼是不符POSIX標準的
OLD_IFS="$IFS"
IFS=";"
arr=($line)
IFS="$OLD_IFS"
mark=${arr[0]}
ip=${arr[1]}
domain=${arr[2]}
可以改成這樣以符合POSIX標準
mark=$(echo $line | cut -d ';' -f 1)
ip=$(echo $line | cut -d ';' -f 2)
domain=$(echo $line | cut -d ';' -f 3)
這樣修改後即使沒安裝busybox更換為bash
在Android預設的POSIX Shell上都能運行

嗯,您这个建议很好。
能在这给我提交一下bug报告吗?

我回头修改一下。

做了個Issue
https://github.com/yanggis/ChinaTunnel/issues/39

順便抱怨一下
不要學bash
不要學bash
不要學bash
bash太多和POSIX不相容的語法
連在ubuntu上的dash上執行都會報錯
除非你很有空去替每一個開發平台找bash替換
否則放棄bash學習POSIX標準語法更好
因為沒有shell不能執行POSIX標準語法的
我今次都是因為這個問題弄得頭破血流