2017-04-17 2 views
3

私はそれを実装するアプリケーションのレイアウト項目にアクセスする必要があるライブラリを開発しています。私はそれを行う方法を知っている唯一の方法は、反射とです。言い換えれば、私はこのように私のライブラリAPIにコンストラクタを作成した場合:AndroidライブラリからアプリRクラスにアクセスする

public MyLibraryAPI(String packageName) { 
    Class appR = Class.forName(String.format("%s.R", packageName)); 
    ... 
} 

、開発者は、コンストラクタのパラメータとしての彼のパッケージ名とライブラリをインスタンス化します。

私の最終的に必要なのは、内部クラスに開発者レイアウト(.xmlファイル)で使用されるAndroidビュー(IDとタイプの両方)を知らせることです。反射なしでこれを達成し、パフォーマンスのオーバーヘッドを逃れる方法はありますか?私はそれができないと確信していますが、私が気が付かないものを見ている専門家がいるかどうかを尋ねます。

EDIT:さらに、デフォルトでproguardは保護のためにコードを難読化しますが、結果として実行時にリフレクションを実現する手段をJVMに提供できません。したがって、リフレクションを使用する場合は、バーカーであるRクラスのプロガード難読化。

+1

アノテーションプロセッサを使用できますか?バターナイフの仕組みに似た何か? –

+0

ええ、私は、コンパイル時に実行を移動するアノテーション処理を使用することができます。しかし、これはバインディングのアノテーションを提供する必要があるため、開発者の視点からはより大きな努力が必要です。または私は間違っていますか?私はまだ議論している、私はどちらの側にも傾いていない。とにかくお返事ありがとうございます。 – NitroNbg

答えて

1

Androidでのリフレクションは非常にコストがかかります。 Roboguiceのような有名で有名なライブラリの中には、リフレクションのパフォーマンスコストのために部分的に欠けているものもあります。

ここで正しい解決策がいくつかあると思われます。 Dagger 2Butter KnifeおよびData Binding Libraryは、コード生成を使用するAndroidライブラリの成功した例です。データバインディングライブラリはXMLで検査を実行するため、ビルドのその段階でコード生成ライブラリで使用できるようにする必要があります。その実装をベースにすることができます。source jars at Maven Centralへのリンクです。

それ以外は、使いやすさと実装難易度の間にいくつかの妥協点があるようです。消費者がアノテーションを使ってクラスに注釈を付けるようにすると、使用するのが難しくなりますが、実装がはるかに容易になります。 XMLを検査し、生成されたRファイルを制限して、それからコードを生成することにあなた自身を制限すれば、あなたの仕事はずっと難しくなると思います。一方、アノテーションを使用することはかなり一般的になり、ユーザーにとってはあまり問題にならないかもしれません。

幸運を祈る!

関連する問題