14

(I know there're multiple questions on stackoverflow and elsewhere (like google group) about adding parcelable for NetworkInfo but this is not about that.)

My work is under $(AOSP_ROOT)/device/ and involves multiple aidl files. one of it is like,

package com.example;

parcelable SomeRequest;

And another aidl is like,

package com.example;

import com.example.SomeRequest;
interface SomeService {
    SomeRequest getRequest();
}

And I'll get compile errors like,

device/somedevice/sdk/libs/aidl/com/example/SomeService.aidl:9: couldn't find import for class com.example.SomeRequest

I'm wondering it is the order of processing aidl files. My Android.mk looks like,

LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, aidl)
LOCAL_AIDL_INCLUDES := $(call all-Iaidl-files-under, aidl)

This build error is introduced after I moved aidl files from src/ folder to aidl/ folder (for some reason I have to do so). It worked before but now even if I moved it back to src/ folder it doesn't work anymore. I tried to clean up $(AOSP_ROOT)/out/device/target but it's not helping.

Ideas?

Chundong Wang
  • 478
  • 1
  • 5
  • 13

6 Answers6

11

Finally I got it resolved.

If you dig into /build/core/base_rules.mk, you'll find that LOCAL_AIDL_INCLUDES is actually the folders to be included during AIDL compiling phase in addition to the default folders like framework or so.

$(aidl_java_sources): PRIVATE_AIDL_FLAGS := -b $(addprefix -p,$(aidl_preprocess_import)) -I$(LOCAL_PATH) -I$(LOCAL_PATH)/src $(addprefix -I,$(LOCAL_AIDL_INCLUDES))

In this specific case, what you want is actually,

LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, aidl)
LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl
Chundong Wang
  • 478
  • 1
  • 5
  • 13
  • 2
    What if my *.aidl file define in library, is not in current local path, just like ../LibraryProject/aidl, how to fix? – codezjx Aug 31 '16 at 17:34
  • This 'all-Iaidl-files-under' function returned with path relative to $(LOCAL_PATH). You can specify library path directly from your root project. That is: LOCAL_AIDL_INCLUDES := LibraryProject/aidl – Chris Li Aug 24 '18 at 07:12
  • @m0skit0, it's referring to e.g., https://android.googlesource.com/platform/build/+/master/core/base_rules.mk – TT-- May 02 '19 at 17:09
  • This seems no longer valid. Running Android Studio 3.4, there si no base_rules.mk file, and no AIDL include path in any configuration. – 3c71 Jun 07 '19 at 09:21
  • It's moved to `build/make/core/java.mk` in AOSP12+ – zinger Jan 18 '23 at 19:26
  • It still gives the same error. `ERROR: lineage-sdk/sdk/src/java/lineageos/app/IProfileManager.aidl: Couldn't find import for clas s android.app.NotificationGroup` – zinger Jan 19 '23 at 17:51
5

So I looked around - the solution is to put the AIDL files only into their own directory called aidl, which I think some others have suggested.

It turns out that Android Studio looks there, but doesn't quite know what to do about .aidl files put in the src directory.

I don't get it. I just don't get it. AIDL imports worked perfectly in Eclipse. Android Studio is not production ready. This is a major step backwards.

I'm was having trouble getting the AIDL compiler to find imports as well, and I'm thinking there has to be a better way than modifying base_rules.mk, which the platform manages.

Arg!

Coder Roadie
  • 838
  • 1
  • 8
  • 11
  • I'm using Android Studio 2.1 and did pretty much what you suggested: Put 2 .aidl files in aidl folder. However, what happened to me is that Android Studio prevented me to create the second .aidl (i.e., SomeRequest.aidl based on OP). It turns out you need to create this file a little bit brute-forcely: Create an .aidl with a random name and then change to the correct name. Otherwise Android Studio is not happy. – TimeString May 21 '16 at 00:46
  • I already have aidl files in a separate aidl/ folder. I even tried with subfolder in src/ and a root folder. Still same problem. – m0skit0 Aug 03 '16 at 10:22
2

Ok, so I was struggling for days trying to figure out this same problem. Clean/Rebuilds didn't work for me. Eventually, I realized a really simple mistake I was doing in Android Studio - When I right-clicked my mouse and created a new "AIDL", I wasn't clicking in the appropriate folder as my original model classes.

For example, my model was in a java package called com.example.model, but I wasn't right-clicking in that folder when I created my AIDL. So when Android Studio generates the AIDL folder for me, it would reference the wrong folder, and I would end up with a compile error. I wish the android documentation made it clear that we needed to be right-clicking in the appropriate folder before generating the AIDL files. I know, it sounds silly, but I hope this answer applies to some of you!

zuko
  • 707
  • 5
  • 12
2

As of now, currently accepted answer is no longer an option. No base_rules.mk file in Android Studio 3.4, none that I could find anyway.

To solve this, I took an example from IPackageStatsObserver which uses a parcelable PackageStats.

All imports must be declared in a .aidl file, some kind of .h if we were in C.

Here is the content of the PackageStats.aidl file, reflecting the existence of a class with the same name (on the java side):

package android.content.pm;

parcelable PackageStats;

So I declared all my parcelable in .aidl, for every matching .java I need to use in my aidl interface, and voila, it compiles.

Got to see if it actually works now ;)

3c71
  • 4,313
  • 31
  • 43
1

just need name the .aidl file to be same as the .java file!

chengxs
  • 11
  • 1
1

To resolve couldn't find import for class in parcelable class, put the aild file and java file in correct package and folder

// MyObject.aidl
package com.example.androidaidlserver.model;
parcelable MyObject;
// ILocalLogService.aidl
package com.example.androidaidlserver;

import com.example.androidaidlserver.model.MyObject;

interface ILocalLogService {

    void writeObject(in MyObject log);
}
// MyObject.java
package com.example.androidaidlserver.model;

import android.os.Parcel;
import android.os.Parcelable;

public class MyObject implements Parcelable {
...
Linh
  • 57,942
  • 23
  • 262
  • 279
  • Had no idea I need to create package hierarchy for aidl files too. Thanks, man, your screenshot gave me a clue! – Viacheslav Jan 12 '23 at 10:14