初步检测怀疑是手机主板电源模块问题,跟换电源模块问题依旧,怀疑是CPU问题。
没有零配件,没办法维修,只能自己想办法解决。
初步想法如下:
- 手机检测电量存在问题,电池满电但显示不正确。
- 能否更改操作系统,让电量一直处于100%状态?即:屏蔽手机电量检测,避免自动关机。(以后只能靠经验估算电量了)。
- 先从Cyanogenmod下手,先能编译成正常可刷机的rom,然后再修改源代码编译成屏蔽手机电量检测的rom。
- 由于没有linux真机环境,只能采用VirtualBox安装的debian 6虚拟机环境编译Cyanogenmod 7。
过程记录:
- 使用git下载Cyanogenmod内核源代码
- sudo apt-get install git git-all git-core
- 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
- 下载repo脚本(python编写,封装了git的用法),curl http://android.git.kernel.org/repo > repo
- repo可能下载不了,建议用迅雷找源。下载后执行,会提示repo版本需要升级,再升级之。邮件附件也有。
- 下载后放在/bin下方便调用,sudo mv repo /bin,chmod a+x /bin/repo
- 主目录建立cyanogenmod目录,用于放置cyanogenmod所有源代码。mkdir ~/cyanogenmod,cd ~/cyanogenmod
- 初始化git本地仓库。
repo init -u https://android.googlesource.com/platform/manifest
repo init -u git://github.com/CyanogenMod/android.git -b gingerbread - 下载源代码。repo sync -j32,其中-j是并发job线程,加快下载速度。下载超级耗时,慢慢等……
- 完毕!
- 安装android sdk for linux
- 到http://developer.android.com /sdk/index.html下载linux版本的 android-sdk_r14-linux.tgz。用tar zxvf 解包。
- 配置添加/home/bbn/android-sdk-linux/platform-tools到PATH中,建议放在 /etc/profile,以后root也能访问到adb之类的命令。
- 多次执行:tools/android update sdk --no-ui,下载所有版本的android sdk。下载超 级耗时,慢慢等……
- 在windows中安装google-usb_driver,使得VirtualBox能访问到android手机
- 在debian配置usb驱动,如未配置,不管普通用户还是root用户都会出现以下问题:
- 执行adb devices,报:???????????? no permissions的错误
- 执行adb shell,报:error: insufficient permissions for device的错 误。
- 解决debian下usb驱动,使adb能正常工作的步骤如下:
- 在VirtualBox中USB设备中,勾选android手机。可能会需要重新安装windows的google- usb_driver驱动。
- 配置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文件。
另:
- 不同厂家的USB ID都不一样。如某个USB设备的USB ID为XXXX,则在50-android.rules文件添加:SUBSYSTEM=="usb", SYSFS{idVendor}=="XXXX", MODE="0666"
- 如系统启动时出现:udevd : SYSFS{}= will be removed in a future udev version, please use ATTR instead.的警告,则将SYSFS{idVendor}=="XXXX"改为:ATTR{idVendor}=="XXXX"
- 如想一劳永逸的方法,只需要在50-android.rules文件保留一句 话:SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"即可。
- 重启udev服务,使配置生效。sudo /etc/init.d/udev restart
- 以root用户启动adb server(必须是root,普通用户会报错):adb kill-server,adb start-server
- 以普通用户执行adb devices,或是adb shell,即可尽情进入手机android系统中。
- 完毕!
- 编译cyanogenmod源代码,生成rom。
- 连接手机,确保普通用户能正常执行adb命令
- 提取手机上的私有配置文件。为了能正常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
- 从http://download.clockworkmod.com /recoveries/RomManager.apk下 载RomManager.apk
cd ~/cyanogenmod/vendor/cyanogen
./get-rommanager - 提取手机上的google应用相关文件
cd ~/cyanogenmod/vendor/cyanogen
./extract-google-files - 提取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 - 生成编译配置脚本
cd ~/cyanogenmod
cp ./vendor/cyanogen/products/cyanogen_click.mk ./buildspec.mk,复制编译脚本文件到cyanogenmod目录下,后面编译整个系统用的就是这个文件 - 编译环境变量准备
cd ~/cyanogenmod
. build/envsetup.sh
编译adb,如果安装了android sdk则无需使用,否则执行:make -j3 adb(-j是并发job线程),在out/host/linux-x86/obj/EXECUTABLES/adb_intermediates目录下 生成adb文件,将其添加到PATH变量中。 - 选择需要编译的产品的脚本
cd ~/cyanogenmod
sed -n -e "s/^add_lunch_combo//gp" vendor/*/vendorsetup.sh
lunch cyanogen_click-eng - 开始编译源代码方法有两种:
- 直接编译生成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。编译很耗时,慢慢等…… - 编译生成Individual.img
make -j`grep 'processor' /proc/cpuinfo | wc -l` CYANOGEN_WITH_GOOGLE=true
刷.img文件可以在fastboot模式下进行
cd ~/cyanogenmod/out/target/product/click
fastboot flashall - 完毕!
- 其他:
- debian可能通过apt-get安装了多个jdk,比如:openjdk和sunjdk。
通过sudo update-alternatives --config java进行更改,方便android编译apk包。 - 修改cm源代码
- 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%,欺骗上层应用。 - 重新编译
cd ~/cyanogenmod
. build/envsetup.sh
lunch cyanogen_click-eng
make -j`grep 'processor' /proc/cpuinfo | wc -l` CYANOGEN_WITH_GOOGLE=true otapackage
第一次编译很耗时,之后修改后会采用增量编译,很快 - 刷机,重启。激动人心的时候到了。
由于手机开机连着USB线,亮绿灯(不再是未充满的红灯),进入系统检查电量,完美的100%。