2 つのアプリがあります。1 つはmy-app.apk、もう 1 つはmy-service.apkです。サービス アプリは、いくつかのメソッドを実行するためにプライマリ アプリによってバインドできる単一のAndroid Serviceを定義するだけです。これは AndroidのAIDLインターフェースを使用して行われ、これまでのところうまく機能しています。
サービスのインターフェースを変更したいのですが、何に気をつければいいのか悩んでいます。my-service.apkの IRemote.aidl ファイルを次のように変更しました。
package com.example.myservice;
interface IRemote {
void printHello();
void print(int i);
}
好奇心から、my-app.apk の IRemote.aidlを次のように変更しました (違いに注意してください!)。
package com.example.myservice;
interface IRemote {
void printHello();
void printYeahThisHasADifferentNameAndParam(String s);
}
今、私は完全に予想外の結果を得ました:
printYeahThisHasADifferentNameAndParam("hello world");
私のアプリケーションからのログ出力は「11」になりました。どうして??
- bindService() 呼び出しでSecurityExceptionが発生するとは予想していませんでしたが、まったく異なるインターフェイスを使用する状況ではこれで十分です。
- 私が期待していたのは、呼び出しの実行時にRemoteExceptionであり、メソッドが使用できないことを示していました。
- 私が完全に期待していなかったのは、異なるデータをパラメーターとして別のメソッドを呼び出すだけだということでした。低レベルの観点からは理解できますが。おそらく彼らは、このインターフェースのパフォーマンスを確保するためにそれを行ったのでしょう...
だからここに私の質問があります:
- 最適なアップグレード戦略は何ですか? 古いメソッドと順序を削除/変更しないでください。
- my-service.apkがアップグレード (再インストール) されると、 my-app.apkのサービスが失われることに気付きました。通常、サービスはシステムによって再スケジュールされます。これは通常、クラッシュ時に行われます。my-app.apkがサービスを再度取得するようにするにはどうすればよいですか? 新しくインストールされたパッケージに注意してください。
よろしくお願いします。:-)
乾杯、マーク