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?
Related
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!
I have a multi-module project with a few Android apps and Android Library modules. It looks something like this:
├── awesomeapp (Android App)
├── coolapp (Android App)
└── modules
├── usefulprojectA (Android Lib)
└── usefulprojectB (Android Lib)
Both awesomeapp and coolapp depend on library modules:
implementation project(':modules:usefulprojectA:')
implementation project(':modules:usefulprojectB:')
What I would like to do is be able to say something like:
./gradlew awesomeapp:lint
or even
./gradlew awesomeapp:build
And have the lint task execute on awesomeapp and on both usefulprojectA and usefulprojectB.
Currently the lint task would only apply to the top level project, i.e., awesomeapp. So if I wanted to Lint the subprojects I'd have to call the lint task on the subproject directly:
./gradlew modules:usefulprojectA:lint
./gradlew modules:usefulprojectB:lint
Plus call the main project:
./gradlew awesomeapp:lint
But that's clumsy and will make my build script longer in both time and size.
So how does one apply the Lint task to subprojects too?
You can check module and it's dependencies by adding checkDependencies true to your lintOptions:
android {
lintOptions {
checkDependencies true
}
}
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"
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
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.