0

私は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ベースのリソースコンパイルおよびビルドワークフローを開発したため、これはもう実際ではありません。さらに、私が知る限り、私の元の質問には有効な答えがありません。

4

2 に答える 2

1

システム(ant、maven、makeなど)を構築するステップにすることをお勧めします。そのようなソースは少ないので、ビルドステップとしてファイル置換マニュアルを追加していただければ幸いです。

このコンパイラを機能させないでください。長期的に制御するのは困難です。コンパイラ オプション/バージョンが変更され、動作も変更される可能性があります。

于 2013-02-11T09:33:02.707 に答える
0

ProGuard を使用して未使用のコードを削除できます (ライブラリ プロジェクトではなく、アプリケーション プロジェクトで)。アプリケーション プロジェクトにコードがまったくない場合は、アプリケーション プロジェクトproguard-project.txtごとに別のファイルを使用し、無料版で有料のエントリ ポイントを保持しないようにする必要がある場合があります。

ProGuard ルールは少しトリッキーです。どのクラスとメソッドがproguard/mapping.txtファイルに保持されているかを確認できます。

于 2013-02-11T12:14:33.167 に答える