32

是否可以以编程方式读取我的 Android apk 的构建日期?我在 PackageInfo 类中找不到任何内容。

我想使我的应用程序的 beta 版本过期,最简单的方法是读出这样的日期并在几天的修复前使其过期,因此我不必每次构建和部署时都更新代码测试版。

4

1 回答 1

63

注意 2020 年 6 月 1 日:Android Studio 4.1 Canary 10 w/Gradle >= 6.5 已更新说明。如果您看到 "Unsupported BuildConfig type : java.util.Date错误,请向下滚动以进行修复。

[旧说明]

build.gradle中,您的每个构建类型都应该有一个buildConfigField. (这是配置的简化版本——你可能在这里有其他东西,但我想展示你把它放在哪里):

android {
    signingConfigs {
        buildTypes {
            debug {
                buildConfigField "java.util.Date", "BUILD_TIME", "new java.util.Date(" + System.currentTimeMillis() + "L)"
            }
            release { 
                buildConfigField "java.util.Date", "BUILD_TIME", "new java.util.Date(" + System.currentTimeMillis() + "L)"
            }
        }
    }
}    

(请注意,“ BuildConfigField”是0.8.0 构建系统中“ ”的较新版本。)BuildConfigLine

下次 gradle 执行 assembleRelease 或 assembleDebug 时,它应该生成:

./build/source/buildConfig/releaseORdebug/com/your/project/BuildConfig.java

接下来,在该BuildConfig文件中,您应该会看到自动生成的内容,例如:

public final class BuildConfig {
    public static final java.util.Date BUILD_TIME = new java.util.Date(1395794838381L);
}

因此,要在您的应用程序中访问构建日期......

Date buildDate = BuildConfig.BUILD_TIME;
Log.i("MyProgram", "This .apk was built on " + buildDate.toString());

(您可以使用SimpleDateFormat随意格式化日期。)

2020 年 6 月 1 日更新——在 Android Studio 4.1 Canary 10 w/Gradle 6.5 中,上述解决方案导致“ Unsupported BuildConfig type : java.util.Date”错误。应使用对上述内容的轻微变化:

android {
    signingConfigs {
        buildTypes {
            debug {
                buildConfigField("String", "BUILD_TIME", System.currentTimeMillis().toString())
            }
            release { 
                buildConfigField("String", "BUILD_TIME", System.currentTimeMillis().toString())
            }
        }
    }
} 

2020 年 7 月 30 日更新 在 gradle 6.6-rc4 之后,您需要通过更改为以下行来包含当时的引号:

        buildConfigField("String", "BUILD_TIME", "\"" + System.currentTimeMillis().toString() + "\"")

BuildConfig文件中,您应该看到现在已经自动生成了一些内容,例如:

public final class BuildConfig {
      public static final String BUILD_TIME = "1590735284503";
}

所以现在,要在您的应用程序中访问构建日期......

private Date buildDate = new Date(Long.parseLong(BuildConfig.BUILD_TIME));
Log.i("MyProgram", "This .apk was built on " + buildDate.toString());

和以前一样,您可以使用SimpleDateFormat随意格式化日期。

希望这会有所帮助。

于 2014-03-26T01:06:04.357 回答