Android Studio陈旧APK for xml更改后的构建变体

这是一个非常奇怪的。 今天AS(1.4)在我的项目中停止正确地重新创建调试apk:

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

我对构建过程并不是很了解,所以我所尝试的只是删除构建文件夹,在Android Studio上重新导入项目和旧的重启/无效缓存。 关于什么可能导致这种奇怪的行为或如何修复它的任何建议?

编辑:很难确定这背后的行为 – 有时我注意到它一直只影响某些xml文件。 看起来这个家伙有同样的问题: Android Studio项目构建问题

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

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

免责声明:这是一种解决方法,而不是对行为的解释,但它适用于我。 为了解决这个问题,我在重新安装之前配置了我的运行配置来卸载有问题的软件包。 请注意,卸载APK显然会影响数据库,首选项中的持久数据等内容,因此如果您的开发过程依赖于这些,请不要使用它。

步骤:(从这里 )

  1. 在Android Studio中,单击“运行”按钮左侧的下拉列表,然后选择“编辑配置…”
  2. 单击Android应用程序下的应用程序,然后在常规选项卡中find标题’发布前’
  3. 单击+按钮,选择Run external tool,单击popup窗口中的+按钮。
  4. 给出一些名称(例如adb uninstall)和描述,然后在Program:中键入adb ,并在Parameters:中uninstall 。 在popup窗口中单击“确定”时,确保选中了新项目。

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

再次,对不起,这不是问题本身的解释,但这肯定解决了我的问题。

让我知道它对你有用。

我实际上在一段时间之前就已经find了这个问题而且非常微妙。 我的项目具有构建变体,其中包含主要源集以及每个变体的源集。 它的定义有点像这样:

 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的变化都会触发一个完整的重建。 我不确定它背后的确切推理,但我认为主要的sourceset必须指定为一个单独的实体。 Android Studio必须查看main关键字并更好地了解如何处理它。 这意味着不需要将默认目录指定构建变体源集的一部分。删除它就像这样,使问题消失并且不再发生常量重建:

  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' } }