multiple app version, 1 code base - android

So I have an app that would require to versions with different settings, assets etc but uses the same code base so it will generate two apks. I really have no idea how to do it in gradle. can anyone please point me to a site or a technique in which i can do this? thanks.

Start witch adding product flavors to your build.gradle script and set proper ids
productFlavors {
appOne{
applicationId 'com.app.one'
}
appTwo{
applicationId 'com.app.two'
}
}
When that's done create folders in your src directory called
appOne and appTwo. In those folders you can specify version specific stuff like drawable folders, manifest...
When that's done, remember to choose right build variant in buildvariants menu

Related

How to merge two different projects that are already in playstore using flavors

The problem i am facing is there is two project(apps) similar and there will be more in future and when i change a code in one i will need to do same changes in other projects. when i searched on web i found product flavors but not sure if it's the answer for my problem.
How can i merge two different projects (apps) in playstore. Projects codes are %85 similar can i use flavors to merge both project in one and will i be able to update them in playstore using different jks with different package names and a few different permissions. Will i need AndroidManifest file for each flavor.
How can i solve this problem. Thanks
To change packageName you have to create product Flavor like
flavorDimensions "versionCode"
productFlavors {
doctorApp {
dimension "versionCode"
applicationId "com.doctor.app"
}
patientApp {
dimension "versionCode"
applicationId "com.patient.app"
}
}
After that create two sibling folder of main after switch project View to Project
app -> src -> main /// write all common classes here
app -> src -> doctorApp // doctor related classes here along with their resources
app -> src -> patientApp // patient related classes here along with their resources
create same package name and res folder under patientApp and doctorApp

Different code in different build variant

I have two build variants in my app, one is an standard app edition and the second one is a customization app.
productFlavors {
customConfig {
minSdkVersion 14
applicationId 'es.com.custom'
targetSdkVersion 22
versionCode 3
versionName '3.0.0'
}
standard {
minSdkVersion 14
applicationId 'es.com.standard'
targetSdkVersion 22
versionCode 3
versionName '3.0.0'
}
For the customization I have to implement new features, but just for the customization, so those new features will be not available on the standard version. I am not sure what i have to do.
1.- Two classes , one with the standard requirements and one with the custom requirements
2.- In the standard class do something like:
if (getPackageName()==customConfig )
// do the custom things
else
//do the standard things
Build variants are the result of Gradle using a specific set of rules
to combine settings, code, and resources configured in your build
types and product flavors. Although you do not configure build
variants directly, you do configure the build types and product
flavors that form them.
if(BuildConfig.Flavor.equals("customConfig"))
{
}
else
{
}
Read Building multiple flavors of an Android
You must create source directories for each flavor.
So you will be able to maintain a separate file for the specific flavor.
Please go through the link that will help you.
You can do this in one simple way. You should have a folder named "standard" right now in your project. Just create another folder named "customConfig" (Or it might have been created once the gradle synchronizes) in the same folder where the "standard" folder is.
In your "customConfig" create another folder called "res" (Again you might have it already). Then create another folder "values". In "values" folder you can create your value file. Name the file 'values.xml' and return back to your project. You "values.xml" file should be like this:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="custom_app_id">es.com.custom</string>s
</resources>
Now in your code you can check which variable environment you are in:
if (getPackageName().equals(getString(R.string.custom_app_id)))// for custom
// do the custom things
else
//do the standard things
Hope this help!

How to Build different APK files using different databases in Android using Gradle tool?

We have a platform to read poetry with a SQLITE Database say SHAKESPEARE.DB .
We also have another poetry say Wordsworth.DB.
So for each poetry database we want to create a separate application like Shakespeare.apk and wordsworth.apk.
During build we want to mention the Database and mention the name of the APK.
How do we Change Database during android build through gradle and deploy different APK's
I would want to Create and Deploy Database specific APK using Gradle ?
Step #1: Use a consistent means of embedding the database in the app. For this answer, I will assume that you are using SQLiteAssetHelper, with the database packaged as words.db in assets/.
Step #2: Create two product flavors for your app in your app/ module's build.gradle file. For this answer, I will call these flavors vanilla and chocolate:
productFlavors {
vanilla {
applicationId "com.commonsware.android.gradle.hello.vanilla"
}
chocolate {
applicationId "com.commonsware.android.gradle.hello.chocolate"
}
}
(replace the applicationId values with ones more relevant to your project)
Step #3: Create a sourceset for each flavor (app/src/vanilla, app/src/chocolate/).
Step #4: Put a different words.db in assets/ of the flavor (app/src/vanilla/assets/words.db, app/src/chocolate/assets/words.db).
Now, when you build vanilla, it will use the vanilla edition of words.db. When you build chocolate, it will use the chocolate edition of words.db. No Java code changes are required. You can also put different resources in those flavor-specific sourcesets, for different icons, labels, etc. Because you have different applicationId values, both flavors can be installed on your test devices at the same time, and both flavors can be distributed through app distribution channels like the Play store.

Generate multiple APK from one single project

I'm trying to understand how i can generate multiple APK from one single project.
I'm using gradle and this is my project's three:
ambrogiocore is the core library module that implements all the common classes and resources.
ambrogioremote is the module that has the :ambrogiocore dependence.
It's work. Now i'm able to generate multiple APK. (just one at the moment)
One apk for each module.
The problem is that i need to manually sync all the AndroidManifest.xml for every future module that i'll include in my project.
Is this the correct way?
Can i automate this operation?
I took a look at productFlavor. Just I don't understand if this tool can help me.
What do you think about?
THANK YOU ALL!
**SOLUTION**
Finally! I found the same solution proposed by #Kai!
Flavor is the way!
This is the best approach for a lots of reasons:
Single-module project
You don't need to copy XML files
RoboGuice will work like a charm. (RoboGuice presents some BIG problem on library projects)
http://www.techotopia.com/index.php/An_Android_Studio_Gradle_Build_Variants_Example
If by "one single source core and multiple project that extends "ProductName", "PackageName" and "resources"" you mean to provide each flavor with unique "ProductName", "PackageName" and "resources", then yes it can be done.
To give each flavor its own unique package, set applicationId for each of your flavors like so:
android {
productFlavors {
flavor_1 {
applicationId = 'com.app.flavor_1'
}
flavor_2 {
applicationId = 'com.app.flavor_2'
}
}
}
To give each flavor its own app name and resources, simply put them in a flavor's own directory, Gralde will merge a flavor's resources with your base resources to create a complete one.
For more detail on how Gralde flavors work, please see Gradle Plugin User Guide
This is my final solution!
All the common files, manifest and base resources are under "src/main"
I moved my projects inside "src/projects"
declared two productFlavor (one per project) specifying applicationId and versionName
created two sourceSet (one per project) indicating the specific res folder.

Different Android Builds For Different Environments

I'd like to be able to build and install multiple versions of my app (concurrently), targeting different environments such as Development, Staging and of course Production.
The package name in the AndroidManifest.xml seems to be the major hurdle here, as it is what uniquely identifies the app. I thought it would be possible to simply switch between com.mydomain.prod, com.mydomain.staging and com.mydomain.dev or some sort of similar convention but so far I've had no luck coming up with a package structure that works for this approach.
What strategy can I employ to do this with as little pain as possible?
With Gradle you can specify different "flavors" of your application. This is done in your build.gradle:
android {
// …
defaultConfig {
// …
}
productFlavors {
prod
applicationId "com.mydomain.prod"
}
staging {
applicationId "com.mydomain.staging"
}
dev {
applicationId "com.mydomain.dev"
versionCode 2
}
}
}
Each flavor properties are inherited from defaultConfig.
Now, in the src directory of your app, you can create directories with flavor-specific code/resources in it:
app/
|-- src/
|-- main/
|-- prod/
|-- staging/
|-- dev/
These links might be useful:
How to build customized Android application using Gradle
Gradle Build Variants for your android project
I suggest you use the 'ant' build tool specificaly the 'regexp' task which can be used in order to replace text in certain files (i.e replace your app's package name in the manifest file according to the proper build target). You can also define differnet properties file for each build target (e.g 'build_development.properties' to hold all parameters relevant for building your product for development env.)... hope this is helpful..

Categories

Resources