最近在搞兼容android4.0的一些工作,简单小结一下。

1、编译最好用 make -j16 或者 make -j32,这个要根据机器的配置来。我是在高性能服务器上编译,所以,可以这么设置;

2、有时只是修改了一下makefile,使用mm编译模块并不会工作,可以先cd到模块下:

   find . -name *.java | xargs touch

如果你是c,c++,find . -name *.h | xargs touch

然后,再mm,就会重新进行编译了;

3、有时,修改了Java文件和c(c++)文件后,然后用make -j16编译出来的rom有问题。你很有可能是遭遇了没有完全编译的问题。可能有一部分jar包依然在调用旧的接口,但是旧的接口已经被删除掉了。我有遇到过一次,解决的办法是:可以到out目录下的某个子目录,删除对应的jar包。只要删除的jar包,刚好包含了修改过的Java文件,再用make -j16就可以确保完整编译整个模块。比如,我修改了external/bouncycastle/文件夹下的源码,删除:/out/target/common/obj/JAVA_LIBRARIES/bouncycastle_intermediates目录下的所有文件(用rm -r *),然后再make -j16就可以确保完整编译,效果和make clean,然后再make -j16的效果是一样的。在怀疑未完全编译导致的问题时,可以先这样尝试一下,因为不是全编,比较节省编译的时间。

   怎么怀疑到是哪个模块呢?其实,可以通过离正常状态(手机可以跑起来的状态)之后,究竟修改了哪些文件,可以大致判断出是哪一块代码的修改导致的问题。那就把这部分代码编译出来的jar包删除就可以了。

4、如果是在做系统移植,编译是为了排错,可以只用make -j1,这样编译出错时,在控制台上就能看到导致编译出错的原因。不过,因为是单线程编译,所耗费的时间会久很多。