Build system improvements

1. Sign the release apk if configured to do it

By default the build will not sign the release apk, but if you define
the right properties it will.  Create a ~/.gradle/gradle.properties file
with these properties: releaseKeystoreFile, releaseKeystorePassword,
releaseKeyAlias, and releaseKeyPassword.

For example:

releaseKeystoreFile=/Users/tcabot/release-keystore
releaseKeystorePassword=k3yst0r3
releaseKeyAlias=affdexme
releaseKeyPassword=k3y

2. Allow debug builds to coexist with releases

The debug build has a different id (com.affectiva.affdexme.debug) so
android treats it as a completely different app.  By default, though,
both apps look the same on the app launch screen so the debug version is
now called AffdexMeDbg so you can have both at the same time and be able
to tell which is which.

3. Make the apk filename more descriptive

It was just "app-debug.apk" or "app-release.apk".  This commit changes
the "app" to "AffdexMe" and adds the human-readable versionName and
integer versionCode to the filename.

I would have liked the filename to track the cosmetic name (i.e., have
the debug file be called "AffdexMeDbg-....apk") but that turned out to
be surprisingly difficult given the way the build system is set up.  I
think it should be possible but this is the best bang for the buck for
the amount of effort I'm willing to put in at this point.
This commit is contained in:
toby cabot 2016-01-06 18:21:27 -05:00
parent 9428e74d2b
commit f542f7c519
3 changed files with 90 additions and 29 deletions

View file

@ -10,9 +10,15 @@ android {
targetSdkVersion 22 targetSdkVersion 22
versionCode 14 versionCode 14
versionName "2.0.0" versionName "2.0.0"
setProperty("archivesBaseName", "AffdexMe-$versionName-$versionCode")
} }
buildTypes { buildTypes {
debug {
resValue 'string', 'app_name', 'AffdexMeDbg'
applicationIdSuffix ".debug"
}
release { release {
resValue 'string', 'app_name', 'AffdexMe'
minifyEnabled true minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} }
@ -42,3 +48,18 @@ dependencies {
//compile 'com.google.android.gms:play-services:7.5.0' //compile 'com.google.android.gms:play-services:7.5.0'
} }
// build a signed release apk only if the environment is configured
// with the properties that let us access the keystore. you can put
// them into ~/.gradle/gradle.properties
if (project.hasProperty('releaseKeystoreFile')) {
android.signingConfigs {
release {
storeFile file(releaseKeystoreFile)
storePassword releaseKeystorePassword
keyAlias releaseKeyAlias
keyPassword releaseKeyPassword
}
}
android.buildTypes.release.signingConfig = android.signingConfigs.release
}

View file

@ -1,16 +1,58 @@
# Add project specific ProGuard rules here. # This is a configuration file for ProGuard.
# By default, the flags in this file are appended to flags specified # http://proguard.sourceforge.net/index.html#manual/usage.html
# in /Users/AlanCasalas/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here: -dontskipnonpubliclibraryclasses
#prevent proguard from warning us about not including the GooglePlay dependency # Optimization is turned off by default. Dex does not like code run
-dontwarn ** # through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
native <methods>;
}
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontwarn android.support.**
#keep all classes (otherwise Proguard may remove classes that use reflection, injection, Gson, etc...) #keep all classes (otherwise Proguard may remove classes that use reflection, injection, Gson, etc...)
-keep class sun.** -keep class sun.**
@ -22,22 +64,22 @@
-keep class javax.** -keep class javax.**
-keepclassmembers class javax.** {*;} -keepclassmembers class javax.** {*;}
#keep certain class members (otherwise Proguard would strip the members of these classes) #keep certain class members (otherwise Proguard would strip the members of these classes)
-keep class com.** -keep class com.**
-keepclassmembers class com.affectiva.android.affdex.sdk.detector.A* { *; } -keepclassmembers class !com.affectiva.affdexme.MainActivity,!com.affectiva.android.affdex.sdk.detector.Detector {*;}
-keepclassmembers class com.affectiva.android.affdex.sdk.detector.B* { *; } -keepclassmembers class com.affectiva.android.affdex.sdk.detector.Detector {
-keepclassmembers class com.affectiva.android.affdex.sdk.detector.I* { *; } public void setDetect**;
-keepclassmembers class com.affectiva.android.affdex.sdk.detector.L* { *; }
-keepclassmembers class com.affectiva.android.affdex.sdk.Frame { *; }
-keepclassmembers class com.affectiva.affdexme.DrawingView {*;}
-keepclassmembers class com.affectiva.affdexme.MetricView {*;}
-keepclassmembers class com.affectiva.affdexme.GradientMetricView {*;}
-keepclassmembers class * {
@javax.inject.* *;
@dagger.* *;
<init>();
} }
# Dagger
-dontwarn dagger.internal.codegen.**
-keepclassmembers,allowobfuscation class * {
@javax.inject.* *;
@dagger.* *;
<init>();
}
-keep class dagger.* { *; }
-keep class javax.inject.* { *; }
-keep class * extends dagger.internal.Binding
-keep class * extends dagger.internal.ModuleAdapter
-keep class * extends dagger.internal.StaticInjection

View file

@ -1,6 +1,4 @@
<resources> <resources>
<string name="app_name">AffdexMe</string>
<!--MainActivity strings--> <!--MainActivity strings-->
<string name="not_found">Sorry, AffdexMe requires the use of a front-facing camera, which was not found on your device.</string> <string name="not_found">Sorry, AffdexMe requires the use of a front-facing camera, which was not found on your device.</string>
<string name="affectiva_logo_content_description">Affectiva Logo</string> <string name="affectiva_logo_content_description">Affectiva Logo</string>