FAQ03127 MTK修改代码编绎命令

来源:互联网 发布:淘宝公司需要交税吗 编辑:程序博客网 时间:2024/05/17 06:28

[DESCRIPTION]
       当修改一些代码时,使用什么编译命令可以最有效率

[Keyword]

      编译命令 修改代码 最有效率 快速编译


[SOLUTION]
1: ./mk n(r) kernel; ./mk bootimage;当修改build-in 到kernel相关代码时,要使用此命令,具体文件参考如下:
     alps/kernel/
     alps/mediatek/platform/mt65xx/kernel/
     alps/mediatek/source/kernel/
     alps/mediatek/coustom/mt65xx/kernel/
     alps/mediatek/coustom/common/kernel/
     alps/mediatek/coustom/$porject_name$/kernel
...
ps: 由于./mk bootimag是很长的过程, 如果您没有修改到ramdisk相关的code, 可以参考以下FAQ加快编译.
只修改kernel的时候, 快速编译方法:  FAQ05444
 
2: ./mk n(r) k  /module_path  当修改kernel module相关代码时,要使用此命令,具体文件参考如下:
    alps/mediatek/platform/mt65xx/kernel/drivers/ccci/
     alsp/mediatek/platform/mt65xx/gpu/
     ......
   通常看对应文件夹的Makefile就知道是build in到kernel,还是ko,  
obj-m += xxx, 表示build成ko module,
obj-y += xxx,  表示build in到bootimag.
    ps: 要特别注意, 如果你new的时候是user版本, 在使用此命令的时候一定要加上 
 -oTARGET_BUILD_VARIANT=user,  否则会导致将之前new的结果全部删除, 
3: ./mk n pl  当修改preloader相关代码时,要使用此命令,具体如下:
     alps/mediatek/platform/mt65xx/preloader/
     alps/mediatek/source/preloader/
     alps/mediatek/coustom/mt65xx/preloader/
     alps/mediatek/coustom/common/preloader/
     alps/mediatek/coustom/$porject_name$/kernle
     ......
4: ./mk uboot  当修改uboot相关代码时,要使用此命令,具体如下:
     alps/mediatek/platform/mt65xx/uboot/
     alps/mediatek/source/uboot/
     alps/bootable/bootloader/uboot/
     alps/mediatek/coustom/mt65xx/uboot/
     alps/mediatek/coustom/common/buoot/
     alps/mediatek/coustom/$porject_name$/uboot/
      ......
5: ./mk systemimage 当修改system相关代码时使用此命令,具体文件目录如下:
      alps/frameworks/
      alps/packages/
      alps/vendor/
      alps/hardware/
      alps/dalvik/
      alsp/external
      ...........
     new完一次后, 如果使用这个命令其实很耗时间, 建议参考6的做法,
6: ./mk mm ./module_path ;  主要build一些modules, 如lib库, native 可执行程序, jar库, jar
apk.  相关文件参考如下:
     alps/frameworks/base   #可以根据修改的某些文件, 进入更细的目录去build相关库.
     alps/frameworks/native/libs/binder/   #native目录下有很多相关的lib库.
     alps/frameworks/native/libs/binder/utils/
     alps/external    #主要是一些native的二进制可执行文件. 
     ps: build完后可以找到对应的目标文件直接push到手机, 也可以使用./mk snod直接快速打包新的system.img, 然后download.   可参考如下FAQ:
    如何加速./mk snod打包:  FAQ10299
 
7: ./mk recoverimage  当修改recover相关代码时使用此命令,具体如下:
      alps/bootable/recovery/
      alps/mediatek/customer/$project_name$/recovery/
      ......
8: ./mk factoryimage:  当修改factory相关代码时使用此命令,具体如下:
      alps/mediatek/coustom/$project_name$/factory/
      alps/mediatek/coustom/common/factory/
      alps/mediatek/source/factory/
      ......
9: ./mk secroimage  当修改secro相关代码时使用此命令,具体如下:
      alps/mediatek/source/secro/
      alps/mediatek/coustom/$project_name$/secro/



[FAQ05444] 只修改kernel的时候, 快速编译方法
[Description]
     通常我们修改kernel的时候, 需要下命令 ./mk xxx n k; ./mk bootimage; 这样需要比较长的时候.此FAQ提供快速编译方法
 
[Keyword]
kernel build
 
[Solution]
1:将如下code存为mkbootimage.sh
2:将mkbootimage.sh放在alps/目录下: 
3:cp out/host/linux-x86/bin/mkbootimg  ./
4:修改权限: chmod 777 mkbootimage.sh
5:执行:  ./mkbootimage.sh project_name
 
GB,GB2上需要修改成
#!/bin/sh
PROJECT=$1
echo ./makeMtk $PROJECT new kernel
./makeMtk $PROJECT new kernel
echo mkbootimg --kernel kernel/Download/flash/kernel_$PROJECT.bin --ramdisk ./out/target/product/$PROJECT/ramdisk.img -o ./out/target/product/$PROJECT/boot.img
./mkbootimg --kernel kernel/Download/flash/kernel_$PROJECT.bin --ramdisk ./out/target/product/$PROJECT/ramdisk.img -o ./out/target/product/$PROJECT/boot.img
 
 
ICS,ICS2,JB2上需要修改成:
#!/bin/sh
PROJECT=$1
echo ./makeMtk $PROJECT new kernel
./makeMtk $PROJECT new kernel
echo mkbootimg --kernel kernel/out/kernel_$PROJECT.bin --ramdisk ./out/target/product/$PROJECT/ramdisk.img -o ./out/target/product/$PROJECT/boot.img
./mkbootimg --kernel kernel/out/kernel_$PROJECT.bin --ramdisk ./out/target/product/$PROJECT/ramdisk.img -o ./out/target/product/$PROJECT/boot.img
 
KK版本上需要修改成:
#!/bin/sh
if [ -z "$2" ]; then
 OUT="out"
else
 OUT=$2
fi
#########################################################################
# Please modify the following variables value according to the
# alps/mediatek/config/${PLATFORM}/BoardConfig.mk, if the corresponding
# variable is not defined in BoardConfig.mk, please use the default value
##################################################
#BOARD_KERNEL_BASE=0x40000000
BOARD_KERNEL_BASE=0x10000000      #default value
 
#BOARD_KERNEL_OFFSET=0x00008000
BOARD_KERNEL_OFFSET=0x00008000    #default value
 
#BOARD_RAMDISK_OFFSET=0x04000000
BOARD_RAMDISK_OFFSET=0x01000000   #default value
 
#BOARD_TAGS_OFFSET=0xE000000
BOARD_TAGS_OFFSET=0x00000100      #default value
 
#BOARD_KERNEL_CMDLINE="bootopt=64S3,32S1,32S1"
BOARD_KERNEL_CMDLINE=""           #default value
#########################################################################
echo make $1 boot image @ $OUT ...
$OUT/host/linux-x86/bin/mkbootfs $OUT/target/product/$1/root | $OUT/host/linux-x86/bin/minigzip > $OUT/target/product/$1/ramdisk.img &&
mediatek/build/tools/mkimage $OUT/target/product/$1/ramdisk.img ROOTFS > $OUT/target/product/$1/ramdisk_android.img &&
mv $OUT/target/product/$1/ramdisk_android.img $OUT/target/product/$1/ramdisk.img &&
$OUT/host/linux-x86/bin/mkbootimg \
 --base $BOARD_KERNEL_BASE \
 --kernel_offset $BOARD_KERNEL_OFFSET \
 --ramdisk_offset $BOARD_RAMDISK_OFFSET \
 --tags_offset $BOARD_TAGS_OFFSET \
 --cmdline "$BOARD_KERNEL_CMDLINE" \
 --kernel $OUT/target/product/$1/obj/KERNEL_OBJ/kernel_$1.bin \
 --ramdisk $OUT/target/product/$1/ramdisk.img \
 --output $OUT/target/product/$1/boot.img
echo done


[FAQ10299] 如何加速./mk snod打包

[DESCRIPTION]
mm命令快速编译一个模块之后,一般用adb push到手机看效果,如果环境不允许用adb push或模块不经常改,希望直接放到image里,则可以用./mk snod,这个命令仅仅将system目录打包成system.img,然后方便直接下载,但是这个命令还是很慢(慢在搜索所有的Android.mk),有一种方法可以加速该编译到1分钟以内
 
[KEYWORD]
./mk snod
 
 
[SOLUTION]
修改alps/build/core/main.mk:
subdir_makefiles :=\
    $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)
修改为:
ifneq ($(MAKECMDGOALS),snod)
subdir_makefiles :=\
    $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)
endif
 
以上避免了不必要的耗时操作,加速./mk snod编译
 
PS: 这边有另外一个FAQ可以快速提升Android编译速度,强烈建议配置上(大约可提升50%):[FAQ10625] 提升Android编译速度

[FAQ10625] 提升Android编译速度

Android codebase都很大,编译一次都需要花很多时间,如果是preloader/lk/bootimage还好,但是Android的话都是非常久。
实际上这个编译时间还是可以进一步缩短!
 
[KEYWORD]
ccache
编译时间
提升
降低
 
[SOLUTION]
1. 移除modules_to_check
(1). Android默认是所有模块都会编译的(不管需不需要),这个有些冗余,可以通过修改编译系统不编译哪些没有用到的模块
(2). 修改方法:alps/build/core/main.mk
files: prebuilt \
  $(modules_to_install) \
  $(modules_to_check) \
  $(INSTALLED_ANDROID_INFO_TXT_TARGET)
修改为:
files: prebuilt \
  $(modules_to_install) \
  $(INSTALLED_ANDROID_INFO_TXT_TARGET)
(3). 如果是ubi nand文件系统的项目(比如72 nand项目),还需要在alps/build/core/Makefile中:
$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \
  $(INSTALLED_RAMDISK_TARGET) \
  $(INSTALLED_BOOTIMAGE_TARGET) \
  $(recovery_binary) \
  $(recovery_initrc) $(recovery_kernel) \
  $(INSTALLED_2NDBOOTLOADER_TARGET) \
  $(recovery_build_prop) $(recovery_resource_deps) \
  $(recovery_fstab) \
  $(recovery_gzip) $(recovery_sec_ko) \
  $(RECOVERY_INSTALL_OTA_KEYS)
的前面添加:
ifeq ($(TARGET_USERIMAGES_USE_UBIFS),true)
$(INSTALLED_RECOVERYIMAGE_TARGET): $(recovery_ubiformat)
endif
否则会编译失败!
(4). 修改后Android编译时间降低16%~18%(数据仅供参考)
(5). 此种方法google已在4.3版本默认应用了。
(6). 仅对new有效果,但是由于没有编译没有用到的模块,不仅节省时间还节省磁盘空间(节省out目录下的中间文件)。
 
2. 开启android ccache
(1). ccache是google默认就存放在codebase的工具,对于ccache的功能可以到网络搜寻资料。
(2). 设置cache大小(这一步一定要做!!),一个codebase需要大约5G的空间,如果你的编译环境有5个codebase在使用,那么需要25G的空间。设置小了还会引起编译时间延长!!
    [1].GB版本:prebuilt/linux-x86/ccache/ccache -M25G
    [2].JB版本:prebuilts/misc/linux-x86/ccache/ccache -M25G
(3). 开启的方法:
    [1].命令行增加USE_CCACHE=1即可:./mk -o=USE_CCACHE=1 n。如果是user版本开启ccahce的话,可以这样:./mk -o=USE_CCACHE=1,TARGET_BUILD_VARIANT=user n。
    [2].建议:添加到环境变量(其他方式亦可):修改alps/makeMtk,在#!/usr/bin/perl之后新建一行,填写$ENV{"USE_CCACHE"} = 1;
(4). 第1次编译会花多一点时间建立cache,之后即可享受ccache带来的好处,降低所有使用gcc的编译时间,大约25%~30%
    [1].可以通过ccache -s查看cache信息,如果满了可以用ccache -C清除所有。在满了状态下编译新codebase,将会旧的那个清除,这会降低效率,所以cache一定要设置正确!
(6). 对mm/new/remake android都有效果。
 
3. 开启kernel ccache
(1). 以上ccache只对编译android有效,kernel部分需要额外设置才行
(2). alps/kernel/Makefile文件中的
S  = $(CROSS_COMPILE)as
LD  = $(CROSS_COMPILE)ld.bfd
CC  = $(CROSS_COMPILE)gcc
CPP  = $(CC) -E
之后添加:
ifneq ($(USE_CCACHE),)
  export CCACHE_COMPILERCHECK := content
  export CCACHE_SLOPPINESS := time_macros,include_file_mtime,file_macro
  export CCACHE_BASEDIR := /
  ccache := $(strip $(wildcard $(PWD)/../prebuilts/misc/linux-x86/ccache/ccache))
  ifdef ccache
    ifneq ($(ccache),$(firstword $(CC)))
      CC := $(ccache) $(CC)
    endif
    ccache =
  endif
endif
 
(3). 这样在编译kernel时也可以享受到ccache带来编译时间的缩短。
 以上两种方法优化后大约可降低50%的编译时间,也就是说优化前需要1小时编译时间,优化后半小时就完成了。
0 0
原创粉丝点击