私はAndroidライブラリ(jarではなくライブラリプロジェクト)を使用して、1つのコードベースで2つのターゲットプロジェクト(無料および有料)を維持しています。ターゲットプロジェクトにはコードがまったくなく、すべてのコードがライブラリにあります。
ライブラリ内にコードブロックを追加する必要があります。
if (main.liteVersion)
{
//lite version code here
}
else
{
//full version code here
}
私が知っているように、条件の変数が最終的な静的Javaコンパイラーは、未使用のコードを除外します(main.liteVersionがtrueの場合はフルバージョンコード)。それだけが必要。sobodyがliteバージョンを逆コンパイルして、有料バージョンのコードを表示したくないからです。私はそれがdefではないことを知っていますが、無料バージョンのバイナリに有料バージョンのコードを含めていません。
しかし、ターゲットプロジェクトに最終的な静的変数を追加して、ライブラリで表示することはできません。
私たちがどのターゲットプロジェクトにいるかを判断する方法はいくつかあります。現在のパッケージ名を読み取って、実行中のバージョンを判別できます。ターゲットプロジェクトにconfigクラスを追加すると、ライブラリのリフレクションを使用してcfg値を取得できます。また、ターゲットプロジェクトにリソースを追加することもできますが、com.tertium.lite.Rに追加されますが、ライブラリではcom.tertium.library.Rのみを読み取ることができます(もちろん、リフレクションを使用すると、何でも読み取ることができます)。ただし、このような「動的」メソッドでは、コンパイラは未使用のコードを除外しません(条件は実行時に計算された値になります)。
ビルド中に(antまたはshellタスクを使用して)ライブラリプロジェクト内でconfigクラスを書き換えることができます。そうすれば、「自然な」静的セットアップが可能になりますが、ライブラリには触れたくないです。
念のため-私はEclipsehelios、androidバージョン-1.6-4.2を使用しています。
何か案は?ありがとう!
更新:プロジェクトをライブラリとして使用することを拒否し、必要なすべての構成をサポートするシームレスなantベースのリソースコンパイルおよびビルドワークフローを開発したため、これはもう実際ではありません。さらに、私が知る限り、私の元の質問には有効な答えがありません。