2009-11-16 106 views
52

我正在構建一個Android應用程序,並希望維護一些我可以調整的環境變量,具體取決於我處於開發模式還是發佈模式。例如,我需要調用Web服務,並且這兩種模式的URL都會略有不同。我想將這個和其他設置外部化,以便我可以根據我的目標部署輕鬆更改它們。在Android上區分開發模式和發佈模式環境設置

是否有任何最佳實踐或SDK中的任何內容來協助滿足此需求?

回答

28

按照這個計算器post,在SDK工具版本17(我們正在對19在本文寫作)增加了一個BuildConfig.DEBUG不斷建設開發建設的時候是真的。

+2

現在將其標記爲已接受的答案,因爲它可能更適用於未來的旅行者 – 2014-03-10 21:18:38

+0

適用於** API 15 **,4.0.3。 – 2014-07-21 20:32:18

+1

API無關緊要,只是構建工具版本。 – yincrash 2014-08-04 03:51:01

3

我想看看isDebuggerConnected

+1

謝謝,這可能會派上用場的一天,但我可以在技術上運行在沒有附加調試器的開發模式下仿真器。 – 2009-11-16 17:49:45

43

以下解決方案假定清單文件,你總是設置android:debuggable=true在開發和android:debuggable=false應用程序發佈。

現在,您可以通過檢查從PackageManager獲取的ApplicationInfo中的ApplicationInfo.FLAG_DEBUGGABLE標誌,從代碼中檢查該屬性的值。

下面的代碼片段可以幫助:

PackageInfo packageInfo = ... // get package info for your context 
int flags = packageInfo.applicationInfo.flags; 
if ((flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) { 
    // development mode 
} else { 
    // release mode 
} 
+4

截至最近的SDK版本,這似乎是最好的方法,因爲Eclipse和Ant都會根據構建類型自動設置它。 – Zulaxia 2011-04-28 11:40:01

3

如何像下面的代碼...

public void onCreate Bundle b) { 
    super.onCreate(savedInstanceState); 
    if (signedWithDebugKey(this,this.getClass())) { 
    blah blah blah 
    } 

    blah 
    blah 
     blah 

} 

static final String DEBUGKEY = 
     "get the debug key from logcat after calling the function below once from the emulator";  


public static boolean signedWithDebugKey(Context context, Class<?> cls) 
{ 
    boolean result = false; 
    try { 
     ComponentName comp = new ComponentName(context, cls); 
     PackageInfo pinfo = context.getPackageManager().getPackageInfo(comp.getPackageName(),PackageManager.GET_SIGNATURES); 
     Signature sigs[] = pinfo.signatures; 
     for (int i = 0; i < sigs.length;i++) 
     Log.d(TAG,sigs[i].toCharsString()); 
     if (DEBUGKEY.equals(sigs[0].toCharsString())) { 
      result = true; 
      Log.d(TAG,"package has been signed with the debug key"); 
     } else { 
      Log.d(TAG,"package signed with a key other than the debug key"); 
     } 

    } catch (android.content.pm.PackageManager.NameNotFoundException e) { 
     return false; 
    } 

    return result; 

} 
+0

這種情況下的DEBUGKEY實際上是整個證書。我建議使用http://stackoverflow.com/questions/6122401/android-compare-signature-of-current-package-with-debug-keystore中的方法代替。這樣,您不僅限於單個機器的調試密鑰。 – Ralf 2012-02-10 12:49:24

1

我今天對面的另一種方法也是出於偶然,似乎真的直線前進再看看Build.TAGS,當開發,這是創建的應用程序評估爲字符串「測試密鑰」。

沒有比字符串比較容易得多。

另外Build.MODEL和Build.PRODUCT評估到模擬器上的字符串「google_sdk」!

+0

這可靠嗎?它似乎可以爲根設備設置測試密鑰:http://stackoverflow.com/questions/1101380/determine-if-running-on-a-rooted-device 這使得我認爲可能有其他情況下這種方法可能會失敗。 – christoff 2011-04-14 00:40:23

+0

不,這是不可靠的。 – shkschneider 2012-12-14 11:19:53

9

@ viktor-bresan感謝您提供有用的解決方案。如果您只包含了檢索當前應用程序的上下文以使其成爲完整工作示例的一般方法,那將會更有幫助。沿着以下線的東西:

PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0); 
2

Android build.gradle有句柄調試和發佈環境。

追加下面的代碼片段在build.gradle文件

buildTypes { 
    debug { 
     buildConfigField "Boolean", "IS_DEBUG_MODE", 'true' 
    } 

    release { 
     buildConfigField "Boolean", "IS_DEBUG_MODE", 'false' 
    } 
} 

現在你可以訪問變量像下面

if (BuildConfig.IS_DEBUG_MODE) { { 
     //Debug mode. 
    } else { 
     //Release mode 
    }