-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfirefox-porting.txt
321 lines (258 loc) · 15.9 KB
/
firefox-porting.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
===CyanogenMod porting===
一个AOSP的分支,进行了大量的代码裁剪修改,以此去支持更多的类安卓设备。
可移植运行库(NSPR)
===porting basics(基于Android手机的移植)===
b2g中使用了大量的安卓的驱动程序,在这之上我们会加上一个gecko的引擎和在其之上的用web开发的用户界面。
【1】配置我们编译系统
GNU/linux系统环境下,除去我们在第三章的开发环境准备之外,还需要对即将到来的b2g准备更多的工具和插件,linux系统的要求必须是64位的,根据官方的开发文档,在Ubuntu14.04LTS版本上,我们需要的操作如下:
sudo dpkg --add-architecture amd64
获取64位的架构包
sudo apt-get install autoconf2.13 bison bzip2 ccache curl flex gawk gcc g++ g++-multilib git ia32-libs lib32ncurses5-dev lib32z1-dev libasound-dev libgconf2-dev libgl1-mesa-dev libx11-dev lzop make zip libxml2-utils nodejs unzip python
上面这个命令包含了大多数我们需要的工具,其中gcc/g++,python,git这些本为系统自带不安装也可,不过可以再确认一次之前是否安装成功。
【2】下载源码
火狐代码部分:
可以选择使用http或ssh的方式获取代码,推荐当然是ssh,连接稳定且安全。
git clone https://github.com/mozilla-b2g/B2G.git
git clone [email protected]:mozilla-b2g/B2G.git /workspace
git clone https://github.com/mozilla-b2g/b2g-manifest.git
git clone [email protected]:mozilla-b2g/b2g-manifest.git /workspace
代码同步:repo sync
安卓部分:
git。。。
repo。。。
【3】原生Android系统/firmware的备份
一些系统板层级的支持文件,在后续的移植和编译过程中也会被用到
mkdir my_device_backup
cd my_device_backup
adb pull /system system
【4】config.sh添加设备
在config.sh中可以看到很多已有的被移植的设备列表,我们选取一个和我们目标设备最相近的已知设备,参考这个相似设备,我们将它的manifest进行修改并作为目标设备的config.sh所需的文件清单的引导。
选择msm8974平台的nexus-5的manifest作为我们仿写的对象。
修改成果如下:
。。。
【5】为设备创造对应的-配置树,即在/device/manufacturer/device_id/目录下可能需要包含如下的文件:
B2G/glue/gonk-ics/device/<manufacturer>/<device_id> (device configuration tree for ICS) 配置树
AndroidKernel.mk
AndroidBoard.mk
AndroidProducts.mk
BoardConfig.mk
extract-files.sh
full_<device_id>.mk
idc files for touchscreen
init files (init.rc, init.<target>.rc, uevent.rc, ...)
关于 extract-files.sh:
B2G 会用到一些原厂设备特有的 binary blobs,包括 execution files,shared libraries,WIFI firmware,system configuration 等。不同设备之间有相当的差异,要怎么判断哪些文件需要被提取呢?这部份需要一些经验。可以先参考相似 solution 设备的做法,再根据 flash 后,B2G 跑起来的 logcat 讯息来调整。
截图-配置树目录图
【6】修改并重新编译bootimg
如果在没有项目源码情况下需要将当前手机中正在使用的镜像文件拉出来,也是有办法的:
cat/proc/mtd
cat/dev/mtd/mtdx > /sdcard/xxx.img
因为我们有当前Android项目源码,参照我们之前已经安装的ARM编译工具,hexagon等等,将Android项目源码编译之后得到了镜像文件诸如boot.img,system.img等等,(这里可以展示一下Android项目源码的分区表,包含的所有img列表都在这里):
。。。
从Android项目代码的编译输出目录中找到我们需要的boot.img,利用unmkbootimg进行解压,得到linux核心的zImage和虚拟磁盘initramfs.cpio.gz(执行命令截图结果)
。。。
修改ramdisk即initramfs.cpio.gz文件,再次将其进行解压,参考命令如下:(执行命令截图结果)
gunzip -c /path/to/your/boot.img | cpio -i
。。。
针对火狐和安卓系统的不同,对init.rc中启动的服务进行必要屏蔽和添加,这里需要学习init.rc的语法。
前面提到,要在这个档案中移除不需要的进程并加入B2G的相关进程,实际的内容可以参考已经支持的设备。
init.rc会由AndroidBoard.mk将其复制到目标的编译输出目录,最终它的相关内容会产生在boot.img之中。
除此以外,AndroidBoard.mk还会将其它的系统文件(ex:init.qcom.rc,uevent.rc…)同样输出在编译结果的输出目录中。
在init.rc文件中添加导入代码,导入init.b2g.rc
on early-init
start ueventd
import /init.b2g.rc
(修改内容待添加)。。。
改动后的init.rc文件如下:
。。。
让某些目录文件在之后的已挂载系统中也可以被修改和读写
chmod 0755 /system/b2g/b2g
chmod 0755 /system/b2g/updater
chmod 0755 /system/b2g/plugin-container
修改BoardConfig.mk中的TARGET_PROVIDES_INIT_RC去指定你想要使用的init.rc文件
bootimg中的所有修改都完成以后,再用到b2g项目源码目录下/out/host/linux_x86/bin里自带的两个工具mkbootfs和mkbootimg分别将ramdisk和bootimg整体进行打包操作:(执行命令截图保存)
B2G/out/host/linux-x86/bin/mkbootfs initramfs_dir | cpio -o -H newc | gzip > ../newinitramfs.cpio.gz
B2G/out/host/linux-x86/bin/mkbootimg --kernel zImage --ramdisk newinitramfs.cpio.gz --base 0x200000 --cmdline 'androidboot.hardware=aphone' -o new_boot.img
这个new_boot.img即是我们移植完成的系统引导关键镜像。
【7】编译烧写
简单的来说只需要将你修改完成的bootimg移动到b2g项目代码编译输出的目录“out/target/product/$DEVICE/”下,然后使用fastboot单刷也行或者b2g项目自带的build.sh和flash.sh脚本也可以,即可完成此编译烧录过程。
adb reboot bootloader
fastboot flash boot newboot.img
fastboot reboot
./config.sh <device_id> default.xml
./build.sh
./flash.sh
单刷:
./flash.sh gaia
./flash.sh gecko
./flash.sh system
./flash.sh boot
./flash.sh user
================================================================================================================
================================================================================================================
================================================================================================================
===构建和编译===
【1】构建的关键
火狐系统的构建和编译需要相当长的时间和硬件准备,即使这样编译过程也可能出现很多错误,需要根据实际情况反馈对系统环境或代码结构做出改动和调整。
构建的关键目标即以下这3个镜像文件:
-------------
the boot.img
包括linux内核的虚拟磁盘ramdisk和初始化"脚本"init.rc等等,在系统启动时ramdisk会被加载到内存中使用,即我们之前系统框架章节说到的初始化挂载的根文件系统。
boot.img会被拷贝到设备上的boot分区,在系统启动之后,利用adb shell在根目录下看到的内容即是ramdisk,ramdisk还会向系统提供一套精简过的unix-like工具包。
adb修改手机default.prop文件获得root权限:
setprob.ro.debuggable=1
我们将修改完成的镜像重新烧录时,通过adb进入并停留在手机bootloader见面(对于原生的系统来说就是显示splash.img,即linux小企鹅的界面),然后使用fastboot命令进行镜像对应分区的烧录即可。
-------------
the system.img
火狐操作系统的关键内容组成。
少部分的gonk火狐系统的底层组件,这一部分是不需要修改的。
大部分gecko的面向上层的火狐系统接口。
b2g这样的核心进程和其他关键模块进程(ril,。。。)的可执行文件。
system.img将会被复制到手机的system分区上,当系统成功启动后,可以在/system目录下查看。
-------------
the recovery.img
和bootimg一样,包含一个kernel.img和有一点差别的ramdisk,还有一个不同的初始化脚本,会去引导当前设备进行恢复手机系统的命令操作。
recovery.img会被复制到设备的recovery分区,在正常的手机系统中,这个镜像并不会被挂载,只用于手机在进行OTA升级或者备份恢复时,类似于桌面系统windows的PE工具一样。
recovery镜像中不同于bootimg的初始化脚本即执行恢复操作的脚本文件,除此之外还包含一个特殊的二进制文件,这个二进制文件即整个恢复执行操作的解释器。
-------------
userdata.img
对应根目录下的/data分区,主要用户存放用户数据,同时在/data/b2g/目录下有Gecko层的界面配置信息,/data/local/webapps/目录下还包含着Gaia层的本地预装在手机上的web应用程序。
(以上部分能在文件目录中有截图最佳)
【2】准备,配置,构建,安装
准备步骤已有。
-------------
配置:
根据你下载的b2g可以找到一个config.sh的脚本文件,打开就可以看到如下很多已支持的硬件设备,现在我们要做的就是选用一个相似平台设备的配置文件,修改它的manifest文件,完成自己目标设备的源码编译前期的配置工作。
在源码的配置过程中还会用到AOSP项目的repo工具,用于下载或更新构建过程中所需源码,不同版本的源码都会保存在.repo/projects目录下面,配置过程会花费很长时间。
更新b2g代码:(只做参考,不用全部执行,一般fetch或者pull操作即可,有代码冲突时用rebase命令)
git fetch origin
git checkout origin/master
git pull
repo sync
repo sync gaia
。。。
查看分支git show HEAD
首先参考nexus5手机的manifest进行修改并保存为当前我们设备的manifest。
./config.sh nexus-5-l
用相应的config.sh(不同设备对应其manifest.xml文件)去拖源代码,repo工具公共管理多个仓库,config这里才是正式下载源代码的部分,前面只是同步代码树结构。
其实config.sh脚本配置里列出了目标的所有仓库分,打开文件即可看到用repo管理的众多git仓库,如下:
(截图-打开config.sh文件-仓库列表部分)
-------------
构建:
利用源码中提供的build.sh脚本对源码进行整体的编译过程,当然也可以用makefile进行编译,初始化编译环境后选择相应的编译分支即可,自带的脚本工具会对所有源码进行编译,从AOSP项目工具到Linux内核,再到Gaia层的网络应用程序,为了避免编译失败停在我们不知道的模块,便于我们分析问题出处,建议在不确定代码的情况下分模块编译。
只对某一特定模块例如Gecko,gaia部分编译。
同样可以单独编译之前提到的关键的镜像文件比如system.img
./build.sh out/platform/$target/system.img,
这里 $target 参数要和配置过程中保持一致。
./build.sh
./build.sh gaia gecko
./build.sh -j8 //根据你系统的实际情况选择多线程方式编译加快进度
BUILD_APP_NAME=calendar ./build.sh gaia //单独编译gaia的某一个web应用
在/xxx/LINUX/android/源码目录下编译安卓源码:
source build/envsetup.sh
lunch 选择编译目标的平台和分支
make -j8
multilocale多语言环境编译:
进入目录初始化下载代码:
cd gaia/locales/
hg clone https://hg.mozilla.org/releases/gaia-l10n/v2_5/es
设置环境变量:
export LOCALE_BASEDIR=$PWD/locales
export LOCALES_FILE=$PWD/locales/languages_dev.json
export GAIA_DEFAULT_LOCALE=es
在gaia/locales/目录下修改languages-dev.json文件,在其中每一个repo管理的仓库中添加如下字段:
{
"en-US" : "English (US)",
"es" : "Español"
}
使用宏GAIA_KEYBOARD_LAYOUTS添加西班牙和意大利的键盘布局:GAIA_KEYBOARD_LAYOUTS=en,es,it
make clean && make production LOCALES_FILE=locales/languages-own.json
rm -rf out objdir-gecko && LOCALES_FILE=locales/languages-dev.json ./build.sh
构建编译一个官方模式的工程版本:
VARIANT=eng MOZILLA_OFFICIAL=1 B2G_SYSTEM_APPS=1 GAIA_OPTIMIZE=1 B2G_UPDATER=1 B2G_UPDATE_CHANNEL=default MOZ_TELEMETRY_REPORTING=1 MOZ_CRASHREPORTER_NO_REPORT=1 LOCALES_FILE=locales/languages_all.json GAIA_KEYBOARD_LAYOUTS=en,pt-BR,es,de,fr,pl,zh-Hans-Pinyin,zh-Hant-Zhuyin,en-Dvorak ./build.sh
-------------
安装:
使用flash.sh脚本完成完整的烧录过程。
独立分开构建的部分可以通过在脚本中添加相应参数进行安装。
./flash.sh gaia
-------------
计划先将下载的b2g源码成功编译一次,之后再对上面提到的这些镜像进行单独的解压修改,将修改完成的镜像放回到编译输出目录中,最后使用adb/fastboot工具或者flash.sh脚本文件进行烧录验证。
================================================================================================================
================================================================================================================
================================================================================================================
===Building and installing FOTA community builds===
可放弃掉这部分和以下的所有
===================================================
安卓系统的编译文件makefile的参数介绍:http://www.kandroid.org/online-pdk/guide/build_system.html#androidBuildVariants
编译文件makefile的参数详解:gaia和gecko模块
【1】gaia
gaia涉及参数太多,详细直接看源码
https://github.com/mozilla-b2g/gaia/blob/master/Makefile
【2】gecko:
MOZ_BUILD_DATE
Sets the build id to a specific build date/time.
B2G_DEBUG
xxx
VARIANT
Specifies the Gecko variant you want to build. Valid types are detailed below:
eng
This is the default flavor. A plain make is the same as make eng.
Installs modules tagged with: eng, debug, user, and/or development.
Installs non-APK modules that have no tags specified.
Installs APKs according to the product definition files, in addition to tagged APKs.
ro.secure=0
ro.debuggable=1
ro.kernel.android.checkjni=1
adb is enabled by default.
marionette is enabled
Does not have update notifications by default ( B2G_UPDATER=1 to turn on )
user
This is the flavor intended for final release.
Installs modules tagged with user.
Installs non-APK modules that have no tags specified.
Installs APKs according to the product definition files; tags are ignored for APK modules.
ro.secure=1
ro.debuggable=0
adb is disabled by default.
Optimizes by default
userdebug make userdebug
The same as user, except:
Also installs modules tagged with debug.
ro.debuggable=1
adb is enabled by default.
marionette is enabled
---------------------------------------
编译命令参考:gaia和gecko模块
【1】gaia
make
Makes only the profile.
make reset-gaia
Deletes the previous profile and installs a new Gaia profile.
make install-gaia
Installs Gaia on top without deleting anything.
make production
Does the same thing as PRODUCTION=1 make reset-gaia.
make clean
Removes the generated profile.
make really-clean
Removes the generated profile and the directory's xul-runner; you should only run this when things are totally borked.
【2】gecko:
./build.sh buildsymbols
Makes build symbols for debugging; see Uploading symbols to Mozilla's symbol server.
./build.sh gecko-update-full
Creates an OTA mar file; see Firefox OS update packages.
./build.sh gecko-update-fota
Creates a FOTA mar/zip based on files containing only a subset of files and directories; see Firefox OS update packages.
./build.sh gecko-update-fota-full
Creates a FOTA mar/zip based on files; see Firefox OS update packages.
./build.sh gecko-update-fota-fullimg
Creates a FOTA mar/zip based on partitions; see Firefox OS update packages.
================================================================================================================
================================================================================================================
================================================================================================================
make reset-gaia
make reset-gaia PRODUCTION=1
重置gaia会删除所有的用户数据。
B2G的通过OTA更新等等设置。
新建一个用户配置文件去设置OTA的宏:/B2G/.userconfig
export B2G_UPDATER=1