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

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.

Related

Gradle v4 to Gradle v5 Update - separate output directories for each JVM language

I'm looking to update Gradle from v4 to v5 but I'm getting the below warning on v4:
Gradle now uses separate output directories for each JVM language, but
this build assumes a single directory for all classes from a source
set. This behaviour has been deprecated and is scheduled to be removed
in Gradle 5.0.
So I believe I need to get rid of this warning before I can update to v5. Problem is I'm not really sure what it's asking me to do. How do I cahnge the build so that it doesn't assume a single directroy for all classes from a source set?
I tried adding the below to the build.gradle but I'm still getting the warning:
sourceSets {
main {
// Compiled Java classes should use this directory
java.outputDir = new File(buildDir, "classes/java/main")
}
}
You don't need to add anything to the build script.You just need to organize your project like this:
├── build.gradle
├── settings.gradle
└── src
└── main
├── java
│ └── HelloWorld.java
└── kotlin
└── Utils.kt
That deprecation message is shown when you use sourceSet.output.classesDir, which returns a File.
This has been replaced in Gradle 4.x, and removed in Gradle 5.x, by sourceSet.output.classesDirs (note the s at the end) which returns a FileCollection.
So you need to figure out where you use that in your buildscript and if not which plugin does. Note that the new method is already available in Gradle 4.x and so you should be able to upgrade your code or plugin version to make the deprecation message go away.
Good hunting!

Android: whitelabel app with a debug directory per each flavor

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

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"

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

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