3

コードをあまり変更せずに (そして比較的簡単に)、開発 Web サービスと運用 Web サービスの間でアプリを切り替えたいと考えています。

現在static final String、実際の HTTP 呼び出しを実行するクラスの変数として Web サービス アドレスを使用し、static final boolean.

は非常に便利booleanですが、それを使用して Web サービスのアドレスを変更することはできません。これは、それ自体がstatic final変数であるためです。これに取り組むためのベストプラクティスは何ですか?

Android SDK が提供する変数を使用することを目的とした SO に関するいくつかの議論を見つけましdebugたが、それは を置き換えることができますがboolean、他の問題は解決しません。

注: ご参考までに、私は Web サービス クラスを静的に使用しているため、変数をチェックしてdebug変数を変更できるコンストラクターがありませんstatic final

4

4 に答える 4

5

アップデート

ビルドシステムを使用すると、gradleこれが大幅に簡単になります。たとえばServer.java、開発サーバーのクレデンシャルを含むファイルsrc/debug/javaと本番サーバーのクレデンシャルを含むファイルを配置できsrc/release/javaます(デフォルトのgradleプロジェクト構成を使用している場合は、それに応じてカスタムに調整します)。ビルドシステムは、に基づいて適切なファイルを使用しますbuildType

さらに良いことに、releaseファイル使用static final変数がありますが、debugビルドstaticでは、コードでまったく同じように使用される変数(たとえばServer.urlServer.usernameなど)を使用しますが、開発ドロワーから変更できます。開発ドロワーとは何ですか?この例については、JakeWhartonのu2020プロジェクトと関連する講演を参照してください。


古い答え

静的メソッドを使用しstatic final booleanて、デバッグ状態を定義する別のアドレスにアクセスすることになりました。そのようです :

public static String getWSAddress() {
    if(DEVELOPMENT_MODE) {
        return "http://dev.server.com";
    }

    return "http://prod.server.com";
}

私が読んだことから、booleanstatic finalであるため、コンパイラは最適化され、条件コードは到達不能として削除されます。

これはこの問題の適切な解決策のようですが、Androidの文献によると、メソッド呼び出しは一般に直接変数アクセスよりもコストがかかるため、これがChuckが提供する解決策よりも優れているかどうかを判断できません。

編集:記録のために。@Blundellのソリューションに移動しました。これは素晴らしいです。ですから、すぐにやりたいのであれば、これから始めることをお勧めしますが、それをロードマップに入れます。

于 2012-05-10T20:01:28.263 に答える
3

私はそれをすることを約束しました、そしてここにそれがあります:

GitHub にもミラーリングされています: https://github.com/blundell/BuildChoiceTut

チュートリアルでは、Ant ビルド スクリプトを使用して構成を切り替えることができます。

ここに /config/ というディレクトリをセットアップし、さまざまな構成のすべての定数を保持します。ファイルごとに 1 回、つまり live.props dev.props beta.props

次に、Ant が実行されると、選択されたファイルが読み取られ、コンパイルされる直前にビルドに「挿入」されます。

楽しみ!

于 2012-05-22T12:22:26.880 に答える
1

アプリのプロダクト フレーバーを使用できdevますproductionapplicationId各フレーバーに固有のものを指定します。

次に、コードで、値を確認して使用している製品フレーバーを確認し、BuildConfig.APPLICATION_IDそれに応じて URL を使用します。

お役に立てれば。

于 2016-11-29T12:08:36.613 に答える
0

構成を静的な最終定数にする必要がある場合、解決策は少し複雑になります。このソリューションは、マニフェストにデバッグ可能が正しく設定されているかどうかにも依存しているため、完全に確実なものではありません。

デバッグ可能を覚えておくために私が考えることができる唯一の方法は、後で説明するデバッグフラグを使用して、初期画面の背景色を赤に変更することです。少しばかげていますが、うまくいくでしょう。

アドレス変数をstaticfinalとして宣言し、それに値を割り当てないようにすることができます。

public static final String webServiceAddress;

以下を使用して、アプリがデバッグ可能に設定されているかどうかに関する情報を取得できます。

getApplicationInfo().flags;

つまり、アプリをリリースし、マニフェストでdebuggableをfalseに設定するときにスイッチを切り替える必要がありますが、ユーザーに表示したくないログメッセージをオフにするには、とにかくこれを行う必要があります。

デフォルトのアクティビティのonCreateでは、これを使用して分岐し、正しいアドレスを割り当てることができます。これが完全な例です。

//Store release configuration here, using final constants
public class ReleaseConfig {

    //Don't set webServiceAddress yet
    public static final String webSericeAddress;
    public static boolean configSet = false;

    static
    {
        //Set it as soon as this class is accessed
        //As long as this class is first accessed after the main activity's onCreate
        //  runs, we can set this info in a final constant
        webServiceAddress = MainActivity.configuredAddress;
    }
}

public class MainActivity extends Activity {

    public static String configuredAddress;

    //This should be one of the first methods called in the activity
    public void onCreate(Bundle savedInstanceState)
    {
        //Figure out if we are in debug mode or not
        boolean debuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));

        //Save off our debug configuration
        if (debuggable) configuredAddress = "the debuggable address";
        else configuredAddress = "the production address";

        //Access the static class, which will run it's static init block
        //By the time this runs, we'll have the info we need to set the final constant
        ReleaseConfig.configSet = true;
    }
于 2012-05-07T19:09:50.670 に答える