Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否有一个构建系统支持热交换整个文件或代码片段,而不考虑文件类型?_Android_Build - Fatal编程技术网

Android 是否有一个构建系统支持热交换整个文件或代码片段,而不考虑文件类型?

Android 是否有一个构建系统支持热交换整个文件或代码片段,而不考虑文件类型?,android,build,Android,Build,TL;DR 我是一名android开发人员,我有几个相同应用程序的副本,它们的功能略有不同。尽管我尽了最大努力,但每当我需要对所有应用程序进行一次更改时,我都不得不对每个应用程序副本(以下简称“flavor”)进行复制和粘贴样式修改。这在Android中尤其令人发指,因为给定的应用程序中涉及的语言/文件类型太多了—C用于本机代码,Java用于常规代码,xml文件用于数据、布局和操作系统权限等。我知道,避免仅在Java或C中工作的复制和粘贴编码的技巧不会同时扩展到这两种语言/文件,也不会扩展到.x

TL;DR 我是一名android开发人员,我有几个相同应用程序的副本,它们的功能略有不同。尽管我尽了最大努力,但每当我需要对所有应用程序进行一次更改时,我都不得不对每个应用程序副本(以下简称“flavor”)进行复制和粘贴样式修改。这在Android中尤其令人发指,因为给定的应用程序中涉及的语言/文件类型太多了—C用于本机代码,Java用于常规代码,xml文件用于数据、布局和操作系统权限等。我知道,避免仅在Java或C中工作的复制和粘贴编码的技巧不会同时扩展到这两种语言/文件,也不会扩展到.xml文件。我已经使用ApacheAnt成功地创建了一个定制的构建/文件夹,并在其中包含了不同构建目标的相关文件,但是它有点笨拙,有些情况它就是无法处理

我想知道是否有一个构建系统可以为我处理所有这些;我愿意接受任何建议,尽管我想到的解决方案是一种与语言无关的/filesystem#include方法,它在构建时为给定的风格将整个文件注入到src/树中,或者将代码片段注入到该src/树中的各种.java、.c和.xml模板文件中

一个非常长的解释和具体的例子:

口味差异的例子:在谷歌商店,我必须使用谷歌应用内购买sdk;但在亚马逊商店,我必须使用亚马逊应用内购买sdk。不同的口味搭配不同的广告合作伙伴。某些风格需要不同的i18n语言文件;或不同设备的图形和布局资源;任何给定的风格本质上都是基本代码,加上任意数量的这些“附加组件”,其中每个附加组件都需要一些自定义代码和文件添加到该应用程序的src/树中。每当我需要更改一个附加组件时,我最终不得不将更改复制并粘贴到使用它的应用程序的每一个版本中,这是一种可怕的痛苦

作为一个具体的例子,假设我有一个android游戏,并且实现了一个定制的Flurry Appcircle广告视图。这通常涉及以下方面:

  • 在游戏的AndroidManifest.xml中添加
    和/或
    标记
  • 在apk的res/values xx/strings.xml文件夹系统中为广告添加了各种
    行,其中xx是一种语言代码(即西班牙语翻译为res/values es/strings.xml)
  • 在res/layout或assets/中为广告提供一个或多个图像或版面资源
  • 实际的Flurry Inc sdk以libs/中的Java.jar文件的形式存在,如果需要以不同的方式处理不同的硬件架构,则可能有多个jar文件
  • 游戏活动类中的Java代码,例如在onStart或onStop中,用于查询并显示Appcircle广告。为了避免代码重复,我通常会在一个基类中编写它,该基类围绕“if(appcircleAdsEnabled(){…}”中的所有代码,创建该方法的默认实现,该方法在各个子活动类中返回false,@Override并返回true
  • 这会导致一些问题:

  • jar现在是基类编译的一个依赖项,无论是否在任何给定的风格中启用了ads。我希望构建器在构建时注意到代码或资源未使用,并将其从最终apk中删除;但是没有保证,失败会导致(a)最终二进制大小过大和(B)潜在的P.R.问题或更糟的问题(特别是自动扫描器搜索代码内含物——在一个稍微不同的例子中,我很难向亚马逊应用商店保证“是的,谷歌播放账单在那里,但没有使用。”)
  • 由于Android将资源文件转换为java常量的方式,以及与(1)相同的方式,res/*文件也可能成为从该基类派生的所有游戏不必要的依赖项
  • 我发现有些库/方法坚持在特定位置或以特定方式添加它们的代码,这完全排除了基类方法
  • 对于每个单独的游戏,我仍然必须至少编辑它的AndroidManifest来“打开它”,并请求显示广告所需的相关操作系统权限
  • 记住哪一个“加载项”与哪些文件中的哪些更改是很乏味的。例如,在任何给定的flavor的AndroidManifest.xml中,我都无法跟踪哪些加载项需要哪些权限。如果我删除Flurry加载项,我还需要其他内容的INTERNET权限吗
  • 我希望存在的是,我想问的是,是否有某种方法可以将文件和代码片段注入到某个骨架文件系统中或其上,每个附加模块都由这些文件和代码片段的集合组成,并在构建时动态注入,构建系统跨多个附加模块合并行,并处理依赖关系即时包含。即对于我的Flurry广告插件,我将:

  • 一些文件“文件”集合,其中包括对各种.xml文件(如AndroidManifest.xml)的xml添加、对各种.java文件(如Activity子类)的代码添加,以及在某些情况下要在不同位置注入的整个文件(如ad布局文件)
  • 在一些框架模板文件树中,不完整的版本,如AndroidManifest.xml、MyActivity.java等,带有类似于独立于语言的#include语法,指示文件中的数据将进入其中
  • 同样,在模板文件树中,src/中包含“缺少文件”的目录将在生成时从文件中动态复制
  • 文件的某种构建指令脚本,指示当包含此附加组件时,到t