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

时间:2015-10-25 00:01:29

标签: android android-studio android-xml

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

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

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

修改 确定这背后的行为非常困难 - 有时候我注意到它一直只影响某些xml文件。看起来这个人有同样的问题:Android Studio project build issue

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

2 个答案:

答案 0 :(得分:1)

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

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

步骤:(来自here

  1. 在Android Studio中,单击“运行”按钮左侧的下拉列表,然后选择“编辑配置...”
  2. 点击Android应用下的应用,然后在常规标签中找到标题'在发布之前'
  3. 单击+按钮,选择运行外部工具,单击弹出窗口中的+按钮。
  4. 提供一些名称(例如adb uninstall)和说明,并在Program:中输入adb,在参数:中输入uninstall <your-package-name>。 在弹出窗口中单击“确定”时,确保选中了新项目。
  5. 注意:如果您的PATH环境变量中没有adb,请在Program:字段中提供adb的完整路径(例如/ home / user / android / sdk / platform-tools / adb)。

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

    让我知道它对你有用。

答案 1 :(得分:1)

我实际上刚刚在这里发现了这个问题,而且非常微妙。我的项目具有构建变体,其中包含主要源集以及每个变体的源集。它的定义有点像这样:

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