如何在AOSP源码树中制作特定模块的调试版本?

3
我构建了AOSP树的eng版本并安装在设备上。我想逐步执行一个模块的代码(比如libinput.so)。我想使用"-O0 -g"作为CFLAGS的一部分来构建此模块。但是我不想更改这个模块的Android.mk文件。
假设此模块位于aosppath/frameworks/base/service/input。我在执行build/envsetup.sh后进入此文件夹。
我尝试了"mm -B LOCAL_STRIP_MODULE=false"。当我在eclipse gdb中逐步执行时,我看到执行顺序来回跳动。然后我尝试了"mm -B LOCAL_STRIP_MODULE=false LOCAL_CFLAGS="-O0 -g""。现在gdb能够正常地逐步执行了。但是在其他项目中似乎不起作用。我有一个模块使用skia和opengl。当我在命令行中传递LOCAL_CFLAGS时,构建失败了。
在AOSP树下,调试特定的.so或.exe的推荐方法是什么?
谢谢。

你不想改变 .mk 文件的特定原因吗?这通常是设置构建类型条件的地方。 - Andrew T.
如果我更改了.mk文件,那么我必须牢记不要将它们检入。 - videoguy
1个回答

1
因为您不想提交更改,所以不想修改 Android.mk 文件,这里提供一种替代方案:使用 .repo/local_manifests 文件夹将某个由 Android 拥有的模块更改为您拥有。
以下是一个示例 my_manifest.xml 文件,可以帮助您完成此操作:
<manifest>
  <remote name="origin"
           fetch="ssh://git@github.com/YourRepoHere/" />

  <remove-project name="platform/frameworks/base"/>
  <project path="frameworks/base" remote="origin" name="frameworks-base" revision="your-branch-name"/>

</manifest>

这将从Android清单树中删除frameworks/base,并用您自己的清单树替换它(您需要将其分叉到自己的存储库中)。
然后,您可以在Android.mk文件中使用条件语句,如下所示:
ifeq ($(TARGET_BUILD_VARIANT),userdebug)
    CONDITIONAL_CHANGES_HERE
endif

再次提醒,我知道您不想修改Android.mk文件,但是既然您还询问了一种在构建变体条件下创建模块的建议方法,我将包含此答案,以防没有更好的方法。这确实是您想要做的事情的建议方法,因为您的项目现在将由repo工具维护。


谢谢Andrew!这似乎相当复杂。我期望得到类似于“mm DEBUG=true”的东西,以便生成具有正确调试值的CFLAGS。难道没有类似的技巧吗? - videoguy
看起来你调用的方式没问题,因为STRIP_MODULE对你有效。这意味着你可以通过mm命令设置环境变量,Android.mk文件是否可能自行重新定义或更改LOCAL_CFLAGS? - Andrew T.
当我将LOCAL_CFLAGS作为mm的一部分传递时,external/skia文件夹会出现故障。我搜索了所有.mk文件,但没有看到LOCAL_CFLAGS:=类型的赋值语句。所有都是+=类型的赋值语句,这是可以预期的。 - videoguy
啊,是的,但请注意它包括这一行:include $(CLEAR_VARS)。如果您去查看build/core中的clear_vars.mk,您会发现LOCAL_CFLAGS在此定义的一部分中被清除。我很好奇当通过mm传递变量时,这是否会破坏您的尝试,尽管我不知道为什么STRIP_MODULE会有任何改变。 - Andrew T.
大多数.mk文件在顶部都有这个包含(include)。我不认为它会影响从命令行传递的变量(vars)。构建成功的模块也在顶部有这个包含(include)。 - videoguy
你尝试过使用 -e / --environment-overrides 选项,并手动使用 export 设置所有所需的环境变量吗? - Andrew T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接