What are .iml files in Android Studio? - android-studio

What are .iml files in Android Studio project? I read that it is configuration file for modules. I do not understand how it works, and can't I just use gradle scripts to integrate with external modules that you add to your project.
Also, most of the time AS generates them, so I cannot control project behaviour. If I have a team that works in different IDEs like Eclipse and AS, is it possible to setup my project so it's IDE agnostic?
I don't fully understand how this system works.

What are iml files in Android Studio project?
A Google search on iml file turns up:
IML is a module file created by IntelliJ IDEA, an IDE used to develop Java applications. It stores information about a development module, which may be a Java, Plugin, Android, or Maven component; saves the module paths, dependencies, and other settings.
(from this page)
why not to use gradle scripts to integrate with external modules that you add to your project.
You do "use gradle scripts to integrate with external modules", or your own modules.
However, Gradle is not IntelliJ IDEA's native project model — that is separate, held in .iml files and the metadata in .idea/ directories. In Android Studio, that stuff is largely generated out of the Gradle build scripts, which is why you are sometimes prompted to "sync project with Gradle files" when you change files like build.gradle. This is also why you don't bother putting .iml files or .idea/ in version control, as their contents will be regenerated.
If I have a team that work in different IDE's like Eclipse and AS how to make project IDE agnostic?
To a large extent, you can't.
You are welcome to have an Android project that uses the Eclipse-style directory structure (e.g., resources and manifest in the project root directory). You can teach Gradle, via build.gradle, how to find files in that structure. However, other metadata (compileSdkVersion, dependencies, etc.) will not be nearly as easily replicated.
Other alternatives include:
Move everybody over to another build system, like Maven, that is equally integrated (or not, depending upon your perspective) to both Eclipse and Android Studio
Hope that Andmore takes off soon, so that perhaps you can have an Eclipse IDE that can build Android projects from Gradle build scripts
Have everyone use one IDE

Add .idea and *.iml to .gitignore, you don't need those files to successfully import and compile the project.

They are project files, that hold the module information and meta data.
Just add *.iml to .gitignore.
In Android Studio: Press CTRL + F9 to rebuild your project. The missing *.iml files will be generated.

Those files are created and used by Android Studio editor.
You don't need to check in those files to version control.
Git uses .gitignore file, that contains list of files and directories, to know the list of files and directories that don't need to be checked in.
Android studio automatically creates .gitingnore files listing all files and directories which don't need to be checked in to any version control.

Related

Library dependency in Android Studio

Is there a way to have library dependencies in Android Studio as conveniently as in Eclipse?
I have two libraries, the second one depends on the first one, and an app which depends on both libraries.
In Eclipse I had all the projects in one workspace and the dependencies defined. When a change was made in one library, that change was immediately available in the app's project.
In Android Studio, I included the generated aar files of the libraries in the app's project, which created a copy of the aar file in the app's project. When I make a change in a library, I have to regenerate the aar file and copy it to the correct folder of the app project.
There has to be a better way, right?

What is .idea folder in Android Studio 3.2.12?

I meet the problem Cannot resolve symbol AppCompatActivity
I solved the problem by deleting .idea folder and syncing project with gradle files by the acticle Cannot resolve symbol AppCompatActivity - Support v7 libraries aren't recognized?
Could tell me what .idea folder is ? Why can I delete it and sync ?
.idea folder is storing the settings for your IDE (Development Environment) - so the settings of Android Studio how to visualize your project.
You can check more about .idea folder here
The .idea folder (hidden on OS X) in the solution root contains IntelliJ's project specific settings files. These include per-project details such as VCS mapping and run and debug configurations, as well as per-user details, such as currently open files, navigation history and currently selected configuration.
Some files should be committed to source control, some should be excluded.
See here: https://rider-support.jetbrains.com/hc/en-us/articles/207097529-What-is-the-idea-folder-
It stores project specific settings that pertain to AndroidStudio. It is called .idea because AndroidStudio is derived from JetBrains' Intellij IDEA. Most if not all IDEs in this family create such a directory. For example, JetBrains' Rider, an IDE for writing .NET applications, also creates such a directory.
Basically it is for project scoped IDE configuration.

Android Studio referencing classes in an AAR published to local maven repo

I have a problem in Android Studio (3.1.2) referencing classes in an AAR published to my local maven repo.
I have successfully published an AAR file to my local maven repo and included it in a project that needs to use the AAR following this article:
https://medium.com/#kuassivi/tip-work-with-third-party-projects-locally-with-gradle-961d6c9efb02
Basically I have added a reference to mavenLocal() in the top level project in the repositories sections of buildscript and all projects. I have also added a reference to the AAR in the app gradle build (i.e. implementation groupid:artifactid:version). I have not done anything more than this.
If I do a gradle rebuild within Android Studio, everything compiles fine but if I edit a file that references classes in the AAR, the IDE cannot resolve the references.
When I do find class (i.e. cmd o), the IDE correctly finds the class within the classes.jar of the AAR and decompiles it.
I am guessing that this is happening partly because it cannot pick up the source jar that I published alongside the aar file to the local maven repo.
How do I get the IDE to pick up the source files and reference the classes in the AAR correctly? I would prefer to do this via a change in the gradle scripts rather than via an IDE wizard, if that is possible.
After more digging, I have discovered that the use of the maven repo is irrelevant because it is picking up the AAR file from the gradle cache in ~/.gradle/caches/transforms-1/files-1.1 not from the maven local repo. I can also include the sources files using "implementation com.company:artifact-name:0.8:sources". There is a good information here:
https://www.alonsoruibal.com/my-gradle-tips-and-tricks/
However Android Studio still cannot recognise the imports and though compilation works, the imports are marked in red in the editor. I guess there must be some magic with gradle that I am missing.
I put together a simple example on github here:
https://github.com/jmc420/kotlin_examples
In the multiproject folder there are 2 separate projects, one called "nested" which contains an android library project called "multiprojectlibrary" which "nested" references via a grade include.
The "multipleprojectlibrary" uses the maven publish plugin to publish the aar to mavenLocal via the command gradle publishToMavenLocal.
In the "independent" project "multipleprojectlibrary" is a dependency which is read from mavenLocal.
The "nested" project works reliably.
Using mavenLocal in the "independent" project seems very unreliable. Sometimes the "independent" project correctly uses the mavenLocal "multipleprojectlibrary" but when you make an update and publish again, the "independent" project starts using a copy of "multipleprojectlibrary" in .gradle/caches/transforms-1/files-1.1.
There seem to be 2 issues. One is that the "New Project" menu option of Android Studio only allows you to make an app; you can only make an Android Library via the "New Module", which puts the library as a sub project of an app. An option to create a "New Library" would solve this.
The other issue is that it is not clear how the maven local repo and the gradle cache interact. They seem to get out of sync and sync gradle does not seem to sync the gradle cache with the mavenLocal repo.

Conflicts in iml files of supported modules in android studio though I am not making any change in those modules?

What are .iml files in android studio? Why sometimes I get conflicts in iml files of supported modules though I am not making any change in those modules?
IML is a module file created by IntelliJ IDEA, an IDE used to develop Java applications. It stores information about a development module, which may be a Java, Plugin, Android, or Maven component; saves the module paths, dependencies, and other settings. Looking for how to open iml files? Checkout http://www.openthefile.net/extension/iml

Where the JDKName is coming from?

I am using several computers to work with my android project. Every time I am checking in my updates to GitHUB I see several files where updated even though I did not really update them, namely the *.iml files and .idea/misc.xml file. What changes is the value of the jdk-name attribute. While checkin ig from one computer it is '1.6 (2)', while from another it is just 'JDK'
My understanding is that something in the setup of JDK is different between my 2 computers. So what is different and how do I fix it?
The JDK names are maintained internally in Android Studio; this is different from IntelliJ where you edit them through the Project Structure dialog.
It's not intended that you check .iml files or anything in the .idea folder into source control in Android Studio. The Gradle build files are the source of truth for project structure.

Resources