在Android上区分开发模式和发布模式环境设置

我正在构build一个Android应用程序,并希望维护一些我可以调整的环境variables,具体取决于我处于开发模式还是发布模式。 例如,我需要调用一个Web服务,这个URL在任何一种模式下都会略有不同。 我想将这个和其他设置外部化,所以我可以根据我的目标部署轻松地进行更改。

在SDK中是否有任何最佳实践或其他方面的协助来满足这种需求?

根据这个stackoverflow的post ,在SDK Tools版本17中(我们在撰写本文时是19)添加了一个BuildConfig.DEBUG常量,在构build开发版本时是true。

以下解决scheme假定在清单文件中,您始终将android:debuggable=true设置为开发,对于应用程序版本,则设置为android:debuggable=false

现在,您可以通过检查从PackageManager获取的ApplicationInfo.FLAG_DEBUGGABLE中的ApplicationInfo标志,从代码中检查该属性的值。

下面的代码片段可以帮助:

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

@ viktor-bresan感谢您提供有用的解决scheme。 如果您只包含一个检索当前应用程序的上下文以使其成为一个完整工作示例的通用方法,那将会更有帮助。 一些沿着下面的线:

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

我会检查出isDebuggerConnected

下面的代码如何…

 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; } 

我今天偶然发现了另一种方法,看起来非常简单。查看Build.TAGS,当为开发创build应用程序时,这将评估为string“test-keys”。

不比string比较容易得多。

另外Build.MODEL和Build.PRODUCT评估到模拟器上的string“google_sdk”!

Android build.gradle有Handles Debug和Release Environment。

build.gradle文件中附加下面的代码片段

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

现在你可以像下面那样访问variables

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

这是我使用的方法:

http://whereblogger.klaki.net/2009/10/choosing-android-maps-api-key-at-run.html

我用它来切换debugging日志logging和地图API密钥。