Android: whitelabel app with a debug directory per each flavor - android

I am creating some app with multiple branding variations. One of the requirements is that we deliver 2 environments per client, so I need to have one release build per client for debug and release.
The code in build gradle file is
android {
...
buildTypes {
release {
minifyEnabled false
}
debug {
applicationIdSuffix ".debug"
}
}
flavorDimensions "branding"
productFlavors {
mainCompany {
dimension "branding"
applicationIdSuffix ".mainCompany"
}
client1 {
dimension "branding"
applicationIdSuffix ".client1"
}
client2 {
dimension "branding"
applicationIdSuffix ".client2"
}
client3 {
dimension "branding"
applicationIdSuffix ".client3"
}
}
The directory structure tree is:
.
├── androidTest
│   └── java
├── client1
│   └── res
├── client2
│   └── res
├── client3
│   └── res
├── debug
│   └── res
├── main
│   ├── AndroidManifest.xml
│   ├── java
│   └── res
├── mainCompany
│   └── res
└── test
└── java
And the question is, how do I create a debug folder per client? Such folder should have just the app icon and the strings with only the app title

It seems this was a stupid question. At the end, I found the solution in the android docs. Problem was I didn't know how to search this correctly :(
Here is the piece of doc that answers my question.
And the folders in my case should be called:
client1Debug
client2Debug
client3Debug
mainCompanyDebug
And this works exactly as I expected

Related

I already registered in Dailymotion and create apiKey, then how do I generate sampleapp.properties file?

There is a block code in build.gradle file:
Properties props = new Properties()
props.load(new FileInputStream("sampleapp.properties"))
buildConfigField "String", "apiKey", props.getProperty("apiKey")
buildConfigField "String", "apiSecret", props.getProperty("apiSecret")
buildConfigField "String", "defaultLogin", props.getProperty("defaultLogin")
buildConfigField "String", "defaultPassword", props.getProperty("defaultPassword")
I clone dev version from github, and when I open the sampleapp in Android studio, gradle building failded because of missing sampleapp.properties file.
I already registered in Dailymotion and created a apiKey for my application.
Now my question is how to generate a sampleapp.properties file so that gradle building would be successful?
Thank you.
Use project.rootProject if you are reading the properties file in a sub-project build.gradle:
Properties props = new Properties()
props.load(project.rootProject.file('sampleapp.properties').newDataInputStream())
// your code goes here
Project structure
.
├── app
│ ├── build.gradle <-- You are reading the sampleapp.properties in this gradle build file
│ └── src
├── build.gradle
├── gradle
├── gradlew
├── settings.gradle
└── sampleapp.properties
UPDATE
Your sample.properties file should look like shown below, just with your own values:
apiKey="yourKey"
apiSecret="yourSecret"
defaultLogin="yourLogin"
defaultPassword="yourPassword"

access Properties file located in app folder in src file in android

I want to access a property file from a module root, but failed to find any suitable example to access the property file as many only tells how to access from asset in android. My app structure is as follows,
├── app
│ ├── key.properties <--It is my property file, which contains app keys,to be used in app
│ └── src <-- Here i want to access the key.properties to access some keys
├── build.gradle
├── gradle
├── gradlew
├── gradlew.bat
├── settings.gradle
└── local.properties
Mike M is correct in that you should use gitignore to hide your file from git so it won't be pushed on your repository.
To expand a bit on this, here's a solution to have gradle load your properties during the build, and make them available to your app via BuildConfig.
1/ app/build.gradle
Before the android { ... } plugin, add:
Properties props = new Properties()
try {
props.load(file('keys.properties').newDataInputStream())
} catch (Exception ex) {
throw new GradleException("Missing keys.properties file.");
}
2/ app/build.gradle
In your buildTypes config, add
buildTypes {
debug {
buildConfigField "String", "KEY_MY_PROP", "\"${props.getProperty("myPropKey")}\""
}
release {
buildConfigField "String", "KEY_MY_PROP", "\"${props.getProperty("myPropKey")}\""
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
3/ Any class in your app
Your key is accessible as BuildConfig.KEY_MY_PROP

Android Studio 1.0.2 proguard rules

I imported an Eclipse project into Android Studio and now I'm trying to revive the proguard part. I have the following in build.gradle:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
and now the questions are:
where and how do I add the file proguard-android.txt and proguard-rules.txt?
The syntax/format of this file in ADT is the same as it was in Eclipse?
I now noticed that I also have cannot resolve symbol 'getDefaultProguardFile'
Here you can find some more information on what getDefaultProguardFile() does. In essence, Android provides two Proguard files for you to use, one with optimizations, one without.
As for your custom proguard-rules.txt file, put it (if it isn't already there) in the same place where your build.gradle file of your App is located. See the SeriesGuide repository for an example.
Edit
Your directory structure (as can be seen in the SeriesGuide repo linked above) should be something like this (directories like src/ have been omitted):
.
├── app
│   ├── build.gradle # this is probably where you defined android { . . . }
│ │ # and thus `proguardFiles`
│   └── proguard-project.txt
└── build.gradle # setting up buildscript, maven repositories etc

How to exclude a jar-file from my Android library build target

I am using Android Studio and have a several apps that rely on the same code. I moved shared code to a separate library in order to include it in my apps.
The library project (MyLib) that I created for this purpose requires a jar-file to compile, so I added it to project's libs directory.
My build.gradle of MyLib main module looks like this:
apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "20.0.0"
defaultConfig {
applicationId "com.example.android"
minSdkVersion 9
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
}
}
}
dependencies {
compile files('./libs/external-java-lib.jar')
}
When I build the project, gradle generates a jar-file that contains external-java-lib.jar.
I want my Android application projects to provide "external-java-lib.jar", not the MyLib. Because in my apps I may use different versions of external-java-lib.jar.
How do I configure Gradle to exclude external-java-lib.jar from the build of my library project?
I couldn't find the answer to my question on the net, so I have a feeling that the thing I want is a piece of bad design. What else can I do?
Thank you in advance.
I finally solved my problem.
In my library project I added another empty libraries module and moved external-java-lib.jar to its libs folder.
In the build.gradle of the main module, I added dependency:
dependencies {
compile project(':libraries')
}
My directory structure is now:
MyLibrary
├── build.gradle
├── gradle.properties
├── main
│   ├── build.gradle
│   └── src
│   └── main
│   ├── AndroidManifest.xml
│   ├── java ...
│   └── res ...
├── libraries
│   ├── build.gradle
│   ├── libs
│   │   ├── external-lib-1.jar
│   │   └── external-lib-2.jar
│   └── src
│   └── main
│   ├── AndroidManifest.xml
│   ├── java ...
│   └── res ...
└── settings.gradle
After I build the library, the output aar-package had no external-java-lib.jar in it. So, this is exactly what I want.
If you are not using proguard then you simply use provided tag
dependencies {
provided files('./libs/external-java-lib.jar')
}
i don not know about android studio but its easy in eclipse, in eclipse right click on the project-> properties->java build path there you have libraries and java build path. There you can exclude or include files.

Android Studio module that depends on another module's tests

I'm trying to get the Gradle Java plugin to execute jUnit tests that exist in an Android project. My solution was to create a second module that applies the Java plugin, and set the test sourceSet to the app module's src/test directory.
test-module's build.gradle:
apply plugin: 'java'
...
dependencies {
...
testCompile project(':app-module')
}
sourceSets {
test {
java.srcDirs += ["${appDir}/src/test/java"]
}
}
This works fine from the command line, but Android Studio refuses to import a project that has source sets outside the submodule. It throws the error: Can't register given path of type 'TEST' because it's out of content root.
.
├── app-module
│   ├── build.gradle
│   └── src
│   ├── main
│   └── test
├── test-module
│   └── build.gradle
├── build.gradle
└── settings.gradle
I tried configuring this from the parent build.gradle, but that didn't change anything. I can add app-module as a testCompile project dependency in test-module, but that doesn't cause test-module to add app-module's tests.
Any ideas for getting test-module to run app-module's tests without provoking Android Studio's limitation about remote source sets?

Categories

Resources