在eclipse ADT中使用相同的android项目的多个目标

时间:2013-12-05 15:17:11

标签: android eclipse-adt

我有一个基础的Android项目,可以调整,并希望生成不同的APK。通常,更改是帮助链接,图标/图像,隐藏某些功能等。

在iOS(Xcode)和Win商店应用程序(VS 2012 exp)中,可以创建多个目标来控制与目标捆绑在一起的资源,以及我们使用C标志以编程方式更改行为。

是否可以使用eclipse ADT为Android项目做同样的事情?我看到的主要问题是,每个APK都会更改捆绑包签名(如com.xxx.yyy),并且由于每个文件在文件中都包含com.xxx.yyy包,因此无法在其他项目中使用该文件(它有像comm.aaa.bbb这样的签名。)

2 个答案:

答案 0 :(得分:2)

在eclipse中.apk使用Ant构建,不支持多个APK构建。当然你可以编写自己的脚本,但这很困难。

幸运的是,还有另一个构建系统,它被称为Gradle,它得到Android开发人员的支持。 http://tools.android.com/tech-docs/new-build-system/user-guide

您对“Build Variants”一节感兴趣

但并非所有内容都如此简单,带有ADT和Gradle的Eclipse不兼容,但Android Studio是。

答案 1 :(得分:1)

这个问题的根源是Java本身,你不能拥有类似于#ifdef的东西,大多数编译器都不允许完全替换它或类的一部分。

我实际上有一个基础项目,我已经从中构建了6个APK,很快就会开始。

每个APK都使用自己的包名,但整个代码都在一个包中,但不会造成任何问题。

但是有很多问题: - 所有资源,所有类都将在目标APK中,无论是否使用。 - 不同的行为意味着不同的代码或不同的资源,每个代码必须以不同的方式处理。

对于资源来说,它“非常简单”,只需在最终的应用程序项目中替换资源。但是,未使用的资源将被遗留下来。

对于课程来说,这就变得非常复杂。

  • 要创建稍微不同的行为,您可以使用反射和界面,每个APK使用通用名称实现它自己的界面版本,例如使用反射检索的myActivityPrj。

  • 有时在代码中测试APK包名称也更容易,因此在Application对象中,我设置了一些关于哪个APK实际运行的布尔值。确保仅使用UI中的那些来避免任何性能损失。

  • 要创建非常不同的行为,例如APK中没有使用某个活动,那么,可以使用上面的方法和一个标记说明是否可用,但是APK内部空间的浪费!

  • 另一种选择是尽可能以较小的碎片分解中央项目!

为了让APK更小,我发现到目前为止只有一种方法:创建一个Java项目,它将复制中央项目,然后从远程源树(名为“replacement”的目录中删除和/或替换此副本中的文件) -files“包含res和src文件夹。”

对于资源,该java项目实际上将解析所有strings.xml并从硬编码列表中删除未使用的字符串,不能信任lint输出,因为在子项目中使用了一些资源而lint并不关心。 / p>

到目前为止,包含所有功能的APK大约为10MB,一个变体大约为4MB,而实际上应该小于2MB。另一个变化是大约8MB,而它应该是2或3MB。上述方法过于复杂,能够删除未使用的代码和资源变得越来越复杂。

我已经研究过各种其他解决方案,但是他们都非常复杂,有很多限制和约束。

在Android上开发了4年之后,我唯一的结论是Java是移动设备可能的最差选择:速度慢,效率低,资源匮乏,而且非常不灵活。看看NDK,它看起来非常不方便且非常有限。