安卓工作室陈旧APK在xml更改后生成变体

这是一个非常奇怪的。 今天AS(1.4)停止正确的重新创build我的项目中的debuggingapk:

  • 运行项目时,任何XML更改都不会反映在代码中
  • Java代码的变化正在传播,即使XML更改不是
  • 清洗 ,然后按运行似乎修复它,一个更新的APK每次成功创build。
  • 我的项目中有两个构build变体, 这个问题只影响其中的一个
  • 我正在使用Genymotion,但常规模拟器和硬件上也存在此问题。
  • 我怀疑在xml文件上有一些锁。 例如,如果我重命名一个文件并点击运行,更改传播。 但是检查R.java会显示旧文件名和新文件名 – 旧的文件名不会被清除/刷新。
  • 我正在testing这个xml布局,现在已经被剥离回到一个空白的背景颜色的相对布局。 应该是颜色不更新。

我不太了解构build过程,因此我所尝试的只是删除构build文件夹,重新导入Android Studio上的项目和旧的重新启动/无效caching。 有什么build议可能会导致这种奇怪的行为或如何解决它?

编辑:这是很难确定这背后的行为 – 有时我已经注意到它始终只影响某些XML文件。 看起来这个人有相同的问题: Android Studio项目build设问题

我花了几个小时从头重新安装Android Studio,问题依然存在。

丹尼尔,我也自己也注意到了这个问题。 似乎有些更改根本不会传播,除非ADB检测到应用程序当前未安装在目标设备上。

免责声明:这是一个解决方法,而不是对行为的解释,但它适用于我。 为了解决这个问题,我configuration了我的运行configuration,在再次安装之前卸载相关软件包。 请注意,卸载APK显然会影响数据库,来自首选项的持久性数据等,所以如果您的开发过程依赖于这些,请不要使用它。

步骤:(从这里 )

  1. 在Android Studio中,单击运行button左侧的下拉列表,然后select编辑configuration…
  2. 点击Android应用程序下的应用程序,然后在常规选项卡中,find标题“启动前”
  3. 点击+button,select运行外部工具,点击popup窗口中的+button。
  4. 给一些名称(例如adb卸载)和描述,然后在程序中inputadb ,然后在参数:中uninstall <your-package-name> 。 确保在popup窗口中单击确定时select新项目。

注意:如果PATH环境variables中没有adb,请在Program:字段中给出adb的完整path(例如/ home / user / android / sdk / platform-tools / adb)。

再次,抱歉,这不是对问题本身的解释,但是这绝对可以解决这个问题。

让我知道它是如何为你工作的。

其实我前面已经知道这个问题了,而且非常微妙。 我的项目已经构build了一个主要源集的变体以及每个变体的源集。 它的定义是这样的:

 sourceSets { def defaultDirectory = "src/main/" def flavorADirectory = "src/flavor_a/" flavor_a { java.srcDirs = [defaultDirectory + 'java', flavorADirectory + 'java'] res.srcDirs = [defaultDirectory + 'res', flavorADirectory + 'res'] manifest.srcFile flavorADirectory + 'AndroidManifest.xml' } def flavorBDirectory = "src/flavor_b/" flavor_b{ java.srcDirs = [defaultDirectory + 'java', flavorBDirectory + 'java'] res.srcDirs = [defaultDirectory + 'gift', flavorBDirectory + 'res'] manifest.srcFile flavorBDirectory + 'AndroidManifest.xml' } } 

所以变体编译好,但每一个XML更改触发一个完整的重build。 我不确定背后的确切原因,但我相信主要的源代码集必须被指定为一个单独的实体。 Android Studio必须看到main关键字,并更好地了解如何处理它。 这意味着没有必要指定默认目录作为构build变体源集的一部分删除就像这样,使问题消失,不会发生更多的不断重build:

  sourceSets { def defaultDirectory = "src/main/" main { java.srcDirs = [defaultDirectory + 'java'] res.srcDirs = [defaultDirectory + 'res'] } def flavorADirectory = "src/flavor_a/" flavor_a { java.srcDirs = [flavorADirectory + 'java'] res.srcDirs = [flavorADirectory + 'res'] manifest.srcFile flavorADirectory + 'AndroidManifest.xml' } def flavorBDirectory = "src/flavor_b/" flavor_b{ java.srcDirs = [flavorBDirectory + 'java'] res.srcDirs = [flavorBDirectory + 'res'] manifest.srcFile flavorBDirectory + 'AndroidManifest.xml' } }