0

我使用 android 库(库项目,而不是 jar)来维护 2 个目标项目(免费和付费)和 1 个代码库。目标项目中根本没有代码,所有代码都在库中。

我需要在库中添加代码块:

if (main.liteVersion)
{
  //lite version code here
}
else
{
  //full version code here
}

据我所知,条件变量是否为最终静态 java 编译器将排除未使用的代码(如果 main.liteVersion 为真,则为完整版本代码)。这就是我需要的。因为我不希望有人反编译精简版并查看付费版本的代码。我知道这不是一个定义,但我只是没有在免费版本二进制文件中包含付费版本代码。

但是我不能在目标项目中添加最终的静态变量,然后在库中看到它。

有一些方法可以确定我们在哪个目标项目中。我们可以读取当前包名称来确定正在运行的版本。如果我们在目标项目中添加配置类,我们可以在库中使用反射来获取 cfg 值。我们也可以在目标项目中添加资源,但它会添加到 com.tertium.lite.R,但在库中我们只能读取 com.tertium.library.R(当然使用反射我们可以读取任何内容)。但是这样的“动态”方法不会使编译器排除未使用的代码(条件将是运行时计算的值)。

我们可以在构建时重写库项目中的配置类(使用 ant 或 shell 任务),然后我们将拥有“自然”的静态设置,但我不想接触库。

以防万一-我使用eclipse helios,android版本-1.6-4.2。

有任何想法吗?谢谢!

更新:它不再是实际的了,因为我拒绝将项目用作库并开发了无缝的基于 ant 的资源编译和构建工作流,它支持所有需要的配置。此外,据我所知,我最初的问题没有有效的答案。

4

2 回答 2

1

我建议您将其作为构建系统的步骤(ant、maven、make 等)。我希望这样的源代码很少,因此您可以添加文件替换手册作为构建步骤。

不要让这个编译器工作:很难长期控制。编译器选项/版本会改变,行为也会改变。

于 2013-02-11T09:33:02.707 回答
0

您可以使用 ProGuard 删除未使用的代码(在应用程序项目上,而不是在库项目上)。如果应用程序项目中根本没有代码,您可能需要求助于proguard-project.txt每个应用程序项目中的不同文件,并确保在免费版本中不保留任何付费入口点

ProGuard 规则有点棘手,你可以看到proguard/mapping.txt文件中保存了哪些类和方法

于 2013-02-11T12:14:33.167 回答