Tag Archive for 折腾

BIOS + GPT + GRUB + Linux + Windows 折腾笔记

其实从标题就能看出来我有多蛋疼了。我不期望还有别的人和我有同样的奇怪需求,但是希望本文的一部分或几部分能对部分折腾者有一定有作用。

一、为什么会有这样的需求

要 BIOS 不要 UEFI

虽说现在的主板都采用 UEFI 了;虽说 BIOS 是很古老的东西了……但是,我实在不喜欢 UEFI 的复杂设计。说是 Unified 但是我感觉它一点也不统一。最重要的是:UEFI 对 Linux 不够友好。

要 GPT 不要 MBR

虽说严格来说 GPT 也是 UEFI 的一部分,但是我对它的印象好多了——MBR 只支持 4 个主分区而 GPT 默认情况就能支持 128 个分区,再也不用小心翼翼地折腾扩展分区和逻辑分区——这也是我所讨厌的。

要 Steam.exe 不要 Steam.deb

虽然我已经用惯了 Arch Linux;虽然 Valve 也有出 Steam for Linux 甚至 SteamOS,但是至少到目前为止,毕竟 Windows 才是正经的玩游戏的操作系统。

二、BIOS + GPT

2009 年之后的主板基本是 BIOS + UEFI 双配置,为了不让 UEFI 来瞎捣乱,我在主板设置里会选择 BIOS Only 以堵死 UEFI 的路。至于 2009 年以前的那些不支持 UEFI 的主板,倒有些需要小心:虽然理论上,只要不是古董电脑,都能支持 GPT,但是有一小部分有问题的 BIOS 会无法从 GPT 启动。 GPT 的分区工具首选 gdisk,不要用太旧的版本,默认就能 4k 对齐。

三、GRUB + Linux

虽然受到软件无政府主义的困扰,但是 GRUB 依旧是一款功能强大且十分流行的引导器。本文所指的 GRUB 一律指 GRUB 版本 2,而不是曾经的 GRUB Legacy。 要想让 BIOS + GPT + GRUB 工作,你需要一个 EF02 分区。由于没有了 post-MBR gap,这个分区是给 GRUB 放置它的 core.img 的,不需要文件系统。事实上,把 core.img 放在一个单独的分区里比放在 post-MBR gap 里稳定、整洁多了。在 gdisk 里新建分区时将分区标识符改为 EF02 即可,大小的话,2 MiB 足够了。 创建完 EF02 分区之后,其他的分区正常创建即可,比如我这样:

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     EF02  BIOS boot partition
   2            6144        20977663   10.0 GiB    8300  Linux filesystem
   3        20977664       230692863   100.0 GiB   8300  Linux filesystem
   4       230692864       500117503   128.5 GiB   0700  Microsoft basic data

然后使用 grub-install 即可自动将 core.img 嵌入那个迷你小分区。 至于 Linux 的安装,无需多言。

四、+ Windows

如无特别说明,以下提到的 Windows 指 NT 内核 6.0 以上版本。本文以 Windows 8.1 为例。

傲娇的 Windows

MSDN 明确指出,Windows 只能安装于 BIOS + MBR 或是 UEFI + GPT 的组合上,而 BIOS + GPT 和 UEFI + MBR 是不允许的。这实在是太傲娇了——因为 BIOS + GPT + GRUB + Linux 是完全没有问题的。事实上,我的笔记本电脑刚安装的时候并没有考虑到往硬盘里灌 Windows,因此之前一直是 BIOS + GPT + GRUB 的配置,在这样的情况想让 Windows 入驻,简直是逼我上梁山…… 为什么 MSDN 声称 Windows 不能在 BIOS + GPT 工作?经过我的试验,发现其实只是 bootmgr 读不了 GPT 而已。直到 bootmgr 被唤醒之前,一切都是没有问题的,而 bootmgr 应该去读取 \Boot\BCD 然后再根据 BCD 去加载 \Windows\System32\winload.exentoskrnl.exe。可是 bootmgr 读不了 GPT,直接导致它找不到 \Boot\BCD…… 那么怎么办呢?

  • 换一个能读 GPT 的引导器,读取 BCD 之后正常加载 Windows 内核。——不好意思,这样的引导器不存在。在得出这个结论之前,我吃了很多苦。
  • 将 BCD 放在 bootmgr 能读的地方。——比如一(小)块 MBR 存储设备,它不一定要是物理的,也能是虚拟的。在得出这个结论之前,我流了很多泪。

而 Windows 默认的安装程序要求又高、功能又弱,根本不会给你选择启动文件安装到哪里的,所以必须要手工安装。

要 imagex 不要 Setup.exe

Windows 默认安装框架是在 Windows PE 里使用 Setup.exe。该程序会运行一系列烦人的检查并增加一堆不合理的限定,比如要求 .NET Framework,比如强制添加 300 MiB 的系统分区等。而实际上它所做的事情也不过是:解压 install.wim 到指定分区、写入引导扇区、写入 BCD 这三样。可是这三件事,能自定义的部分还很少或很麻烦,那为啥不自己来呢?所以我更喜欢的方法是启动到 Windows PE 之后手工安装。

Windows PE 哪里来?TechNet 提供的方法是从 WAIK 里生成。但前面说了,Windows 的安装框架是 Windows PE,而 Windows 安装镜像文件也不过就是 Windows PE 和 install.wim 的组合而已,所以直接从安装镜像里就可以释放一个 Windows PE 出来。用 wimlib 提供的 mkwinpeimg 可以很方便地做到这一点,能直接从 Windows 安装镜像中获取 Windows PE 所需的 boot.wim 并制成可启动的镜像文件。如果你懒得自己提取 Windows PE,那么这里有我做好的两份。两份 Windows PE 除了添加了一个 imagex.exe 之外没有任何改动,十分纯洁干净:(其实不添加也行,用更加高大上的 dism 也能释放文件)

install.wim 哪里来?Windows 安装镜像里就有,使用 7z e Windows.iso sources/install.wim 即可把它解压出来。在移动存储设备里保存 install.wim 而不是完整的 iso,甚至能省下 500 MiB 以上的空间。

接下来就是安装了。通过可启动媒体启动进 Windows PE,用 diskpart 进行合理的分区。以下为带注释的操作过程:

# 确认当前硬盘情况
DISKPART> list disk
# 假设系统硬盘为 Disk 0 (Windows 将安装于此)
# Windows PE 所在的盘为 Disk 1 (请忽略)
# 过会儿要创建的 VHD 为 Disk 2 (Windows 启动文件将安装于此)
DISKPART> select disk 0
DISKPART> list partition
DISKPART> select partition 4
DISKPART> format label="Windows 8.1" quick
DISKPART> assign letter=c
# 以上命令格式化要安装 Windows 的分区并分配卷标 C:
# 接下来创建并挂载 VHD
DISKPART> create vdisk file=c:\bootmgr.vhd maximum=32 type=fixed
DISKPART> attach vdisk
# 然后在 VHD 里创建并激活分区。offset 不是必须的,但是我喜欢
DISKPART> select disk 2
DISKPART> create partition primary offset=1024
DISKPART> active
DISKPART> format label=bootmgr quick
# 分配一个卷标 B:
DISKPART> assign letter=b
# 退出 diskpart
DISKPART> exit

然后就是安装 Windows 和 Windows 启动文件了:

# 解压文件,注意根据实际情况选择 index,此处为 1
X:\> imagex /apply install.wim 1 c:
# dism 的等效命令是:(长多了)
X:\> dism /Apply-Image /ImageFile:install.wim /Index:1 /ApplyDir:C:\
# 写入启动代码和启动文件
X:\> bootsect /nt60 b: /mbr
X:\> bcdboot c:\Windows /s b:

至此 Windows 部分就算完成了,可以在 diskpart 里 detach vdisk 然后重启进 Linux 继续操作。

用 MEMDISK 引导硬盘镜像

在上一节中,我们得到了一个装好了 Windows 的分区,以及一块 32 MiB 的虚拟硬盘镜像,这块虚拟硬盘采用 MBR,有且只有一个主分区,主分区里装着大约 19 MiB 的 Windows 启动文件。其实这些启动文件真正核心的只有不到 1 MiB,其他的都是语言包和字体等,如果你闲得无聊可以挂载来删除它们,当然硬盘镜像文件大小不会自动缩小就是了。

那么,MEMDISK 能直接引导 vhd 么?我一开始也觉得不能,因此查到了用 VirtualBox 或 QEMU 来把 vhd 转成 raw image 的方法:VBoxManage clonehd --type raw bootmgr.vhd bootmgr.img。但是后来经 @tjmao 的提醒,我才发现原来当 type=fixed 的时候,vhd 其实就是 raw image 加上 512 字节的 footer。切掉这个尾巴之后,得到的东西和 dd 式的 raw image 是一模一样的。而就算不切掉尾巴,这一部分也会被认为是未分区空间从而被忽略掉。所以,其实 type=fixed 的 vhd 是不用转换,直接可以当 raw image 用喂给 MEMDISK 的。

那么怎么喂呢?根据调用 MEMDISK 的方法不同,具体的语法也有一定差别,完整的叙述可在这里找到。以下是 GRUB 的方法:

menuentry "bootmgr.vhd" {
  linux16 /boot/syslinux/memdisk harddisk
  initrd16 /boot/bootmgr.vhd
}

把这一段复制到 /boot/grub/grub.cfg 中即可使用。如果要使它可在 grub-mkconfig 后自动生成的话,复制到 /etc/grub.d/40_custom 中即可。

至此 Windows 的引导就算是做好了。重启计算机在 GRUB 菜单中选择对应的 menuentry 即可进入。第一次进入的时候会自动安装驱动等,安装完自动重启,然后就功德圆满了。

五、一些可以改动的部分

如导言中所说,有和我完全一样的需求的人应该不存在,但是本文的思路可用于一些别的折腾过程中。以下列举了部分可以改动的部分,适用于不同的具体情况。

Linux 不是必须的

如果你只是想安装 BIOS + GPT 的 Windows,自然不用装 Linux。但是你可能需要备一个 Notepad.exe 在 Windows PE 环境中,用来编辑引导器的配置文件。

GRUB 可以换成别的

如果不装 Linux 了,那单独装个 GRUB 也没啥意思,还不如换点别的引导器。诸如 Syslinux, Grub4Dos 等,都可以用来加载 MEMDISK。具体的语法依然戳这里不过如果换成别的启动器的话,那个启动器得要像 GRUB 一样对 GPT 有支持……

VHD 的大小问题

在想到 VHD 的方法之前,我曾试过的是把装的引导分区的 U 盘整个 dd_rescue 复制下来。这是一个较老的 U 盘,容量只有 4 GB,但是就这样产生的镜像文件也太大了,无法被 MEMDISK 正确加载。虽然最后我成功地把这个镜像挂载之后缩小文件系统和分区使它「瘦身」,但步骤较复杂。想到 VHD 的方法之后就简单了,直接创建一个小一点的 VHD 然后在里面操作即可。现在已知镜像文件不能太大,否则 MEMDISK 加载不了,那么它最小能多小呢?

核心的 Windows 启动文件只有 bootmgrBoot\BCD 这两个,加起来不到 1 MiB。我也试过,引导分区里只放这两个文件,依然能正常引导,但是实际上 VHD 不能只有 1 MiB。这是因为:

  • bcdboot 复制启动文件的时候,默认会复制那些语言包和字体,总共 19 MiB 左右
  • NTFS 分区最小需要 8 MiB

我实验成功的最小大小是 10 MiB 的 VHD,里面装着一个 8 MiB 的 NTFS。

当代的计算机大部分都是 4 GB 和 8 GB 的内存了,所以不用克扣这么一点点空间(毕竟它引导完就被释放掉了),所以创建 VHD 时选择 32 MiB 是个比较好的选择。记得 type=fixed 就行。

六、吐槽和尾巴

好久没写有关 Windows 的博文了。本来以为自己的对 Windows 的需求在 VirtualBox 里就能完全满足了,因此笔记本电脑安装系统的时候并没有为 Windows 考虑过,直接就是 BIOS + GPT + Linux 的组合了。可是自从 2014 年初在迷上了 Call of Duty 之后就入了 Steam 的大坑了,因此对独立的 Windows OS 的需求再次浮现。之前尝试 BIOS + GPT + Linux 既有配置下再塞个 Windows 怎么都没成功,因此选择了 Windows To Go 的解决方案——将整个 Windows 及其引导文件装到外置 USB 硬盘里。可是 USB 机械硬盘的速度又怎么能和 Samsung 840 Pro SSD 相比……于是发愤图强,努力研究,终于实现了 Windows 本体安装在 GPT SSD 里而把引导文件装到 MBR U 盘里的方法。慢慢地这样的方法又不能满足我的要求了,于是继续发愤图强,在各种来源都说这是不可能的情况下,我最终还是曲线救国成功了。

于是便有了本文。

转载请注明出处: https://wzyboy.im/post/1049.html

Opera Mini 4.2 for Android 共存版制作教程

Android 的主屏幕上有两个不同的 Opera Mini 4.2 的图标

在 Android 里,同一程序的不同版本是不能共存的,安装了一个版本再安装另一个版本,则之前安装的那个版本会被覆盖或者被取代,这导致我们不能同时使用两个版本。然而,由于兲朝的某些设备,有时有必要安装两个版本。比如 Opera Mini 4.2 的国际版(中转服务器)和 Opera Mini 4.2 的中国版。有人会说:不是有 Opera Mini 5.x 吗?没错,那个版本的确能与 4.2 共存,但是它实在太烂了,所以能安装两个不同的 4.2 版本(不同点仅在服务器地址),一直是我的夙愿。经过一段时间的折腾,我成功了。本教程就将简要介绍制作方法。本文的环境以 Windows 为例,也适用于 Unix-like OS。本文关键字:多版本 Android 应用共存。

一、准备工具

  • JRE。可在 Java.com 上下载。已经安装过 JRE 或者 JDK 的用户可以跳过。
  • Notepad++。一款上手好用的文本编辑器是很重要的,不要用落后的 Windows 记事本了,它会把 Unix 换行符破坏的。当然如果是你是 Unix-like OS 用户,可以跳过此步。
  • android-apktool。这个工具是用来反编译 .apk 文件的。注意要下载两个压缩包,然后解压到同一目录里才能使用,详细使用方法见它的说明。另外,建议将此工具的路径添加到 PATH 变量里,以方便下面的使用,以下教程假设你已经把它添加到 PATH 里了,所以不再写完整路径。如果你不知道如何添加 PATH,则直接把 apktool 的几个文件复制到 %systemroot% 里好了。
  • Auto-Sign。这是一个签名工具。解压到某目录备用。
  • 原版的 Opera Mini 4.2 for Android。这东西在 Opera 官方网站等地方已经下载不到了,但是在 Opera 的合作伙伴 GetJar.com 上倒还是能找到,虽然页面上标注的版本是 5,但是下载下来其实是原版的 4.2……真有趣。(如果刚才那个地址失效了,请点击这里下载。)
  • 足够的耐心。

二、制作 Opera Mini 4.2 for Android 改服版(中转服务器)

这一部分的制作在这里也有教程,但是方法较繁琐且叙述不是很清楚,以下的教程更清楚一些。

  1. 反编译 apk 文件。把上面下载到 OperaMini.apk 放到顺手的工作路径下,比如 %userprofile%下面。并在 cmd 窗口里执行以下命令:
    Microsoft Windows [Version 6.1.7600]
    Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
    
    C:\Users\wzyboy>apktool d OperaMini.apk
    I: Baksmaling...
    I: Loading resource table...
    I: Decoding resources...
    I: Loading resource table from file: C:\Users\wzyboy\apktool\framework\1.apk
    I: Copying assets and libs...
    
    C:\Users\wzyboy>
  2. 修改服务器地址。执行完成后用 Notepad++ 打开新出现的 OperaMini\smali\Code.smali 文件,定位到第 41 行和第 47 行,这里可以看到两个服务器地址,前者是 socket 连接用的,后者是 http 连接用的。如果你知道某个支持 socket 的德意志服务器的地址的话,就把它们填写进去吧。更推荐的方法是用第三方的中转服务器,由于第三方的服务器只支持 http,所以需要把前者的地址“破坏”掉,比如改成 fuck://gfw.tld/ 这样的。而后者则改成完成的第三方中转服务器地址。网上有很多公开的中转服务器的地址,搜索一下便可抓到一些,如果要自己搭建的话,教程见这里。
  3. 重新打包。在 cmd 窗口里执行以下命令即可:
    C:\Users\wzyboy>apktool b OperaMini
    I: Checking whether sources has changed...
    I: Smaling...
    I: Checking whether resources has changed...
    I: Building resources...
    I: Building apk file...
  4. 重新签名。把 OperaMini\disk\OperaMini.apk 复制到 Auto-Sign 的目录下面,把扩展名改为 zip ,然后双击 sign.bat,按提示按下两次任意键,如果一切正常的话,应该是这样的:
    Auto-Sign Created by Dave Da illest 1
    Edited to be easier to use with APK files by mixpix405
    
    Make sure the APK you want signed is the only APK inside this folder
    Press any key to continue . . .
    
    .apk is now being signed. The signed version be named your_app_signed.apk
    
    If no errors, signing complete. If you DO see errors, good luck figuring it out, as I will be absolu
    tely no help :)
    
    Press any key to continue . . .
  5. 现在可以把这个文件传输到安装了。

三、制作 Opera Mini 4.2 for Android 中国版(共存版)

Opera Mini 国际版的好处大家都心知肚明,但国服版也有优势——浏览国内网站的速度非常快。我经常在手机淘宝上买东西,如果用国际版服务器访问手机淘宝的话,那个速度真是令人抓狂。但是,由于两个版本的 Package 名称是相同的,所以无法同时安装,安装了一个另一个就被卸载了,所以,要对这个版本做一些小小的手术。我搜索了一下,中文和英文的 Android 网站里,完全没有多版本 Android 应用程序共存的解决方案(不知道别的语言有没有),不过,在这位仁兄的指导下,我终于折腾出来了。这应该是第一篇公开的多版本 Android 应用共存的教程吧……?下面说步骤:

第一部分

  1. 反编译。方法见上文。
  2. 修改服务器地址。这回应该修改成中国版的服务器地址,当然是有 socket 连接的(真棒):
    socket://59.151.106.229:1080
    http://59.151.106.229:80/
  3. 获取 Server key。一开始我没有做这一步,结果失败了很多次,悔死了。Server key 是一串 320 个字符长度的数字与字母组合。不同的服务器不同的 Opera Mini 版本的 Server key 是不同的,对于 4.2 版本来说,主要是两组,一组是兲朝服务器,一组是国际版服务器,由于国际版服务器的 Server key 是通用的,所以之前把国际版改成中转的国际版的过程不需要修改 Server key,而把国际版改成中国版则要修改的。Server key 可以从官方的中国版里提取,我已经提取出来了。由于 Server key 太长,为了不撑破 Opera Mini 用户的页面,我把它单独放到一个文本文件里了,请点击此处打开这个文本文件。把文件里中国版的 Server key 复制下来备用。
  4. 修改 Server key。一开始我并不知道 Server key 在哪里改,于是花了很大的精力在那 400 多个 .smali.xml 文件里找,找的过程是□□□□□□□□□□□□□□□□□□□□□(此处删去 1024 字),最后终于发现它在 OperaMini\smali\ad.smali 文件里。用 Notepad++ 打开这个一共有 5987 行的文件,定位到第 192 行,看到那个长长的字符串了吧?用刚才获取的 Server key 替换它吧。
  5. 修改 AndroidManifest.xml 及其它。这一步是使两个版本共存的关键,也是比较麻烦的一步。为了搞定它,我□□□□□□□□□□□□□□□□□□□□□(此处删去 1024 字),最后终于成功了。下面详解:

第二部分

  1. 用 Notepad++ 打开 OperaMini\AndroidManifest.xml ,内容如下:
    <?xml version=”1.0″ encoding=”UTF-8″?>
    <manifest android:versionCode=“6” android:versionName=“4.2” package=“org.microemu.android.Browser”
    xmlns:android=“http://schemas.android.com/apk/res/android”>
    <uses-permission android:name=“android.permission.INTERNET” />
    <uses-sdk android:minSdkVersion=“1” />
    <application android:label=“@string/app_name” android:icon=“@drawable/app_icon”>
    <activity android:name=“org.microemu.android.MicroEmulator” android:configChanges=“keyboardHidden|orientation”>
    <intent-filter>
    <action android:name=“android.intent.action.MAIN” />
    <category android:name=“android.intent.category.LAUNCHER” />
    </intent-filter>
    </activity>
    </application>
    </manifest>
  2. 注意底色为黄色的那一部分,那就是 Opera Mini 4.2 for Android 的 Package name,正是由于两个版本的 Package name 是相同的,所以无法共存(同时安装),我们需要把它改掉,比如改成 org.microemu.android.Browser 。但是这里先不要改,待会儿再改。
  3. 当然,只改这个 Package name 是不行的,事实证明,只改动它,最后编译出来的 .apk 文件虽然可以正常安装,但是是无法运行的,一运行就直接 FC。所以还要改动一些东西,经过我□□□□□□□□□□□(此处删去 512 字)的折腾,最终发现需要改动的东西如下:

第三部分

  1. 打开 Notepad++,按 Ctrl+Shift+F 打开 Find in Files 对话框,在 Find what 里填写 Browser,在 Replace with 里填写 cnBrowser,在 Filter 里填写 *.smali; *.xml ,把 Directory 设为 Opera Mini 反编译后的文件所在的目录,然后点击 Replace in Files 按钮,等待几秒钟,替换完成,关闭之。
  2. 还有两个地方要修改。一个是 OperaMini\smali\Browser.smali ,把它的文件名改成 cnBrowser.smali。另一个是 OperaMini\smali\org\microemu\android\Browser ,这是一个目录,把它的名字也改成 cnBrowser

第四部分

  1. 重新打包。方法见上文。
  2. 重新签名。方法见上文。
  3. 传输到手机里安装吧!

美化

  • 安装好之后的效果就像本文的题图那样,有两个 Opera Mini 4.2 的图标,怎样区分呢?一个比较好的方法是改图标。在完成上文第三部分的操作之后,可以修改 OperaMini\res\drawable\app_icon.png 文件,比如加一个“Chinternet”标志之类的。我则是直接把它改成了灰度图(喜欢就右击保存吧):opera-mini-4-greyed-icon

四、写给懒人

好吧好吧,肯定有人认为上面的步骤太繁琐了……于是,我添加了这一节,提供已经修改好的 Opera Mini 4.2 for Android 中国服务器共存版下载

五、其它

  • 正如之前所说,本文修改 Opera Mini 4.2 的方法也可以活用于其它的程序,使程序的不同版本能够共存于 Android 之中,希望能够帮到未来的读者。
  • 我还有5个月就高考了,压力很大,博客更新得越来越低频了。不过自我感觉文章质量并没有下降。这篇文章我花了不少心思写的,如果你看完觉得它还不错的话,可以点击此处添加点评论什么的……Google Reader 用户可以按一下键盘上的 l 键表示你喜欢这篇文章 ^_^ 。没有订阅本博客的用户可以点此订阅
  • 小小的广告:个性化多功能 U 盘,内详。
  • 转载本文请注明出处:http://wzyboy.im/post/635.html,谢谢合作。
  • 没了。

六、补充

这个补充是来自本文发表半年后的了……有人做了一个 6.0 版的共存版的教程,见此

我终于把 UA 问题折腾好了

我以前一直以为只要走中国移动的网关,UA 就会被抹掉。事实上前一段时间的确是这样的,导致 Opera Mini 等网站无法正常检测手机型号,Google 的软件根本无法下载:直接用一句不支持你的手机把我挡在门外…通过 Opera Mini 国际可以正确传递 UA,但是下载的时候还是要用自带浏览器,还是通不过检测…所以我只能去第三方网站下载通用版。唉,所以我现在Opera Mini 的图标很丑(小,白底,畸形),Gmail 客户端卡到令人难以忍受(我放弃了)。

今天,一切终于有了改观:我无意中看到一句话“使用cmwap接入点时中国移动会去除头信息”。我突然想到了什么…事情是这样的(回忆开始):“很久很久很久”以前,我刚刚买手机,这时手机里都是 cmwap 接入点,当时我对手机的探索也有限。

后来,也就是“很久很久”以前,我向10086索要了 cmnet 接入点,并且全面替换 cmwap (除了彩信等必须用 cmwap 的)。那时候天是蓝的,水是清的,下载到的 Opera Mini 图标是美丽的…

再后来,也就是“很久”以前,我同学向我借手机上网,用的自带浏览器,发现上不去 QQ 空间。原来是当时 QQ 空间还不支持 cmnet 接入点,于是从此以后,我的自带浏览器和彩信是 cmwap ,其他程序全部都是 cmnet。

悲剧从此开始,我下载软件就再也没有正常过,UA 总是不正常…

今天看到了那句话…原来如此啊!我把自带浏览器的接入点改为 cmnet…打开 operamini.com …没有出现“无法检测手机型号”的提示…由于前一段时间被墙,国际版的下载地址似乎被移除了,那下个中国版试下吧…哇…完美图标…阔别这么久的官方完美图标版又见到了…我泪流满面。

接下来转战Google.com…嗯…Gmail下载…哇,我又惊叹了,Gmail 和 Orkut 都通过 UA 检测了!下载!运行!不卡!我再次泪流满面…

我是不折腾会死星人…我终于折腾出来了…通用版总是有各种各样的问题,门当户对才是最佳!