Tommy 碎碎念
https://blog.teatime.com.tw/
Tommy Wu's blog
tommy
2024-03-19T13:19:48Z
-
小米平板5 root 跟 system writable
https://blog.teatime.com.tw/1/post/491
<div>首先... 記得先解鎖 (一般的帳號應該都是等 168 小時).</div>
<div>目前沒有可以使用的 TWRP (<a href="https://github.com/mujianwu/Action-Recovery-builder/releases" target="_blank" rel="noopener">這邊</a>有一個可開機的版本, 不過只能用來透過 adb 連線使用).</div>
<div>要 root 就先裝 Magisk 的 apk 進去, 然後抓目前同版本的 fastboot rom 裡頭的 boot.img 給 Magisk 修改, 再用 fastboot 刷修改後的 boot.img 就有 root 了.</div>
<div>至於要通過 safetynet, 跟一般沒什麼不同, 相關的 Magisk 模組裝一裝就可通過.</div>
<div> </div>
<div>不過就算 root 之後, system 一樣是不可以寫入的 (新的 Android 應該都一樣, filesystem 有加上 shared_blocks, 所以無法再寫入).</div>
<div>一般如果有 TWRP 可以用, 可以刷 <a href="https://www.mobile01.com/externallink.php?url=https%3A%2F%2Fforum.xda-developers.com%2Ft%2Fscript-android-10-universal-mount-system-rw-super-rw-read-write.4247311%2F" target="_parent">systemrw</a> 移除 shared_blocks 就可以寫入.</div>
<div>不過, 因為還沒有 TWRP 可以用, 這方法目前還不能用.</div>
<div> </div>
<div>只好用另一個 <a href="https://www.mobile01.com/externallink.php?url=https%3A%2F%2Fforum.xda-developers.com%2Ft%2Ftool-win-lin-and-darw-super-image-tools-extract-or-make-partitions-rw-in-super-partition.4120963%2F" target="_parent">Super Image Tools</a> 來處理.</div>
<div>就把 superrepack.arm64_pie 放到 /data/local/tmp 下, 然後在 adb shell 或 terminal 下使用 root 執行下列的指令:</div>
<div>
<pre class="language-bash"><code>chmod +x superrepack.arm64_pie
stop
./superrepack /dev/block/bootdevice/by-name/super</code></pre>
</div>
<p>最後面那個指令執行可能會有錯誤, 要重複執行好幾次, 確定沒有出現錯誤後 (如果有錯誤, 重開機可能會進不去系統), 再執行</p>
<div class="insertcode">
<pre class="language-bash"><code>sync
reboot</code></pre>
</div>
<p>重開機後, 應該就可以寫入了.</p>
<div>如果改了之後有問題, 沒辦法正常開機進入系統, 就只能重刷 fastboot rom (選擇保留資料那一個, 並且把 boot.img 換成前面 Magisk 改過的那一個, 就不用重新再 root 一次).</div>
<div>對了, 照說只改了 super 分區的資料, 只重刷 super.img 應該就夠了, 不過我試了幾次都不行, 就選擇整個重刷.</div>
<div> </div>
<div>PS. 那個 TWRP 目前只是用來刷 win11 進去, 有興趣的可以參考<a href="https://uotan.cn/threads/5-windows11.1975/" target="_blank" rel="noopener">這邊</a>. </div>
Android
2021-12-26T13:25:25Z
tommy
-
知道小米版本號如何取得檔案下載網址的方式
https://blog.teatime.com.tw/1/post/490
<div>原作來自 XDA: <a href="https://forum.xda-developers.com/mi-mix-2/how-to/guide-reverse-engineering-xiaomi-ota-t3691612" target="_blank">https://forum.xda-developers.com/mi-mix-2/how-to/guide-reverse-engineering-xiaomi-ota-t3691612</a> </div><div>方法一不能用了, 不過方法二仍可以使用, 而且... 是目前的更新機制, 應該不容易改... 也許一直能用下去.</div><div><br /></div><div>不知道為什麼, 原作者的 python 程式碼在我的機器上無法正常執行, 在 decrypt 那一個部份一直無法成功.</div><div>所以... 就用 php 改寫一下.</div><div> </div><pre class="php"><div class="insertcode"><span class="kw2"><?php</span><br /> <br /><span class="re0">$cipher</span> <span class="sy0">=</span> <span class="st_h">'rijndael-128'</span><span class="sy0">;</span><br /><span class="re0">$mode</span> <span class="sy0">=</span> <span class="st_h">'cbc'</span><span class="sy0">;</span><br /><span class="re0">$miui_key</span> <span class="sy0">=</span> <span class="st_h">'miuiotavalided11'</span><span class="sy0">;</span><br /><span class="re0">$miui_iv</span> <span class="sy0">=</span> <span class="st_h">'0102030405060708'</span><span class="sy0">;</span><br /> <br /><span class="kw2">function</span> miui_decrypt<span class="br0">(</span><span class="re0">$s</span><span class="br0">)</span><br /><span class="br0">{</span><br /> <span class="kw2">global</span> <span class="re0">$cipher</span><span class="sy0">,</span> <span class="re0">$mode</span><span class="sy0">,</span> <span class="re0">$miui_key</span><span class="sy0">,</span> <span class="re0">$miui_iv</span><span class="sy0">;</span><br /> <br /> <span class="re0">$td</span> <span class="sy0">=</span> <a href="http://www.php.net/mcrypt_module_open"><span class="kw3">mcrypt_module_open</span></a><span class="br0">(</span><span class="re0">$cipher</span><span class="sy0">,</span> <span class="st_h">''</span><span class="sy0">,</span> <span class="re0">$mode</span><span class="sy0">,</span> <span class="st_h">''</span><span class="br0">)</span><span class="sy0">;</span><br /> <a href="http://www.php.net/mcrypt_generic_init"><span class="kw3">mcrypt_generic_init</span></a><span class="br0">(</span><span class="re0">$td</span><span class="sy0">,</span> <span class="re0">$miui_key</span><span class="sy0">,</span> <span class="re0">$miui_iv</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="re0">$decrypted</span> <span class="sy0">=</span> <a href="http://www.php.net/mdecrypt_generic"><span class="kw3">mdecrypt_generic</span></a><span class="br0">(</span><span class="re0">$td</span><span class="sy0">,</span> <a href="http://www.php.net/base64_decode"><span class="kw3">base64_decode</span></a><span class="br0">(</span><span class="re0">$s</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span><br /> <a href="http://www.php.net/mcrypt_generic_deinit"><span class="kw3">mcrypt_generic_deinit</span></a><span class="br0">(</span><span class="re0">$td</span><span class="br0">)</span><span class="sy0">;</span><br /> <a href="http://www.php.net/mcrypt_module_close"><span class="kw3">mcrypt_module_close</span></a><span class="br0">(</span><span class="re0">$td</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="re0">$pos</span> <span class="sy0">=</span> <a href="http://www.php.net/strrpos"><span class="kw3">strrpos</span></a><span class="br0">(</span><span class="re0">$decrypted</span><span class="sy0">,</span> <span class="st_h">'}'</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$pos</span> <span class="sy0">!==</span> <span class="kw4">false</span><span class="br0">)</span><br /> <span class="kw1">return</span> <a href="http://www.php.net/substr"><span class="kw3">substr</span></a><span class="br0">(</span><span class="re0">$decrypted</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="re0">$pos</span> <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="kw1">return</span> <span class="re0">$decrypted</span><span class="sy0">;</span><br /><span class="br0">}</span><br /> <br /><span class="kw2">function</span> miui_encrypt<span class="br0">(</span><span class="re0">$s</span><span class="br0">)</span><br /><span class="br0">{</span><br /> <span class="kw2">global</span> <span class="re0">$cipher</span><span class="sy0">,</span> <span class="re0">$mode</span><span class="sy0">,</span> <span class="re0">$miui_key</span><span class="sy0">,</span> <span class="re0">$miui_iv</span><span class="sy0">;</span><br /> <br /> <span class="re0">$td</span> <span class="sy0">=</span> <a href="http://www.php.net/mcrypt_module_open"><span class="kw3">mcrypt_module_open</span></a><span class="br0">(</span><span class="re0">$cipher</span><span class="sy0">,</span> <span class="st_h">''</span><span class="sy0">,</span> <span class="re0">$mode</span><span class="sy0">,</span> <span class="st_h">''</span><span class="br0">)</span><span class="sy0">;</span><br /> <a href="http://www.php.net/mcrypt_generic_init"><span class="kw3">mcrypt_generic_init</span></a><span class="br0">(</span><span class="re0">$td</span><span class="sy0">,</span> <span class="re0">$miui_key</span><span class="sy0">,</span> <span class="re0">$miui_iv</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="re0">$bs</span> <span class="sy0">=</span> <a href="http://www.php.net/mcrypt_get_block_size"><span class="kw3">mcrypt_get_block_size</span></a><span class="br0">(</span><span class="re0">$cipher</span><span class="sy0">,</span> <span class="re0">$mode</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="re0">$n</span> <span class="sy0">=</span> <span class="re0">$bs</span> <span class="sy0">-</span> <span class="br0">(</span><a href="http://www.php.net/strlen"><span class="kw3">strlen</span></a><span class="br0">(</span><span class="re0">$s</span><span class="br0">)</span> <span class="sy0">%</span> <span class="re0">$bs</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="kw1">while</span> <span class="br0">(</span><span class="re0">$bs</span> <span class="sy0">-</span> <span class="br0">(</span><a href="http://www.php.net/strlen"><span class="kw3">strlen</span></a><span class="br0">(</span><span class="re0">$s</span><span class="br0">)</span> <span class="sy0">%</span> <span class="re0">$bs</span><span class="br0">)</span> <span class="sy0">!=</span> <span class="re0">$bs</span><span class="br0">)</span><br /> <span class="re0">$s</span> <span class="sy0">.=</span> <a href="http://www.php.net/chr"><span class="kw3">chr</span></a><span class="br0">(</span><span class="re0">$n</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="re0">$encrypted</span> <span class="sy0">=</span> <a href="http://www.php.net/base64_encode"><span class="kw3">base64_encode</span></a><span class="br0">(</span><a href="http://www.php.net/mcrypt_generic"><span class="kw3">mcrypt_generic</span></a><span class="br0">(</span><span class="re0">$td</span><span class="sy0">,</span> <span class="re0">$s</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span><br /> <a href="http://www.php.net/mcrypt_generic_deinit"><span class="kw3">mcrypt_generic_deinit</span></a><span class="br0">(</span><span class="re0">$td</span><span class="br0">)</span><span class="sy0">;</span><br /> <a href="http://www.php.net/mcrypt_module_close"><span class="kw3">mcrypt_module_close</span></a><span class="br0">(</span><span class="re0">$td</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="kw1">return</span> <span class="re0">$encrypted</span><span class="sy0">;</span><br /><span class="br0">}</span><br /> <br /><span class="re0">$checkurl</span> <span class="sy0">=</span> <span class="st_h">'http://update.miui.com/updates/miotaV3.php'</span><span class="sy0">;</span><br /> <br /><span class="re0">$device_data</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><br /> <span class="st0">"a"</span> <span class="sy0">=></span> <span class="st0">"0"</span><span class="sy0">,</span> <span class="co2"># Don't know what this is.<br /></span> <span class="st0">"c"</span> <span class="sy0">=></span> <span class="st0">"7.0"</span><span class="sy0">,</span> <span class="co2"># Same as 'c' above, it's the Android version.<br /></span> <span class="st0">"b"</span> <span class="sy0">=></span> <span class="st0">"F"</span><span class="sy0">,</span> <span class="co2"># Same as above, 'X' for weekly build.<br /></span> <span class="st0">"d"</span> <span class="sy0">=></span> <span class="st0">"mido_global"</span><span class="sy0">,</span> <span class="co2"># The device name, same as above, chiron for Chinese, chiron_global for global.<br /></span> <span class="st0">"g"</span> <span class="sy0">=></span> <span class="st0">"00000000000000000000000000000000"</span><span class="sy0">,</span> <span class="co2"># This seems to be the android_id of the device. Maybe encoded somehow.<br /></span> <span class="st0">"cts"</span> <span class="sy0">=></span> <span class="st0">"0"</span><span class="sy0">,</span> <span class="co2"># I don't know what this is.<br /></span> <span class="st0">"i"</span> <span class="sy0">=></span> <span class="st0">"0000000000000000000000000000000000000000000000000000000000000000"</span><span class="sy0">,</span> <span class="co2"># This seems to be the imei of the device, obviously encoded somehow.<br /></span> <span class="st0">"isR"</span> <span class="sy0">=></span> <span class="st0">"0"</span><span class="sy0">,</span> <span class="co2"># I don't know what this is.<br /></span> <span class="st0">"f"</span> <span class="sy0">=></span> <span class="st0">"1"</span><span class="sy0">,</span> <span class="co2"># I don't know what this is.<br /></span> <span class="st0">"l"</span> <span class="sy0">=></span> <span class="st0">"en_US"</span><span class="sy0">,</span> <span class="co2"># The locale.<br /></span> <span class="st0">"n"</span> <span class="sy0">=></span> <span class="st0">""</span><span class="sy0">,</span> <span class="co2"># I don't know what this parameter is<br /></span> <span class="st0">"sys"</span> <span class="sy0">=></span> <span class="st0">"0"</span><span class="sy0">,</span> <span class="co2"># I don't know what this is.<br /></span> <span class="st0">"p"</span> <span class="sy0">=></span> <span class="st0">"msm8953"</span><span class="sy0">,</span> <span class="co2"># The chipset<br /></span> <span class="st0">"unlock"</span> <span class="sy0">=></span> <span class="st0">"1"</span><span class="sy0">,</span> <span class="co2"># 1 means bootloader is unlocked. 0 means locked.<br /></span> <span class="st0">"r"</span> <span class="sy0">=></span> <span class="st0">"CN"</span><span class="sy0">,</span> <span class="co2"># I don't know what this is, maybe region of device?<br /></span> <span class="st0">"sn"</span> <span class="sy0">=></span> <span class="st0">"0x00000000"</span><span class="sy0">,</span> <span class="co2"># Probably the serial number of the device, maybe encoded somehow.<br /></span> <span class="st0">"v"</span> <span class="sy0">=></span> <span class="st0">"MIUI-V9.0.5.0.NCFMIEI"</span><span class="sy0">,</span> <span class="co2"># The version of MIUI installed.<br /></span> <span class="co1">//"v" => "MIUI-V8.5.8.0.NCFMIED",</span><br /> <span class="st0">"bv"</span> <span class="sy0">=></span> <span class="st0">"9"</span><span class="sy0">,</span> <span class="co2"># I don't know what this is.<br /></span> <span class="st0">"id"</span> <span class="sy0">=></span> <span class="st0">""</span><span class="sy0">,</span> <span class="co2"># I don't' know what this is.<br /></span><span class="br0">)</span><span class="sy0">;</span><br /> <br /><span class="re0">$js</span> <span class="sy0">=</span> <a href="http://www.php.net/json_encode"><span class="kw3">json_encode</span></a><span class="br0">(</span><span class="re0">$device_data</span><span class="br0">)</span><span class="sy0">;</span><br /> <br /><span class="re0">$postdata</span> <span class="sy0">=</span> <span class="st0">"q="</span><span class="sy0">.</span><a href="http://www.php.net/urlencode"><span class="kw3">urlencode</span></a><span class="br0">(</span>miui_encrypt<span class="br0">(</span><span class="re0">$js</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">.</span><span class="st0">"&t=&s=1"</span><span class="sy0">;</span><br /> <br /><span class="re0">$curl</span> <span class="sy0">=</span> <a href="http://www.php.net/curl_init"><span class="kw3">curl_init</span></a><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span><br /><a href="http://www.php.net/curl_setopt"><span class="kw3">curl_setopt</span></a><span class="br0">(</span><span class="re0">$curl</span><span class="sy0">,</span> CURLOPT_URL<span class="sy0">,</span> <span class="re0">$checkurl</span><span class="br0">)</span><span class="sy0">;</span><br /><a href="http://www.php.net/curl_setopt"><span class="kw3">curl_setopt</span></a><span class="br0">(</span><span class="re0">$curl</span><span class="sy0">,</span> CURLOPT_RETURNTRANSFER<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span><br /><a href="http://www.php.net/curl_setopt"><span class="kw3">curl_setopt</span></a><span class="br0">(</span><span class="re0">$curl</span><span class="sy0">,</span> CURLOPT_FOLLOWLOCATION<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span><br /><a href="http://www.php.net/curl_setopt"><span class="kw3">curl_setopt</span></a><span class="br0">(</span><span class="re0">$curl</span><span class="sy0">,</span> CURLOPT_HEADER<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span><br /><a href="http://www.php.net/curl_setopt"><span class="kw3">curl_setopt</span></a><span class="br0">(</span><span class="re0">$curl</span><span class="sy0">,</span> CURLOPT_POST<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span><br /><a href="http://www.php.net/curl_setopt"><span class="kw3">curl_setopt</span></a><span class="br0">(</span><span class="re0">$curl</span><span class="sy0">,</span> CURLOPT_POSTFIELDS<span class="sy0">,</span> <span class="re0">$postdata</span><span class="br0">)</span><span class="sy0">;</span><br /><span class="re0">$data</span> <span class="sy0">=</span> <a href="http://www.php.net/curl_exec"><span class="kw3">curl_exec</span></a><span class="br0">(</span><span class="re0">$curl</span><span class="br0">)</span><span class="sy0">;</span><br /><span class="kw1">if</span> <span class="br0">(</span><span class="re0">$data</span> <span class="sy0">===</span> <span class="kw4">false</span><span class="br0">)</span> <span class="br0">{</span><br /> <span class="kw1">echo</span> <span class="st0">"*** curl_exec() failed: "</span><span class="sy0">.</span><a href="http://www.php.net/curl_errno"><span class="kw3">curl_errno</span></a><span class="br0">(</span><span class="re0">$curl</span><span class="br0">)</span><span class="sy0">.</span><span class="st0">" => "</span><span class="sy0">.</span><a href="http://www.php.net/curl_error"><span class="kw3">curl_error</span></a><span class="br0">(</span><span class="re0">$curl</span><span class="br0">)</span><span class="sy0">.</span><span class="st0">"<span class="es1">\n</span>"</span><span class="sy0">;</span><br /> <a href="http://www.php.net/curl_close"><span class="kw3">curl_close</span></a><span class="br0">(</span><span class="re0">$curl</span><span class="br0">)</span><span class="sy0">;</span><br /> <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="sy0">;</span><br /><span class="br0">}</span><br /> <br /><span class="re0">$r</span> <span class="sy0">=</span> miui_decrypt<span class="br0">(</span><span class="re0">$data</span><span class="br0">)</span><span class="sy0">;</span><br /><span class="re0">$result</span> <span class="sy0">=</span> <a href="http://www.php.net/json_decode"><span class="kw3">json_decode</span></a><span class="br0">(</span><span class="re0">$r</span><span class="br0">)</span><span class="sy0">;</span><br /><a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a><span class="br0">(</span><span class="re0">$result</span><span class="br0">)</span><span class="sy0">;</span><br /> <br /><a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="sy0">;</span></div></pre><p> </p><div> </div><div>上面那個是用紅米 Note4X 國際版為例子. 找 MIUI-V9.0.5.0.NCFMIEI 的升級版本.</div><div>如果要找其他的機型, 請改 c, d, v 這三個值, c 是 Android 版本, d 是機型代碼 (國際版加上 _global), v 是版本名稱.</div><div><br /></div><div>會列出該版本之後的版本 (如果是最新的, 就會列出目前這個版本).</div><div>所以... 我們就可以取得 V9.0.5.0.NCFMIEI 這個版本的檔名: miui_HMNote4XGlobal_V9.0.5.0.NCFMIEI_d6176de291_7.0.zip</div><div><br /></div><div>有檔名之後, 小米的路徑規則是 http://bigota.d.miui.com/版本/檔案</div><div>所以下載的網址就是 <a href="http://bigota.d.miui.com/V9.0.5.0.NCFMIEI/miui_HMNote4XGlobal_V9.0.5.0.NCFMIEI_d6176de291_7.0.zip" target="_blank">http://bigota.d.miui.com/V9.0.5.0.NCFMIEI/miui_HMNote4XGlobal_V9.0.5.0.NCFMIEI_d6176de291_7.0.zip</a> </div><div><br /></div>
Android
2017-11-26T11:28:04Z
tommy
-
修正 ProxyDroid 2.7.x 自動連線無法正常使用的問題
https://blog.teatime.com.tw/1/post/476
<p><a href="https://github.com/madeye/proxydroid" target="_blank">ProxyDroid</a> 自 2.7.0 版本開始, 在我的手機上自動連線的功能就無法正常使用. 只能把 ProxyDroid 的程式打開去點才能正常使用. 連同桌面上的 widget 也一樣, 啟用的功能無法正常運作.</p><p>今天試著用 adb logcat 查了一下, 發現有 java.lang.NullPointerException 的問題:</p><pre class="bash"><div class="insertcode">E<span class="sy0">/</span>ProxyDroidService<span class="br0">(</span><span class="nu0">20295</span><span class="br0">)</span>: Error setting up port forward during connect<br />E<span class="sy0">/</span>ProxyDroidService<span class="br0">(</span><span class="nu0">20295</span><span class="br0">)</span>: java.lang.NullPointerException: Attempt to invoke virtual method <span class="st_h">'int java.lang.String.length()'</span> on a null object reference<br />E<span class="sy0">/</span>ProxyDroidService<span class="br0">(</span><span class="nu0">20295</span><span class="br0">)</span>: at org.proxydroid.ProxyDroidService.enableProxy<span class="br0">(</span>ProxyDroidService.java:<span class="nu0">263</span><span class="br0">)</span><br />E<span class="sy0">/</span>ProxyDroidService<span class="br0">(</span><span class="nu0">20295</span><span class="br0">)</span>: at org.proxydroid.ProxyDroidService.handleCommand<span class="br0">(</span>ProxyDroidService.java:<span class="nu0">394</span><span class="br0">)</span><br />E<span class="sy0">/</span>ProxyDroidService<span class="br0">(</span><span class="nu0">20295</span><span class="br0">)</span>: at org.proxydroid.ProxyDroidService<span class="re4">$3</span>.run<span class="br0">(</span>ProxyDroidService.java:<span class="nu0">715</span><span class="br0">)</span><br />E<span class="sy0">/</span>ProxyDroidService<span class="br0">(</span><span class="nu0">20295</span><span class="br0">)</span>: at java.lang.Thread.run<span class="br0">(</span>Thread.java:<span class="nu0">818</span><span class="br0">)</span></div></pre><p>應該是 certificate 這個變數是 null 所造成的問題, 加上了檢查的動作就正常了.</p><p>由於原作者沒有打開 issue 的功能, 只好 <a href="https://github.com/twu2/proxydroid" target="_blank">fork 出來</a>再利用 pull request 送出這個 patch. 順便把 wifi-ap 模式的支援也加入.</p><p>目前看起來應該<a href="https://github.com/madeye/proxydroid/commits/master" target="_blank">有被作者接受</a>. 所以... 希望下一版會正常. </p><p>等不及下一版的可以抓這個回去試看看: <a href="http://www.teatime.com.tw/~tommy/files/proxydroid-2.7.9-2.7.4.apk" target="_blank">http://www.teatime.com.tw/~tommy/files/proxydroid-2.7.9-2.7.4.apk </a> </p><p> </p><p> </p>
Patch
Software
Android
2016-05-17T10:52:35Z
tommy
-
ProxyDroid 加上熱點分享的支援
https://blog.teatime.com.tw/1/post/469
<p>因為用的行動網路是 mcool 的方案, 之前都是使用 <a href="https://play.google.com/store/apps/details?id=org.proxydroid&hl=zh_TW" target="_blank">ProxyDroid</a> 搭配自己家裡的 proxy 來使用. 使用上都很正常... 只是在分享熱點給別人用時, 每個連上的人都要自行去設定使用 proxy (或者一樣搭配 ProxyDroid 使用, 我自己的平板是這樣子來使用...) 才可以連上所有的服務, 否則就只能使用 mcool 提供的服務 (facebook, line 之類的還能使用).</p><p>因為最近發現手機的 ProxyDroid 2.7.x 的版本, 在每次自動連線或點選桌面上的 widget 來打開服務時, 雖然都會顯示服務已經啟用 (通知欄有程式, widget 的圖示也變綠色了), 不過... 實際上確沒有真的去使用 proxy (難怪我這一陣子總覺得網路變的很不順).... (透過 adb shell 進去看, redsocks 與 stunnel 並沒有真的執行). 一定要進去 ProxyDroid 的主畫面去點 On 才會真的去執行.</p><p>上網找了舊的版本 (2.6.3) 回來用, 發現並沒有這個問題.... 由於 <a href="https://github.com/madeye/proxydroid" target="_blank">ProxyDroid 是 opensource</a> 的東西... 所以就自己 git 回來試, 發現是在 2.7.0 開始無法正常使用. 雖然可以安裝回 2.6.6 的版本... 可是更新時就變麻煩, 不能使用全部更新的功能, 要一個個去點, 不然... 就會連 ProxyDroid 都升到 2.7.2 的版本, 反而又無法正常使用.</p><p>所以... 決定自己 build 一個版本來用 (把版號改大一點就不會升級, 若不小心也升級的就, 會因為數位簽名不一樣而無法升級成功)... 因為要改... 就順便加上熱點的支援 (其實也不過就是原本 iptables 針對 OUTPUT 的處理加上 PREROUTING 的處理而已)...</p><p>弄好的版本放<a href="#!sApA1YyC!dq_a0Fpiq__38J1juAoKbHoAj2dHaZVhpRTbe922ctM" target="_blank">這兒</a>, 版號改成 2.7.9 (實際上是 2.6.6), 如果有需要的話, 就自己抓回去試吧. </p>
Android
2014-12-09T09:34:47Z
tommy
-
修正 A1-810 在 root 之後, Superuser 無法正確更新 su 執行檔的問題
https://blog.teatime.com.tw/1/post/466
<p>最近發現 <a href="https://play.google.com/store/apps/details?id=com.koushikdutta.superuser&hl=zh_TW" target="_blank">Superuser</a> 在推出新版本時, 如果有更新 su 的執行檔, 會在這個更新的動作失敗 (還好並不像 SuperSU 之類的其它軟體一樣, 更新失敗後就會跳出, 無法使用), 所以, 雖然不更新 su 也可以正常使用, 不過... 每次進去都要問一次也不太好...</p><p>看了一下 <a href="https://github.com/koush/Superuser/blob/master/Superuser/src/com/koushikdutta/superuser/MainActivity.java" target="_blank">Superuser 的原始碼</a>, 看起來在 remount /system 為可讀寫的動作時, 是使用</p><pre class="bash"><div class="insertcode"><span class="kw2">mount</span> -orw,remount <span class="sy0">/</span>system</div></pre><p>這個指令, 而我們在 A1-810 上頭所使用的修正 wrapper.sh 是針對</p><pre class="bash"><div class="insertcode"><span class="kw2">mount</span> <span class="re5">-o</span> rw,remount <span class="sy0">/</span>system</div></pre><p>來處理, 也就是.... 差了一個空白, 對於參數的判斷會不正確, 所以不會正常運作.</p><p>把 wrapper.sh 改成這樣子:</p><pre class="bash"><div class="insertcode"><span class="co0">#!/system/bin/sh</span><br /> <br /><span class="re2">CMD</span>=<span class="sy0">`</span><span class="kw2">basename</span> <span class="re4">$0</span><span class="sy0">`</span><br /><span class="re2">ARG</span>=<span class="st0">"$*"</span><br /><span class="re2">NEWARG</span>=<span class="st0">"-o remount,rw /system /system/"</span><br /><span class="re2">LArg</span>=$<span class="br0">(</span><span class="kw3">eval</span> <span class="kw3">echo</span> \<span class="re4">$$</span>#<span class="br0">)</span><br /> <br /><span class="kw1">case</span> <span class="st0">"<span class="es2">$CMD</span>"</span> <span class="kw1">in</span><br /> <span class="st0">"busybox"</span><span class="br0">)</span><br /> <span class="kw1">if</span> <span class="br0">[</span> <span class="re4">$1</span> == <span class="st0">"mount"</span> <span class="br0">]</span> <span class="sy0">&&</span> <span class="br0">(</span><span class="br0">(</span><span class="br0">[</span> <span class="re4">$2</span> == <span class="st0">"-o"</span> <span class="br0">]</span> <span class="sy0">&&</span> <span class="br0">(</span><span class="br0">[</span> <span class="re4">$3</span> == <span class="st0">"rw,remount"</span> <span class="br0">]</span> <span class="sy0">||</span> <span class="br0">[</span> <span class="re4">$3</span> == <span class="st0">"remount,rw"</span> <span class="br0">]</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">||</span> <span class="br0">[</span> <span class="re4">$2</span> == <span class="st0">"-oremount,rw"</span> <span class="br0">]</span> <span class="sy0">||</span> <span class="br0">[</span> <span class="re4">$2</span> == <span class="st0">"-oremount,rw"</span> <span class="br0">]</span><span class="br0">)</span>; <span class="kw1">then</span><br /> <span class="kw1">if</span> <span class="br0">[</span> <span class="re1">$LArg</span> == <span class="st0">"/system"</span> <span class="br0">]</span> <span class="sy0">||</span> <span class="br0">[</span> <span class="re1">$LArg</span> == <span class="st0">"/system/"</span> <span class="br0">]</span>; <span class="kw1">then</span><br /> <span class="sy0">/</span>system<span class="sy0">/</span>xbin<span class="sy0">/</span>.mount_wrapper<span class="sy0">/</span><span class="kw2">mount</span> <span class="re1">$NEWARG</span><br /><span class="co0"># return $?</span><br /> <span class="kw3">return</span> <span class="nu0">0</span><br /> <span class="kw1">fi</span><br /> <span class="kw1">fi</span><br /> <span class="sy0">/</span>system<span class="sy0">/</span>xbin<span class="sy0">/</span>busybox <span class="re1">$ARG</span><br /><span class="co0"># return $?</span><br /> <span class="kw3">return</span> <span class="nu0">0</span><br /> <span class="sy0">;;</span><br /> <br /> <span class="st0">"mount"</span><span class="br0">)</span><br /> <span class="kw1">if</span> <span class="br0">(</span><span class="br0">[</span> <span class="re4">$1</span> == <span class="st0">"-o"</span> <span class="br0">]</span> <span class="sy0">&&</span> <span class="br0">(</span><span class="br0">[</span> <span class="re4">$2</span> == <span class="st0">"rw,remount"</span> <span class="br0">]</span> <span class="sy0">||</span> <span class="br0">[</span> <span class="re4">$2</span> == <span class="st0">"remount,rw"</span> <span class="br0">]</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">||</span> <span class="br0">[</span> <span class="re4">$1</span> == <span class="st0">"-oremount,rw"</span> <span class="br0">]</span> <span class="sy0">||</span> <span class="br0">[</span> <span class="re4">$1</span> == <span class="st0">"-orw,remount"</span> <span class="br0">]</span>; <span class="kw1">then</span><br /> <span class="kw1">if</span> <span class="br0">[</span> <span class="re1">$LArg</span> == <span class="st0">"/system"</span> <span class="br0">]</span> <span class="sy0">||</span> <span class="br0">[</span> <span class="re1">$LArg</span> == <span class="st0">"/system/"</span> <span class="br0">]</span>; <span class="kw1">then</span><br /> <span class="sy0">/</span>system<span class="sy0">/</span>xbin<span class="sy0">/</span>.mount_wrapper<span class="sy0">/</span><span class="kw2">mount</span> <span class="re1">$NEWARG</span><br /><span class="co0"># return $?</span><br /> <span class="kw3">return</span> <span class="nu0">0</span><br /> <span class="kw1">fi</span><br /> <span class="kw1">fi</span><br /> <span class="sy0">/</span>system<span class="sy0">/</span>bin<span class="sy0">/</span>toolbox <span class="kw2">mount</span> <span class="re1">$ARG</span><br /><span class="co0"># return $?</span><br /> <span class="kw3">return</span> <span class="nu0">0</span><br /> <span class="sy0">;;</span><br /><span class="kw1">esac</span><br /> <br /><span class="kw3">exit</span> <span class="nu0">0</span></div></pre><p>這樣子就可以正常的處理了. </p><p>我記得當初有也其他的軟體不能正常 remount /system, 應該也是同樣的問題吧 (不過, 我沒用這些軟體... 不清楚這樣改了之後是不是就正常了).</p><p>至於.... 怎麼更新這個檔案呢? 如果你不懂 Linux 的指令, 或對命令列不熟, 建議.... 就不要改了, 畢竟沒弄好, 重開機可能會開不起來 (mount 動作無法正常運作).</p><p>如果不怕的話, 可以自己用 adb 去處理吧 (看不懂 adb 是什麼就建議不要做了).</p>
Android
2013-12-02T13:06:25Z
tommy
-
Acer A1-810 RV21RC03_TWN root image
https://blog.teatime.com.tw/1/post/460
<p>這是 RV21RC03_TWN root 之後的 system.img.gz, 抓回去自行改名為 system.img.gz 用 toolkit 就可以了.<br /><br />
File: RV21RC03_TWN.rooted.img.gz<br />
CRC-32: adbdcb27<br />
MD4: cf7206efec5f47991e9c3f9d71639fc3<br />
MD5: 5bf5706461b7941e9c7199c7b373b0e7<br />
SHA-1: 007730b4c70106d86e14e8c88aeb551542442658<br /><a href="#%21hNhAlYpI%21Ka7ha02qf8peTj4HV_bF1XpXC_4mUgYwSURJlTsUoss" target="_blank">https://mega.co.nz/#!hNhAlYpI!Ka7ha02qf8peTj4HV_bF1XpXC_4mUgYwSURJlTsUoss</a></p><p></p><p>在已 root 的機器上, 是不允許做 OTA 更新的, 就是檢查更新的時候會失敗. 通常我們可以利用 OTA RootKeeper 之類的軟體, 先備份 root (su), 再 temp un-root (不是用 toolkit 去 unroot, 那個會刪除 su, 沒辦法恢復, 只能重做), 就應該可以做系統更新的檢查動作, 也應該可以正常更新.</p><p>而通常更新的動作, 會用 bspatch 的方式來處理, 也就是舊的檔案要存在才可以.... 所以... 建議 root 之後, 不要去刪除 /system 裡頭的東西, 以避免更新時發生錯誤. </p>
Android
2013-09-20T10:17:49Z
tommy
-
Acer A1-810 官方的 ROM 與 kernel source
https://blog.teatime.com.tw/1/post/459
<p>其實之前 Acer 就把 kernel source 上到<a href="http://www.acer.com.tw/ac/zh/TW/content/drivers/4756;-;A1-810" target="_blank">官網</a> 上面, 不過.... 我猜應該是放錯了吧.... 因為用那個 source build 出來的 module, 常常抱怨有些 function 在機器目前的 kernel 並沒有 export 出來.... 試著去改 .config 來加入該 function, 最後做出來的 module 往往無法正常載入... 我在之前下載那個 source, 試著加上 exfat 時, 試了一陣子, 最後就放棄了.</p><p>這個月初, 雖然 Acer 官網上檔案的名稱一樣, 不過檔案的日期改變了 (當然內容也不一樣了), 也放上了正體中文的 ROM (似乎只有中文的, 因為英文的網站目前還沒有)</p><p>用新的 kernel source, 我可以正確的 build 出 exfat.ko (<a href="https://github.com/dorimanx/exfat-nofuse" target="_blank">exfat-nofuse</a> 的版本), 不過, 很不幸的, A1-810 上頭的 vold 不認得 exfat, 就算手動的方式可以載入 exfat.ko, 也可以 mount, 正常讀寫也沒問題, 不過.... vold 就是不認得. 也就是你在設定的儲存空間是看不到那個內容, 一般的程式也看不到該內容 (就算 mount 在同一路徑也一樣). </p>
Linux
Android
2013-09-08T14:10:49Z
tommy
-
如何自行匯入信任的 Root CA?
https://blog.teatime.com.tw/1/post/453
<p>依據以往的經驗, 在 Linux 底下, 應該是把 .crt 的檔案直接放到 /etc/ssl/certs/ 底下就可以. 不過... 我在我的 A1-810 上頭, 沒看到這個目錄, 倒是有 /system/etc/security/cacerts/ 這目錄, 底下的確也都是一堆 root CA. 所以... 看起來應該就是放這兒就好了.</p><p>不過.... 實際放上去, 在系統的確可以看到該 Root CA 出現, 但是... 系統並沒有去使用它.</p><p>找了半天, 終於看到<a href="http://blog.kylemanna.com/android/2013/06/02/android-ca-certificates/" target="_blank">這篇文章</a>, 裡頭的做法是要查出 hash code, 然後用 hash code 做檔名就可以.</p><pre class="bash"><div class="insertcode"><pre class="bash" style="font-family: monospace">openssl x509 <span class="re5">-in</span> <span class="sy0"></span>myrootca.crt -subject_hash_old <span class="re5">-noout</span></pre></div></pre><p>上面的指令, 會算出該 .crt 的 hash code, 假設得到的是 8f8f8f8f, 這時只要做一個連結 ln -s myrootca.crt 8f8f8f8f.0 就可以了.</p><p>再去試看看, 果然不會出現錯誤, 的確將該憑證視為信任的憑證了.</p><p>PS. 如果你有多個檔案算出來是同一個 hash code, 只要用不同的副檔名就可以 (由 .0 開始算.... 第二個用 .1 就可以了)</p>
Linux
Android
2013-07-31T13:17:25Z
tommy
-
Acer A1-810 rooted /system read-write workaround
https://blog.teatime.com.tw/1/post/452
<p>之前對 /system 讀寫的修正是使用 <a href="http://forum.xda-developers.com/showpost.php?p=43304371&postcount=795" target="_blank">sodaFR 所提供的方案</a>, 由於系統本身多數的指令是透過 /system/bin/toolbox 來處理, 不過對於 mount 指令, 會限制不能把 /system remount 為可讀寫的模式. 而 sodaFR 的解決方法是加入一個 busybox 的程式, 然後透過 busybox 去 mount 就可以避開這個限制.</p><p>他寫了一個 /system/bin/wrapper.sh 的指令, 透過它去判斷是否要去 remount /system 為 rw 的狀態, 如果是, 就透過 /system/xbin/mount (softlink 到 busybox) 去處理. 其他就丟給原本的 /system/bin/mount (softlink 到 toolbox). 然後做一個 /system/bin/busybox 的 softlink 到 /system/bin/wrapper.sh, 這樣子, 只要是透過 /system/bin/busybox 去做 remount 的動作就會成功. 不是的話就會失敗.</p><p>不過.... 似乎很多程式在 remount /system 時, 並不是透過 /system/bin/busybox 去做 (為什麼要這樣做, 在 Android 有什麼限制要之樣子處理嗎? 一般 linux 的系統, 不都是直接呼叫 mount 指令來處理嗎?), 所以執行的結果就不正常. (所以<a href="http://blog.teatime.com.tw/1/post/451" target="_blank">上一篇</a>我會對 <a href="https://play.google.com/store/apps/details?id=org.projectvoodoo.otarootkeeper" target="_blank">OTA RootKeepert</a> 做修正)</p><p>所以... 我就對這個再做了一點修正:</p><ul><li>由於 busybox 是依據 softlink 的名稱來決定要執行什麼功能, 所以, 我們仍需要一個指到 /system/xbin/busybox 的 mount 指令, 但又不能用 /system/bin/mount 或 /system/xbin/mount, 所以... 就建一個目錄 /system/xbin/.mount_wrapper/ , 然後在裡頭做一個叫 mount 的 softlink 指到 /system/xbin/busybox, 如: <br /><pre class="bash"><div class="insertcode"><pre class="bash" style="font-family: monospace">shell<span class="sy0">@</span>android:<span class="sy0">/</span>system<span class="sy0">/</span>xbin<span class="sy0">/</span>.mount_wrapper <span class="co0"># ls -la</span><br /><span class="kw2">ls</span> <span class="re5">-la</span><br />lrwxrwxrwx root root 2013-07-30 10:09 <span class="kw2">mount</span> -<span class="sy0">></span> ..<span class="sy0">/</span>busybox</pre></div></pre></li><li>把 /system/bin/wrapper.sh 改成這個樣子: <br /><pre class="bash"><div class="insertcode"><pre class="bash" style="font-family: monospace"><span class="co0">#!/system/bin/sh</span><br /> <br /><span class="re2">CMD</span>=<span class="sy0">`</span><span class="kw2">basename</span> $0<span class="sy0">`</span><br /><span class="re2">ARG</span>=<span class="st0">"$*"</span><br /><span class="re2">NEWARG</span>=<span class="st0">"-o remount,rw /system /system/"</span><br /><span class="re2">LArg</span>=$<span class="br0">(</span><span class="kw3">eval</span> <span class="kw3">echo</span> \<span class="re4">$$</span>#<span class="br0">)</span><br /> <br /><span class="kw1">case</span> <span class="st0">"<span class="es2">$CMD</span>"</span> <span class="kw1">in</span><br /> <span class="st0">"busybox"</span><span class="br0">)</span><br /> <span class="kw1">if</span> <span class="br0">[</span> $<span class="nu0">1</span> == <span class="st0">"mount"</span> <span class="br0">]</span> <span class="sy0">&&</span> <span class="br0">[</span> $<span class="nu0">2</span> == <span class="st0">"-o"</span> <span class="br0">]</span> <span class="sy0">&&</span> <span class="br0">(</span><span class="br0">[</span> $<span class="nu0">3</span> == <span class="st0">"rw,remount"</span> <span class="br0">]</span> <span class="sy0">||</span> <span class="br0">[</span> $<span class="nu0">3</span> == <span class="st0">"remount,rw"</span> <span class="br0">]</span><span class="br0">)</span>; <span class="kw1">then</span><br /> <span class="kw1">if</span> <span class="br0">[</span> <span class="re1">$LArg</span> == <span class="st0">"/system"</span> <span class="br0">]</span> <span class="sy0">||</span> <span class="br0">[</span> <span class="re1">$LArg</span> == <span class="st0">"/system/"</span> <span class="br0">]</span>; <span class="kw1">then</span><br /> <span class="sy0">/</span>system<span class="sy0">/</span>xbin<span class="sy0">/</span>.mount_wrapper<span class="sy0">/</span><span class="kw2">mount</span> <span class="re1">$NEWARG</span><br /><span class="co0"># return $?</span><br /> <span class="kw3">return</span> 0<br /> <span class="kw1">fi</span><br /> <span class="kw1">fi</span><br /> <span class="sy0">/</span>system<span class="sy0">/</span>xbin<span class="sy0">/</span>busybox <span class="re1">$ARG</span><br /><span class="co0"># return $?</span><br /> <span class="kw3">return</span> 0<br /> <span class="sy0">;;</span><br /> <br /> <span class="st0">"mount"</span><span class="br0">)</span><br /> <span class="kw1">if</span> <span class="br0">[</span> $<span class="nu0">1</span> == <span class="st0">"-o"</span> <span class="br0">]</span> <span class="sy0">&&</span> <span class="br0">(</span><span class="br0">[</span> $<span class="nu0">2</span> == <span class="st0">"rw,remount"</span> <span class="br0">]</span> <span class="sy0">||</span> <span class="br0">[</span> $<span class="nu0">2</span> == <span class="st0">"remount,rw"</span> <span class="br0">]</span><span class="br0">)</span>; <span class="kw1">then</span><br /> <span class="kw1">if</span> <span class="br0">[</span> <span class="re1">$LArg</span> == <span class="st0">"/system"</span> <span class="br0">]</span> <span class="sy0">||</span> <span class="br0">[</span> <span class="re1">$LArg</span> == <span class="st0">"/system/"</span> <span class="br0">]</span>; <span class="kw1">then</span><br /> <span class="sy0">/</span>system<span class="sy0">/</span>xbin<span class="sy0">/</span>.mount_wrapper<span class="sy0">/</span><span class="kw2">mount</span> <span class="re1">$NEWARG</span><br /><span class="co0"># return $?</span><br /> <span class="kw3">return</span> 0<br /> <span class="kw1">fi</span><br /> <span class="kw1">fi</span><br /> <span class="sy0">/</span>system<span class="sy0">/</span>bin<span class="sy0">/</span>toolbox <span class="kw2">mount</span> <span class="re1">$ARG</span><br /><span class="co0"># return $?</span><br /> <span class="kw3">return</span> 0<br /> <span class="sy0">;;</span><br /><span class="kw1">esac</span><br /> <br /><span class="kw3">exit</span> <span class="nu0">0</span></pre></div></pre></li><li>然後把 /system/bin/busybox, /system/bin/mount, /system/xbin/mount 都用 softlink 的方式指到 /system/bin/wrapper.sh, 如: <br /><pre class="bash"><div class="insertcode"><pre class="bash" style="font-family: monospace">shell<span class="sy0">@</span>android:<span class="sy0">/</span>system<span class="sy0">/</span>xbin <span class="co0"># ls -la mount</span><br /><span class="kw2">ls</span> <span class="re5">-la</span> <span class="kw2">mount</span><br />lrwxrwxrwx root root 2013-07-30 10:09 <span class="kw2">mount</span> -<span class="sy0">></span> ..<span class="sy0">/</span>bin<span class="sy0">/</span>wrapper.sh<br />shell<span class="sy0">@</span>android:<span class="sy0">/</span>system<span class="sy0">/</span>xbin <span class="co0"># cd ../bin</span><br /><span class="kw3">cd</span> ..<span class="sy0">/</span>bin<br />shell<span class="sy0">@</span>android:<span class="sy0">/</span>system<span class="sy0">/</span>bin <span class="co0"># ls -la mount</span><br /><span class="kw2">ls</span> <span class="re5">-la</span> <span class="kw2">mount</span><br />lrwxrwxrwx root root 2013-07-30 10:01 <span class="kw2">mount</span> -<span class="sy0">></span> wrapper.sh<br />shell<span class="sy0">@</span>android:<span class="sy0">/</span>system<span class="sy0">/</span>bin <span class="co0"># ls -la busybox</span><br /><span class="kw2">ls</span> <span class="re5">-la</span> busybox<br />lrwxrwxrwx root root <span class="nu0">2013</span>-07-<span class="nu0">30</span> <span class="nu0">10</span>:01 busybox -<span class="sy0">></span> wrapper.sh</pre></div></pre></li></ul><p>經過這樣子的處理之後, 不管是執行 /system/bin/mount 或 /system/xbin/mount (通常都是用這兩個吧) 或 /system/bin/busybox 來做 remount /system 的動作, 都可以正常執行. 我試過沒改過的 OTA RootKeeper 或 <a href="https://play.google.com/store/apps/details?id=com.estrongs.android.pop&hl=zh_TW" target="_blank">ES File Explorer</a> 都可以正常運作.</p><p>我把相關的檔案連同 <a href="https://play.google.com/store/apps/details?id=com.koushikdutta.superuser&hl=zh_TW" target="_blank">koush 的 Superuser.apk 與 su </a> 打包成為 su.tgz, 可以由這兒下載:</p><p><a href="http://www.multiupload.nl/9XZ7BJ6ZH0" target="_blank">http://www.multiupload.nl/9XZ7BJ6ZH0</a> </p><p>如果要重做 system.img.gz 的話, 就抓回去解開來用就可以. 如果已 root 的機器, 會下指令就依照上頭的方式自己做, 或直接拿 su.tgz 到 /system 解開來用也可以. </p><p>這個是 TWN RV18RC11 版本以上面說的方式做出來的 system.img.gz (因為用 dd 清過, 所以壓起來小了許多), 如果需要請自己抓回去用吧.</p><p><a href="http://www.multiupload.nl/OG1RK9HYT9" target="_blank">system.img_20130730.7z.001 (100 MB)<br />http://www.multiupload.nl/OG1RK9HYT9<br /></a> <br /><a href="http://www.multiupload.nl/FI6XFN8YOC" target="_blank">system.img_20130730.7z.002 (100 MB)<br />http://www.multiupload.nl/FI6XFN8YOC</a> <br /><br /><a href="http://www.multiupload.nl/BHEPGDGXAN" target="_blank">system.img_20130730.7z.003 (100 MB)<br />http://www.multiupload.nl/BHEPGDGXAN</a> <br /><br /><a href="http://www.multiupload.nl/KJFEVR3J6P" target="_blank">system.img_20130730.7z.004 (100 MB)<br />http://www.multiupload.nl/KJFEVR3J6P</a> <br /><br /><a href="http://www.multiupload.nl/8AHGTHL6CD" target="_blank">system.img_20130730.7z.005 (7.5 MB)<br />http://www.multiupload.nl/8AHGTHL6CD</a> <br /><br />解開來的 system.img.gz 的檢查碼為:<br /> File: system.img.gz<br />CRC-32: ed63aebd<br /> MD4: dbd6eafff674c4428248e6f77cc80304<br /> MD5: f63b516201fe8d484cae9ee733bee39c<br /> SHA-1: 1d610b9aa7339591651252404858d4601643c20e</p><p>原則上, 如果已經 root 的機器, 應該自己用 adb 進去改一改比較好, 當然.... 想重刷也可以. (不過重刷的風險畢竟比較大一些) </p>
Android
2013-07-30T12:46:40Z
tommy
-
OTA RootKeeper modified version for A1-810
https://blog.teatime.com.tw/1/post/451
<div id="ct45191029">由於之前那個 /system 寫入的修正是使用 busybox 去 remount, 一般的 mount 指令會不成功.... 所以要改一下才能用...</div><div id="ct45191029">在該修正中, 如果要把 /system mount 為 rw 的話, 要用下面的指令才能:</div><div id="ct45191029"><pre class="bash"><div class="insertcode"><pre class="bash" style="font-family: monospace"><span class="sy0">/</span>system<span class="sy0">/</span>xbin<span class="sy0">/</span><span class="kw2">mount</span> <span class="re5">-o</span> remount,rw <span class="sy0">/</span>system <span class="sy0">/</span>system<span class="sy0">/</span></pre></div></pre><p>差一個字元都不行.... 所以正常的 <a href="https://play.google.com/store/apps/details?id=org.projectvoodoo.otarootkeeper" target="_blank">OTA RootKeeper</a> 不能用.</p></div><div id="ct45191029">這是我修改過的 OTA Root Keeper, 用這個版本就可以正常的備份與還原 root 了.<br /><a href=" http://www.multiupload.nl/WLKYQNNJXC" target="_blank">
http://www.multiupload.nl/WLKYQNNJXC</a> <br />
<br />
需要系統更新時, 只要先用這個軟體備份一下 root 再執行 Temp. un-root 就能更新了. 更新後再 restore root 就可以.</div>
Android
2013-07-26T13:09:33Z
tommy