How to write build time stamp into apk

后端 未结 10 622
别跟我提以往
别跟我提以往 2020-12-02 07:57
  1. Making some changes in Android Contacts package
  2. Using mm (make) command to build this application

Because I have to change and

相关标签:
10条回答
  • 2020-12-02 07:58

    in your build.gradle:

    android {
        defaultConfig {
            buildConfigField 'String', 'BUILD_TIME', 'new java.text.SimpleDateFormat("MM.dd.yy HH:mm", java.util.Locale.getDefault()).format(new java.util.Date(' + System.currentTimeMillis() +'L))'
        }
    }
    
    0 讨论(0)
  • 2020-12-02 07:59

    I use the same strategy as Pointer Null except I prefer the MANIFEST.MF file. This one is regenerated even if a layout is modified (which is not the case for classes.dex). I also force the date to be formated in GMT to avoid confusion between terminal and server TZs (if a comparison has to be made, ex: check latest version).

    It result in the following code:

      try{
         ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(), 0);
         ZipFile zf = new ZipFile(ai.sourceDir);
         ZipEntry ze = zf.getEntry("META-INF/MANIFEST.MF");
         long time = ze.getTime();
         SimpleDateFormat formatter = (SimpleDateFormat) SimpleDateFormat.getInstance();
         formatter.setTimeZone(TimeZone.getTimeZone("gmt"));
         String s = formatter.format(new java.util.Date(time));
         zf.close();
      }catch(Exception e){
      }
    
    0 讨论(0)
  • 2020-12-02 07:59

    For time stamping and versioning, build.gradle/android/defaultConfig:

    def buildDateStamp = new Date().format("yyyyMMdd").toInteger()
    versionCode buildDateStamp
    versionName "$buildDateStamp"
    buildConfigField "String", "BUILD_DATE_STAMP", "\"$buildDateStamp\""
    

    Usage in code: BuildConfig.BUILD_DATE_STAMP

    resValue "string", "build_date_stamp", "$buildDateStamp"
    

    Usage in xml: "@string/build_date_stamp"

    Caveat: adding HHmm will cause errors (probably integer overflow)

    0 讨论(0)
  • 2020-12-02 08:03

    So Android Developer - Android Studio User Guide - Gradle Tips and Recipes - Simplify App Development actually documents what to add in order to have a release timestamp available to your app:

    android {
      ...
      buildTypes {
        release {
          // These values are defined only for the release build, which
          // is typically used for full builds and continuous builds.
          buildConfigField("String", "BUILD_TIME", "\"${minutesSinceEpoch}\"")
          resValue("string", "build_time", "${minutesSinceEpoch}")
          ...
        }
        debug {
          // Use static values for incremental builds to ensure that
          // resource files and BuildConfig aren't rebuilt with each run.
          // If they were dynamic, they would prevent certain benefits of
          // Instant Run as well as Gradle UP-TO-DATE checks.
          buildConfigField("String", "BUILD_TIME", "\"0\"")
          resValue("string", "build_time", "0")
        }
      }
    }
    ...
    

    In your app code, you can access the properties as follows:

    ...
    Log.i(TAG, BuildConfig.BUILD_TIME);
    Log.i(TAG, getString(R.string.build_time));
    

    I'm including this here since all of the other solutions appear to be from before the official example.

    0 讨论(0)
  • 2020-12-02 08:04

    I know this is really old, but here's how I did it using ant within eclipse:

    build.xml in project root

    <project name="set_strings_application_build_date" default="set_build_date" basedir=".">
        <description>
            This ant script updates strings.xml application_build_date to the current date
        </description>
    
        <!-- set global properties for this build -->
        <property name="strings.xml"  location="./res/values/strings.xml"/>
    
        <target name="init">
            <!-- Create the time stamp -->
            <tstamp/>
        </target>
    
        <target name="set_build_date" depends="init" description="sets the build date" >
    
            <replaceregexp file="${strings.xml}"
                match="(&lt;string name=&quot;application_build_date&quot;&gt;)\d+(&lt;/string&gt;)"
                replace="&lt;string name=&quot;application_build_date&quot;&gt;${DSTAMP}&lt;/string&gt;" />
    
        </target>
    </project>
    

    Then add an application_build_date string to your strings.xml

    <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
        <string name="app_name">your app name</string>
        <string name="application_build_date">20140101</string>
        ...
    </resources>
    

    Ensure the ant script is executed as a pre-build activity and you will always have a valid build date available to you within R.string.application_build_date.

    0 讨论(0)
  • 2020-12-02 08:07

    Since API version 9 there's:

    PackageInfo.lastUpdateTime

    The time at which the app was last updated.

    try {
        PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        //TODO use packageInfo.lastUpdateTime
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    

    On lower API versions you must make build time yourself. For example putting a file into assets folder containing the date. Or using __ DATE__ macro in native code. Or checking date when your classes.dex was built (date of file in your APK).

    0 讨论(0)
提交回复
热议问题