我有一个基础的Android项目,可以调整,并希望生成不同的APK。通常,更改是帮助链接,图标/图像,隐藏某些功能等。
在iOS(Xcode)和Win商店应用程序(VS 2012 exp)中,可以创建多个目标来控制与目标捆绑在一起的资源,以及我们使用C标志以编程方式更改行为。
是否可以使用eclipse ADT为Android项目做同样的事情?我看到的主要问题是,每个APK都会更改捆绑包签名(如com.xxx.yyy),并且由于每个文件在文件中都包含com.xxx.yyy包,因此无法在其他项目中使用该文件(它有像comm.aaa.bbb这样的签名。)
答案 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,它看起来非常不方便且非常有限。