AIDLコンパイルcouldn't find import for class原因探究

1679 ワード

以下のAIDLコードがある:package android.hardware;
 import android.content.Context;
 /**   * {@hide}   */ interface IEinkctlService  {   boolean updateModeLock(boolean acquired, Context context);   int retrieveWorkMode();   boolean switchWorkMode(int mode);  }
コンパイル時にいつもヒントを与えるcontent.ContextはContextクラスが見つからないようですが、実際にはandroidを知っています.content.Contextは確かに存在します.インターネットで探してみると、この問題に遭遇した人が少なくないことに気づいた.
実は、この問題を理解するには、まずどのようなクラスが必要であり、AIDLにimportが入ることができるかを明らかにする必要があります.
「Android/OPhone開発完全講義」の8章の一節を参照してください.「AIDLサービスは限られたデータ型のみをサポートしています.そのため、AIDLサービスで複雑なデータを伝達するには、より一歩の処理が必要です.AIDLサービスがサポートするデータ型は以下の通りです.
Javaのシンプルタイプ(int,char,booleanなど).インポート(import)は必要ありません.
StringとCharSequence.インポート(import)は必要ありません.
ListとMap.ただし、ListオブジェクトとMapオブジェクトの要素タイプは、AIDLサービスがサポートするデータ型である必要があります.インポート(import)は必要ありません.
AIDLが自動的に生成するインタフェース.インポート(import)が必要です.
実現するos.Parcelableインタフェースのクラス.インポート(import)が必要です.
このうち、後の2つのデータ型はimportを使用してインポートする必要があります.この章では後述します.
importを必要としないデータ型の値を渡す方法は同じです.importが必要なデータ型の値(android.os.Parcelableインタフェースを実装するクラスなど)を渡す手順は、やや複雑です.実装を確立する以外はos.Parcelableインタフェースのクラスに加えて、このクラスのaidlファイルを個別に作成し、parcelableキーワードを使用して定義する必要があります.」
例えば、MusicInfoが存在する.JAvaクラスは、MusicInfoを再作成する必要があります.aidl:
package com.raly.musicplayer.model;
parcelable MusicInfo;

ここで、ContextクラスはParcelableインタフェースを実現したクラスではなく、対応するAIDLファイルもないため、AIDLでimportすることはできないことが明らかになった.
 
ネット上にはframeworks/base/Androidという「方法」があります.mkのLOCAL_AIDL_INCLUDES:=$(FRAMEWORKS_BASE_JAVA_SRC_DIRS)前にLOCAL_を付けるAIDL_INCLUDES:=importしたいクラスが存在する場所.実はこの「方法」も上記のimportルールによって制限されています.Parcelableインタフェースを実装していないクラスでは、このような「方法」はどうしようもありません.