问题
(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?
回答1:
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
回答2:
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!
回答3:
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!
回答4:
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 ;)
回答5:
just need name the .aidl file to be same as the .java file!
来源:https://stackoverflow.com/questions/27138924/android-aidl-compile-error-couldnt-find-import-for-class