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

Dan*_*son 10 android android-xml android-studio

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

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

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

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

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

Dan*_*son 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'
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,变体编译得很好,但每个 xml 更改都会触发完整的重建。我不确定其背后的确切原因,但我相信 mainsourceset必须被指定为一个单独的实体。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'
    }
}
Run Code Online (Sandbox Code Playgroud)