编译libcore模块,报错:

Copying: out/target/common/obj/JAVA_LIBRARIES/core-tests-support_intermediates/classes-jarjar.jar
Copying: out/target/common/obj/JAVA_LIBRARIES/core-tests-support_intermediates/emma_out/lib/classes-jarjar.jar
Copying: out/target/common/obj/JAVA_LIBRARIES/core-tests-support_intermediates/classes.jar
target Static Jar: core-tests-support (out/target/common/obj/JAVA_LIBRARIES/core-tests-support_intermediates/javalib.jar)
make: *** 没有规则可以创建“out/target/common/obj/JAVA_LIBRARIES/core-tests_intermediates/classes-full-debug.jar”需要的目标“out/target/common/obj/JAVA_LIBRARIES/sqlite-jdbc_intermediates/javalib.jar”。 停止。
make: Leaving directory `/home/chenzhang/android_source_code/4.4'

删除libcore源码,重新下载,整个工程build可以通过。但是mmm ./libcore单独编译还是不通过。最终,通过不懈的努力,我终于解决了问题。我记录一下失败的经历和最终成功解决的办法。

失败的经历

对于我这个makefile的小白,对于错误当然只有百度了,只找到一个资料:https://blog.csdn.net/class_brick/article/details/71629756
他的实际的作用就是不生成core-tests库
coretest.jpg
我照着做了,然后接着又会报类似错误:

没有规则可以创建benchmarks需要的目录core-tests停止

这两个错误的根源就在于 :
mk.jpg
其实看了这张图,解决问题的突破口已经十分明显了,而我采取和上面那个博客里类似的解决办法:
把libcore里的
```include $(LOCAL_PATH)/benchmarks/Android.mk```这行代码注释掉
编译,确实通过了,但是系统卡在android字样界面起不来。

成功的解决办法

上面这张图已经把解决问题的突破口指明了:找不到sqlite-jdbc。
最开始出现的错误:

make: *** 没有规则可以创建“out/target/common/obj/JAVA_LIBRARIES/core-tests_intermediates/classes-full-debug.jar”需要的目标“out/target/common/obj/JAVA_LIBRARIES/sqlite-jdbc_intermediates/javalib.jar”。 停止。
make: Leaving directory `/home/chenzhang/android_source_code/4.4'

看我这篇文章https://www.jianshu.com/p/227fd539dc8e
充分理解makefile编译原理之后就能知道没有规则可以创建xxx需要的目标A停止这类错误其实就是A库找不到,搜索生成这个库的mk文件。

grep 'LOCAL_MODULE := sqlite-jdbc' -Inrw  --include=*.mk

先在libcore目录找,没有找到,然后在源码根目录找到
image.png
执行

mmm ./external/javasqlite/

再次执行

mmm ./libcore/

报了另外的错:
image.png
同理,找库所在mk并编译
image.png

mmm ./external/mockwebserver/

再次执行

mmm ./libcore/

然后,还是出现了一系列的错误,都是external目录下相关的库。看一下external目录,有171个mk,我不可能一个个去编译一遍吧?其实也没有这么恐怖,只要把下面的这些库重新编译一下就行了(可能某个库又依赖了其它的库,也需要mmm一下)。
image.png

所以,问题的根本是make并没有把所有的mk都会执行一遍,比如test相关的,需要我们自己手动=去make。

编译libcore的故事还没有完,后面又有新的故事出现。

新的问题

1.mm指令瞎带参数导致的无穷编译报错

报错:
```没有规则可以创建core_intermediates/classes-jarjar.jar”需要的目标“out/host/linux-x86/bin/acp”。 停止```
找到出问题的模块,重新编译```mmm ./build/tools/acp/```

接着报错:
```make: *** 没有规则可以创建“out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes-with-local.dex”需要的目标“out/host/linux-x86/bin/dx”。 停止。```
...
然后后面的错又说找不到libcore
重新编译,无穷无尽的报错...
感觉问题好像就是我使用mm clean这个错误的指令(我想着带个clean是不是就能把当前目录的out删除,其实根本没有这个),可能导致编译系统出现了问题。

想clean某个模块:正确的做法应该是:使用mm -B,它将重建一切,相当于清理,然后再构建。


0 条评论

发表回复

您的电子邮箱地址不会被公开。