2016-12-04 4 views
0

В моем проекте у меня есть два аромата (бесплатно и платно). У платных есть некоторые действия, которые расширяют их из основного пакета и дополнительно выполняют лицензирование. Im теперь пытается настроить мой манифест таким образом, что он всегда открывает эту деятельность, которая относится к текущему вкусу. Как это сделать?Android Flavor related Intent

В настоящее время я делаю это так.

if(isFree) 
    startActivity(new Intent(this, ActivityA.class)); 
else 
    startActivity(new Intent(this, com.project.app.paid.ActivityA.class)) 

Проблема заключается в том, что бесплатная версия жалуется, что он не знает, пакет «com.project.app.paid.». Это хорошо, потому что proguard удаляет его.

+0

Как это отличается от [вашего вопроса здесь] (http://stackoverflow.com/questions/40858582/android-flavor-intent-activity)? –

+0

Одной из возможностей было бы добавить '<намерение-фильтр>' для частного действия для обоих действий, а затем использовать 'android: exported =" false "', чтобы предотвратить запуск этих приложений сторонними приложениями. Затем используйте «Intent», используя эту строку действий. – CommonsWare

+0

@Mike M. Это не сработало, потому что действия никогда не вызываются явно, поэтому они удаляются с помощью proguard, и я не могу установить щедроты, чтобы поднять вопрос. – XxGoliathusxX

ответ

0

Я знаю, что это старый пост, но так как он не получил ответа, позвольте мне указать вам на путь позднего направления в случае, если кто-то другой встретит это сообщение.

Вы можете сделать много с ароматами, но то, что вы пытаетесь сделать, намного проще, чем кто-либо ответил.

Сначала у вас есть вариант сборки, чтобы выбрать свой вкус для отладки и работы. Поэтому используйте это, иначе вся ваша отладка будет использовать основной выпуск по умолчанию.

Во-вторых, вам не нужно получать имя пакета, просто используйте флаг конфигурации сборки или проверьте вкус. И.Е.

android { 
    signingConfigs { 
     releaseA35Demo { 
      storeFile file("$projectDir/../yaskeystore.jks") 
      storePassword System.getenv('YOUR_APP_STUDIO_STORE_PASSWORD') 
      keyAlias System.getenv('YOUR_APP_STUDIO_KEY_ALIAS') 
      keyPassword System.getenv('YOUR_APP_STUDIO_KEY_PASSWORD') 
     } 
    } 

    flavorDimensions 'default' 

    productFlavors { 
     a35Demo { 
      dimension 'default' 
      applicationId "com.appstudio35.yourappstudio" 
      buildConfigField "String", "SERVER_URL", '"http://fakeNumbers.compute-1.amazonaws.com:3006"' 
      buildConfigField "int", "BUSINESS_ID", "1" 
      versionCode 1 
      versionName "0.01.01-b1" 
      minSdkVersion 21 
     } 
     a35DemoDev { 
      dimension 'default' 
      applicationId "com.appstudio35.yourappstudio.dev" 
      buildConfigField "String", "SERVER_URL", '"http://fakeNumbers2.compute-1.amazonaws.com:3006"' 
      buildConfigField "int", "BUSINESS_ID", "2" 
      versionCode 1 
      versionName "0.01.01-b1" 
      minSdkVersion 21 
     } 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 

      productFlavors.a35Demo.signingConfig signingConfigs.releaseA35Demo 
      productFlavors.a35DemoDev.signingConfig signingConfigs.releaseA35Demo 
     } 
    } 
} 

Тогда просто ссылаться на него в коде, как:

BuildConfig.BUSINESS_ID 

Везде, где вам это нужно. Просто убедитесь, что вы случайно не используете BuildConfig проекта библиотеки, когда он автоматически импортирует BuildConfig.

Следующий способ, если вы хотите проверить свой вкус, вы можете просто сделать BuildConfig.FLAVOR, чтобы узнать, на каком из них вы находитесь. Однако имейте в виду, что есть некоторые предупреждения компилятора об использовании этого, потому что вы проверяете вкус, и BuildConfig предполагает, что он ВСЕГДА будет тем, что вы сейчас используете для раскрывающегося списка Build Variant, что неверно, вы можете игнорировать это всегда верно или всегда ложное предупреждение, я заверяю вас, что это работает.

Наконец, ваш пакет управляется вариантом сборки, который вы отлаживаете. Я добавлю изображение, чтобы вы могли видеть, где его изменить.

enter image description here

Надежда, что помогает.

Но последнее, что я скажу, это то, что ваша MainActivity будет автоматически обрабатываться, вам не нужно управлять пакетом для MainActivity, просто запустите его. Он будет использовать соответствующий аромат для того, в котором вы находитесь. Обычно, когда вы перемещаете файл в аромат, вы делаете свой аромат выпуска и ваши варианты, чтобы он использовал соответствующую MainActivity. То, что вы делаете, немного хаки, но я думаю, это работает. Тем не менее, рекомендуется рекомендовать, чтобы инструмент для ароматов выполнял свою работу и запускал его для вас.

Просто удалите MainActivity от Main и убедитесь, что он в ваших двух ароматах оплачен и свободен, и вы готовы к работе. Например, обратите внимание, у меня нет папки Application или файл в мой основной:

enter image description here

Теперь посмотрим манифеста указывает на него до сих пор.

enter image description here

Так что, если вы позволите аромат делать свою работу вам будет хорошо. если вы попытаетесь оставить его в своем главном, вам придется иметь дело с конфликтами и предупреждениями.