2011-10-31

【原创】在VirtualBox环境下编译Cyanogenmod for HTC Tattoo的rom

手头上的htc tattoo(g4)充电慢、耗电量也特别大,通话20分钟就自动关机,但检测电池是满电。
初步检测怀疑是手机主板电源模块问题,跟换电源模块问题依旧,怀疑是CPU问题。
没有零配件,没办法维修,只能自己想办法解决。

初步想法如下:
  1. 手机检测电量存在问题,电池满电但显示不正确。
  2. 能否更改操作系统,让电量一直处于100%状态?即:屏蔽手机电量检测,避免自动关机。(以后只能靠经验估算电量了)。
  3. 先从Cyanogenmod下手,先能编译成正常可刷机的rom,然后再修改源代码编译成屏蔽手机电量检测的rom。
  4. 由于没有linux真机环境,只能采用VirtualBox安装的debian 6虚拟机环境编译Cyanogenmod 7。

过程记录:
  1. 使用git下载Cyanogenmod内核源代码
    1. sudo apt-get install git git-all git-core
    2. sudo apt-get install gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.6-dev squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev sun-java6-jdk pngcrush schedtool
    3. 下载repo脚本(python编写,封装了git的用法),curl http://android.git.kernel.org/repo > repo
    4. repo可能下载不了,建议用迅雷找源。下载后执行,会提示repo版本需要升级,再升级之。邮件附件也有。
    5. 下载后放在/bin下方便调用,sudo mv repo /bin,chmod a+x /bin/repo
    6. 主目录建立cyanogenmod目录,用于放置cyanogenmod所有源代码。mkdir ~/cyanogenmod,cd ~/cyanogenmod
    7. 初始化git本地仓库。
      repo init -u https://android.googlesource.com/platform/manifest
      repo init -u git://github.com/CyanogenMod/android.git -b gingerbread
    8. 下载源代码。repo sync -j32,其中-j是并发job线程,加快下载速度。下载超级耗时,慢慢等……
    9. 完毕!
  2. 安装android sdk for linux
    1. http://developer.android.com /sdk/index.html下载linux版本的 android-sdk_r14-linux.tgz。用tar zxvf 解包。
    2. 配置添加/home/bbn/android-sdk-linux/platform-tools到PATH中,建议放在 /etc/profile,以后root也能访问到adb之类的命令。
    3. 多次执行:tools/android update sdk --no-ui,下载所有版本的android sdk。下载超 级耗时,慢慢等……
    4. 在windows中安装google-usb_driver,使得VirtualBox能访问到android手机
    5. 在debian配置usb驱动,如未配置,不管普通用户还是root用户都会出现以下问题:
      1. 执行adb devices,报:????????????    no permissions的错误
      2. 执行adb shell,报:error: insufficient permissions for device的错 误。
    6. 解决debian下usb驱动,使adb能正常工作的步骤如下:
      1. 在VirtualBox中USB设备中,勾选android手机。可能会需要重新安装windows的google- usb_driver驱动。

      2. 配置udev,在/etc/udev/rules.d目录下增加50-android.rules文件,并赋予/etc /udev/rules.d目录下所有文件a+rx权限,内容如下:
        SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"
        SUBSYSTEM=="usb_device", SYSFS{idVendor}=="0bb4", MODE="0666"
        其中,具体idVendor值可通过lsusb命令获取USB ID,进而可手动编辑50-android.rules文件。

        另:
        1. 不同厂家的USB ID都不一样。如某个USB设备的USB ID为XXXX,则在50-android.rules文件添加:SUBSYSTEM=="usb", SYSFS{idVendor}=="XXXX", MODE="0666"
        2. 如系统启动时出现:udevd : SYSFS{}= will be removed in a future udev version, please use ATTR instead.的警告,则将SYSFS{idVendor}=="XXXX"改为:ATTR{idVendor}=="XXXX"
        3. 如想一劳永逸的方法,只需要在50-android.rules文件保留一句 话:SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"即可。
      3. 重启udev服务,使配置生效。sudo /etc/init.d/udev restart
      4. 以root用户启动adb server(必须是root,普通用户会报错):adb kill-server,adb start-server
    7. 以普通用户执行adb devices,或是adb shell,即可尽情进入手机android系统中。

    8. 完毕!
  3. 编译cyanogenmod源代码,生成rom。
    1. 连接手机,确保普通用户能正常执行adb命令
    2. 提取手机上的私有配置文件。为了能正常pull所有文件,建议先root手机。
      刷HTC官方1.6版本ROM,会缺少/system/etc/firmware/目录下的brf6300.bin和 brf6350.bin文件。这两个文件从cyanogenmod下载cm_click_full-xxx.zip的rom里面、 /system/etc/firmware目录里面提取,用adb push进去。
      cd ~/cyanogenmod/device/htc/click
      ./extract-files.sh

    3. http://download.clockworkmod.com /recoveries/RomManager.apk下 载RomManager.apk
      cd ~/cyanogenmod/vendor/cyanogen
      ./get-rommanager
    4. 提取手机上的google应用相关文件
      cd ~/cyanogenmod/vendor/cyanogen
      ./extract-google-files
    5. 提取gapps上的相关文件
      cd ~/cyanogenmod/vendor/cyanogen
      访问http://goo- inside.me/gapps/latest,获取最新的gapps。wget -O gapps-gb-20110828-signed.zip http://goo-inside.me/gapps/latest/7
      ./extract-gapps-files gapps-gb-20110828-signed.zip
    6. 生成编译配置脚本
      cd ~/cyanogenmod
      cp ./vendor/cyanogen/products/cyanogen_click.mk ./buildspec.mk,复制编译脚本文件到cyanogenmod目录下,后面编译整个系统用的就是这个文件
    7. 编译环境变量准备
      cd ~/cyanogenmod
      . build/envsetup.sh
      编译adb,如果安装了android sdk则无需使用,否则执行:make -j3 adb(-j是并发job线程),在out/host/linux-x86/obj/EXECUTABLES/adb_intermediates目录下 生成adb文件,将其添加到PATH变量中。
    8. 选择需要编译的产品的脚本
      cd ~/cyanogenmod
      sed -n -e "s/^add_lunch_combo//gp" vendor/*/vendorsetup.sh
      lunch cyanogen_click-eng
    9. 开始编译源代码方法有两种:
      1. 直接编译生成update.zip
        make -j`grep 'processor' /proc/cpuinfo | wc -l` CYANOGEN_WITH_GOOGLE=true otapackage
        如果想提高编译速度,则直接设置-j参数:make -j4 CYANOGEN_WITH_GOOGLE=true otapackage,默认经验值为CPU个数
        执行完毕之后会在~/cyanogenmod/out/target/product/click下生成一个 cyanogen_click-ota-eng.bbn.zip。编译很耗时,慢慢等……
      2. 编译生成Individual.img
        make -j`grep 'processor' /proc/cpuinfo | wc -l` CYANOGEN_WITH_GOOGLE=true
        刷.img文件可以在fastboot模式下进行
        cd ~/cyanogenmod/out/target/product/click
        fastboot flashall
    10. 完毕!
  4. 其他:
    1. debian可能通过apt-get安装了多个jdk,比如:openjdk和sunjdk。
      通过sudo update-alternatives --config java进行更改,方便android编译apk包。
  5. 修改cm源代码
    1. cd ~/cyanogenmod
      vi ./frameworks/base/services/jni/com_android_server_BatteryService.cpp
      修改:setPercentageField(env, obj, gPaths.batteryCapacityPath, gFieldIds.mBatteryLevel);
      为:env->SetIntField(obj, gFieldIds.mBatteryLevel, 100);
      原理:硬件问题导致返回的电量偏小,以上改动让android操作系统强制返回100%,欺骗上层应用。
    2. 重新编译
      cd ~/cyanogenmod
      . build/envsetup.sh
      lunch cyanogen_click-eng
      make -j`grep 'processor' /proc/cpuinfo | wc -l` CYANOGEN_WITH_GOOGLE=true otapackage
      第一次编译很耗时,之后修改后会采用增量编译,很快
    3. 刷机,重启。激动人心的时候到了。
      由于手机开机连着USB线,亮绿灯(不再是未充满的红灯),进入系统检查电量,完美的100%。






没有评论: