1.发现、分析问题
1.1 发现master版本的nexus-5代码有问题:
当我在拿到一台nexus-5设备时,翻阅B2G官方文档发现B2G OS对nexus-5有支持,于是希望能够获取此设备的源码加以研究。
经过我写的博客(FireFox OS(B2G)源码获取与Build code ) 的一番步骤之后。发现我下载的master版本的nexus-5代码,虽然可以编译通过,但给nexus-5刷机后发现手机根本启动不起来(Nexus-5刷机后的界面无app图标且黑屏的问题分析)。
又经历了一番分析后,觉得是master版本的问题,因为最终在官方文档的某个角落里看到了一个提示“不建议刷mater版本!”的提示!
1.2 发现v2.0—v2.5下载中断问题
分析了B2G文件加中的config.sh,发现这个通过这个脚本中BRANCH变量的修改可以修改所下载的系统版本(这和Android是不同的,是Mozilla公司自己增加了几个脚本文件,来实现和Android不同的下载、编译方式,其实研究下去终究还是Android的那个套build机制)。
#!/bin/bash
REPO=${REPO:-./repo}
sync_flags=""
repo_sync() {
rm -rf .repo/manifest* &&
$REPO init -u $GITREPO -b $BRANCH -m $1.xml $REPO_INIT_FLAGS &&
$REPO sync $sync_flags $REPO_SYNC_FLAGS
ret=$?
if [ "$GITREPO" = "$GIT_TEMP_REPO" ]; then
rm -rf $GIT_TEMP_REPO
fi
if [ $ret -ne 0 ]; then
echo Repo sync failed
exit -1
fi
}
case `uname` in
"Darwin")
# Should also work on other BSDs
CORE_COUNT=`sysctl -n hw.ncpu`
;;
"Linux")
CORE_COUNT=`grep processor /proc/cpuinfo | wc -l`
;;
*)
echo Unsupported platform: `uname`
exit -1
esac
GITREPO=${GITREPO:-"git://github.com/mozilla-b2g/b2g-manifest"}
BRANCH=${BRANCH:-v2.6}
while [ $# -ge 1 ]; do
case $1 in
-d|-l|-f|-n|-c|-q|--force-sync|-j*)
sync_flags="$sync_flags $1"
if [ $1 = "-j" ]; then
shift
sync_flags+=" $1"
fi
shift
;;
--help|-h)
# The main case statement will give a usage message.
break
;;
-*)
echo "$0: unrecognized option $1" >&2
exit 1
;;
*)
break
;;
esac
done
GIT_TEMP_REPO="tmp_manifest_repo"
if [ -n "$2" ]; then
GITREPO=$GIT_TEMP_REPO
rm -rf $GITREPO &&
git init $GITREPO &&
cp $2 $GITREPO/$1.xml &&
cd $GITREPO &&
git add $1.xml &&
git commit -m "manifest" &&
git branch -m $BRANCH &&
cd ..
fi
echo MAKE_FLAGS=-j$((CORE_COUNT + 2)) > .tmp-config
echo GECKO_OBJDIR=$PWD/objdir-gecko >> .tmp-config
echo DEVICE_NAME=$1 >> .tmp-config
case "$1" in
"galaxy-s2")
echo DEVICE=galaxys2 >> .tmp-config &&
repo_sync $1
;;
"galaxy-nexus")
echo DEVICE=maguro >> .tmp-config &&
repo_sync $1
;;
"nexus-4")
echo DEVICE=mako >> .tmp-config &&
repo_sync nexus-4
;;
"nexus-4-kk")
echo DEVICE=mako >> .tmp-config &&
repo_sync nexus-4-kk
;;
"nexus-5")
echo DEVICE=hammerhead >> .tmp-config &&
repo_sync nexus-5
;;
"nexus-5-l")
echo DEVICE=hammerhead >> .tmp-config &&
repo_sync nexus-5-l
;;
"nexus-6-l")
echo DEVICE=shamu >> .tmp-config &&
echo PRODUCT_NAME=aosp_shamu >> .tmp-config &&
repo_sync nexus-6-l
;;
"nexusplayer-l")
echo DEVICE=fugu >> .tmp-config &&
echo PRODUCT_NAME=aosp_fugu >> .tmp-config &&
repo_sync nexusplayer-l
;;
"nexus-s")
echo DEVICE=crespo >> .tmp-config &&
repo_sync $1
;;
"nexus-s-4g")
echo DEVICE=crespo4g >> .tmp-config &&
repo_sync $1
;;
"otoro"|"unagi"|"keon"|"inari"|"hamachi"|"peak"|"helix"|"wasabi"|"flatfish")
echo DEVICE=$1 >> .tmp-config &&
repo_sync $1
;;
"flame"|"flame-kk"|"flame-l")
echo PRODUCT_NAME=flame >> .tmp-config &&
repo_sync $1
;;
"tarako")
echo DEVICE=sp6821a_gonk >> .tmp-config &&
echo PRODUCT_NAME=sp6821a_gonk >> .tmp-config &&
repo_sync $1
;;
"dolphin")
echo DEVICE=scx15_sp7715ga >> .tmp-config &&
echo PRODUCT_NAME=scx15_sp7715gaplus >> .tmp-config &&
repo_sync $1
;;
"dolphin-512")
echo DEVICE=scx15_sp7715ea >> .tmp-config &&
echo PRODUCT_NAME=scx15_sp7715eaplus >> .tmp-config &&
repo_sync $1
;;
"pandaboard")
echo DEVICE=panda >> .tmp-config &&
repo_sync $1
;;
"vixen")
echo DEVICE=vixen >> .tmp-config &&
echo PRODUCT_NAME=vixen >> .tmp-config &&
repo_sync $1
;;
"emulator"|"emulator-jb"|"emulator-kk"|"emulator-l")
echo DEVICE=generic >> .tmp-config &&
echo LUNCH=full-eng >> .tmp-config &&
repo_sync $1
;;
"emulator-x86"|"emulator-x86-jb"|"emulator-x86-kk"|"emulator-x86-l")
echo DEVICE=generic_x86 >> .tmp-config &&
echo LUNCH=full_x86-eng >> .tmp-config &&
repo_sync $1
;;
"flo")
echo DEVICE=flo >> .tmp-config &&
repo_sync $1
;;
"rpi")
echo PRODUCT_NAME=rpi >> .tmp-config &&
repo_sync $1
;;
"rpi2b-l")
echo PRODUCT_NAME=rpi2b >> .tmp-config &&
repo_sync $1
;;
"leo-kk")
echo PRODUCT_NAME=leo >> .tmp-config &&
repo_sync $1
;;
# We need aries-l with repo_sync $1 for using manifest symlink for releng stuff
"aries"|"aries-l")
echo PRODUCT_NAME=aries >> .tmp-config &&
repo_sync $1
;;
"fairphone2")
echo PRODUCT_NAME=FP2 >> .tmp-config &&
repo_sync $1
;;
"openc-fr")
echo DEVICE=zte_p821a10 >> .tmp-config &&
echo PRODUCT_NAME=zte_openc_fr >> .tmp-config &&
repo_sync $1
;;
"openc-ebay")
echo DEVICE=zte_p821a10 >> .tmp-config &&
echo PRODUCT_NAME=zte_openc_eu >> .tmp-config &&
repo_sync $1
;;
"leo-l"|"scorpion-l"|"sirius-l"|"castor-l"|"castor_windy-l"|"honami-l"|"amami-l"|"tianchi-l"|"flamingo-l"|"eagle-l"|"seagull-l")
echo PRODUCT_NAME=$1 | sed 's/..$//' >> .tmp-config &&
repo_sync sony-aosp-l
;;
"project-tablet")
echo PRODUCT_NAME=castor_windy >> .tmp-config &&
repo_sync project-tablet
;;
"project-tablet-lte")
echo PRODUCT_NAME=castor >> .tmp-config &&
repo_sync project-tablet
;;
*)
echo "Usage: $0 [-cdflnq] [-j <jobs>] [--force-sync] (device name)"
echo "Flags are passed through to |./repo sync|."
echo
echo Valid devices to configure are:
echo - galaxy-s2
echo - galaxy-nexus
echo - nexus-4
echo - nexus-4-kk
echo - nexus-5
echo - nexus-5-l
echo - nexus-6-l
echo - nexusplayer-l
echo - nexus-s
echo - nexus-s-4g
echo - flo "(Nexus 7 2013)"
echo - otoro
echo - unagi
echo - inari
echo - keon
echo - peak
echo - hamachi
echo - helix
echo - tarako
echo - dolphin
echo - dolphin-512
echo - pandaboard
echo - vixen
echo - fairphone2
echo - flatfish
echo - flame
echo - flame-kk
echo - flame-l
echo - openc-fr
echo - openc-ebay
echo - "> Raspberry Pi boards"
echo - rpi "(Revision B)"
echo - rpi2b-l
echo - emulator
echo - emulator-jb
echo - emulator-kk
echo - emulator-l
echo - emulator-x86
echo - emulator-x86-jb
echo - emulator-x86-kk
echo - emulator-x86-l
echo "> Sony Xperia devices"
echo - aries "(Z3 Compact KK)"
echo - aries-l "(Z3 Compact L)"
echo - leo-kk "(Z3 KK)"
echo - leo-l "(Z3 L)"
echo - scorpion-l "(Z3 Tablet Compact L)"
echo - sirius-l "(Z2 L)"
echo - castor-l "(Z2 L Tablet LTE/WiFi)"
echo - castor_windy-l "(Z2 L Tablet WiFi only)"
echo - honami-l "(Z1 L)"
echo - amami-l "(Z1 Compact L)"
echo - tianchi-l "(T2U L)"
echo - flamingo-l "(E3 L)"
echo - eagle-l "(M2 L)"
echo - seagull-l "(T3 L)"
exit -1
;;
esac
if [ $? -ne 0 ]; then
echo Configuration failed
exit -1
fi
mv .tmp-config .config
echo Run \|./build.sh\| to start building
所以,开始修改脚本中的BRANCH值为v2.5,准备下载v2.5版本的nexus-5系统。
在下载v2.5版本时发现git在 fetch gaia和gecko时会提示在某个网址上下载不到gaia.git和gecko.git,这个网址的名字我忘了,但是它是Mozilla公司的一个开发者论坛类似的网站(我翻墙尝试网页打开这个网址提示404)。
其实,我还尝试下载了v2.0版本,依然会提示下载不到gaia和gecko,所以断定v2.0—v2.5版本的系统都是会出问题的!!下载不到gaia和Gecko还怎么玩?
1.3分析v2.0—v2.5下载中断问题
我猜测是因为由于B2G系统于2016年左右停止维护了,所以这个网站的这部分可能没人管理了。为了印证我得猜测特地去查看了v2.5的https://github.com/mozilla-b2g/b2g-manifest/tree/v2.5,发现nexus-5.xml注释是:
在查看v2.6的https://github.com/mozilla-b2g/b2g-manifest/tree/v2.6,发现nexus-5.xml注释是:change gaia/gecko repo to github; 也就是说v2.5之前的版本它们的gaia和gecko代码不是保存在github上,而是在开发中社区,社区这部分停止维护后出了问题,现在下载v2.5以前的版本就会出现找不到gaia和gecko的问题。
于是,我就断定v2.6是支持是nexus-5的唯一能够下载的可运行版本了,于是配置好config.sh后开始了漫长的下载过程,期间出现几kb的下载速度,而且中间可能会因为网速太慢而中断,只要坚持./repo sync重新下载最终就能够下完这套系统!!
我在下载v2.6版本nexus-5系统时整整花了5天时间!!
最后下载完毕后,编译顺利通过,刷入nexus-5后,果然可以完美运行。如图:
2.总结
遇到问题,正确的分析很重要,即便分析的正确,但处理这个问题却花了一周时间。