【问题标题】:Android Studio stale APK for build variant after xml changesxml 更改后用于构建变体的 Android Studio 陈旧 APK
【发布时间】:2015-10-25 00:01:29
【问题描述】:

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

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

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

编辑: 很难确定这背后的行为——有时我注意到它始终只影响某些 xml 文件。看起来这家伙也有同样的问题:Android Studio project build issue

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

【问题讨论】:

    标签: android android-studio android-xml


    【解决方案1】:

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

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

    步骤:(来自here

    1. 在 Android Studio 中,单击 Run 按钮左侧的下拉列表,然后选择 Edit configurations...
    2. 点击 Android 应用下的应用,在常规选项卡中找到标题“启动前”
    3. 点击+按钮,选择运行外部工具,在弹出的窗口中点击+按钮。
    4. 给出一些名称(例如 adb 卸载)和描述,然后在 Program: 中键入 adb,在 Parameters: 中键入 uninstall <your-package-name>。 确保在弹出窗口中单击“确定”时选择了新项目。

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

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

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

    【讨论】:

    • 谢谢,是的,这样的事情可能是我唯一的选择:/
    • 有赏金:D 我不认为我可以将其标记为答案,因为我仍然需要访问持久存储等。
    • 我完全明白。感谢您的赏金!我会密切关注实际解决方案,如果遇到任何问题,请务必告知您。
    【解决方案2】:

    实际上,我不久前就发现了这个问题,而且非常微妙。我的项目构建了具有主要源集的变体以及每个变体的源集。它的定义有点像这样:

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

    【讨论】:

      猜你喜欢
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 2015-02-17
      • 1970-01-01
      • 2021-01-06
      • 2022-10-25
      • 1970-01-01
      相关资源
      最近更新 更多