Java android:使用project';从库中删除最后一个静态变量,或使用其他一些技巧排除未使用的代码

Java android:使用project';从库中删除最后一个静态变量,或使用其他一些技巧排除未使用的代码,java,android,eclipse,javac,android-library,Java,Android,Eclipse,Javac,Android Library,我使用android库(库项目,而不是jar)维护2个目标项目(免费和付费),其中有1个代码库。目标项目中根本没有代码,所有代码都在库中 我需要在库中添加代码块: if (main.liteVersion) { //lite version code here } else { //full version code here } 正如我所知,若条件中的变量是最终变量,静态java编译器将排除未使用的代码(若main.liteVersion为true,则为完整版本代码)。这就是我需要的

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

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

if (main.liteVersion)
{
  //lite version code here
}
else
{
  //full version code here
}
正如我所知,若条件中的变量是最终变量,静态java编译器将排除未使用的代码(若main.liteVersion为true,则为完整版本代码)。这就是我需要的。因为我不想sobody反编译精简版,也不想看到付费版的代码。我知道这不是def,但我只是不包括免费版本二进制中的付费版本代码

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

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

我们可以在构建时重写库项目中的配置类(使用ant或shell任务),然后进行“自然”静态设置,但我不希望触碰库

以防万一-我使用EclipseHelios,android版本-1.6-4.2

有什么想法吗?谢谢

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

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


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

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


ProGuard规则有点棘手,您可以看到在
ProGuard/mapping.txt
文件中保留了哪些类和方法,我建议使用相同的名称编写不同的类和接口实现,但使用不同的包。让专业版本类扩展免费版本类并添加更多功能。对于项目变量,请查看清单元数据:@User117这非常不方便,尤其是当它是一个游戏时,您应该牺牲体系结构来提高性能。此外,它是更多的代码。顺便说一下,我需要的不是2个,而是5个不同的配置,这些配置因代码和资源的少量差异而有所不同。@meh,谢谢你的提示,我不知道这一点。但从技术上讲,这就像读取当前的包名一样——它是动态的和运行时的。我仍然在考虑预构建代码的更改,尽管我不喜欢它。我非常怀念C++,它在项目设置和预处理器中预定义宏:“第三版YAE,我也遇到了问题,还有一件事我遇到了它的‘ProGueID’,它只在创建签名的APK时使用。是的,我可以添加一个构建步骤,但问题是——我是否可以让javac在使用这个库的项目的构建阶段排除一些代码?我的意思是,它们是在同一个流程中编译的,所以这应该是可能的。但我不想在预构建步骤中替换库的代码,因为当我打开另一个目标项目(免费或付费)时,我需要手动重建它:当我更改库代码时,目标项目不会自动重建。我可能会忘记重建,目标变得免费而不是付费,反之亦然。希望您理解…谷歌建议不要使用Proguard的代码收缩功能。我也有使用它的负面经验(一些设备上不可预测的问题,在我打开优化后,正如谷歌推荐的那样)。此外,Dalvik使用未使用的代码本身执行一些代码优化。但是:即使是Proguard也不能删除依赖于某个运行时评估值的代码——程序可以在运行时对其进行更改,如果代码被删除了怎么办?这就是为什么这不会有帮助。谷歌建议使用Proguard,请参阅:运行Proguard是完全可选的,但强烈建议。。顺便说一句,如果您不想让代码轻松反向运行,这几乎是必要的打开\Android\Android sdk\tools\proguard\proguard-Android.txt并阅读以下内容:“优化在默认情况下是关闭的。Dex不喜欢通过proguard优化和预验证步骤运行的代码(并自行执行其中一些优化)。”。即使在优化配置中:“添加优化也会带来某些风险,因为例如,并非所有由ProGuard执行的优化都适用于所有版本的Dalvik。以下标志会关闭已知存在问题的各种优化,但列表可能不完整或不最新……如果您选择此路线,请确保进行彻底测试。”好,ProGuard的优化步骤已禁用,但收缩和模糊处理步骤已启用,非常有用(建议使用)。我从来没有接触过全局配置文件,但是当我在发布模式下编译时,很多未使用的类和方法都被删除了。javac将删除未使用的代码本身——如果它知道它是未使用的。但重要的是要理解,在编译时,如果您的条件中有变量(而不是最终的静态变量),则不可能确定哪些代码是未使用的,这些变量可以在运行时更改,甚至可以隐式更改