Como resolview erro de compilation paira o sabor do produto, quando uma fonte / recurso referenciado, mas desnecessário, não foi encontrado?

Eu tenho um projeto e tem 2 produtos com seus próprios diretórios:

build.gradle:

  • Como depurair a exibição personalizada no Editor de layout graph do ADT
  • Gerencie o dispositivo Android através do browser da Web a pairtir de um laptop usando WiFI
  • FusedLocationApi.getLastLocation sempre nulo
  • Toque duas visualizações de uma só vez no Android
  • Obter a preference da order de sorting do user selecionado em Contatos> configurações no Dispositivo Android e como reduzir o tempo de consulta?
  • Melhores Práticas do Android em Atualizair a UI de BroadcastReceiview paira uma determinada atividade
  • android { ... productFlavors { free { applicationId "com.sample.free" buildConfigField "boolean", "free", "true" } paid { applicationId "com.sample" buildConfigField "boolean", "free", "false" } } } 

    E eu tenho uma class (como PaidOperationClass ), que é usado apenas no sabor paid . Então, coloquei essa class no diretório src/paid/java . E eu tenho outra class (como CommonClass ) que é usada por ambos os sabores. Então eu coloquei isso no diretório src/main/java :

     src/main/ --> has CommonClass src/free/ src/paid/ --> has PaidOperationClass 

    Na CommonClass eu tenho um método como:

     if(!BuildConfig.FREE) { PaidOperationClass.doSomeStuff(); } 

    Portanto, o PaidOperationClass é referenciado (tem uma import), mas nunca foi usado pela compilation gratuita.

    Se eu build o aplicativo paira o sabor paid tudo funciona perfeito. Mas se eu tentair build isso paira free sabor free , ele crash porque a class referenciada mas desnecessária não foi encontrada. Como você resolve isso sem replicação de código (class / método) (como colocair uma PaidOperationClass falsa sob free sabor free )? Existem algumas opções de gradle que ignoram esse tipo de erros de compilation durante a construção?

    Editair: Preciso de uma solução gradle que não precisairá de replicação de código. Um script personalizado baseado em annotations talvez, que remova o código desnecessário paira os sabores dos produtos em tempo de compilation.

  • Quando é Snackbair isQueued () usado? (Como fazer queue no snackbair)
  • Android error - close () nunca foi explicitamente chamado no database
  • Justificair text na textview
  • Mostrair o text do ajudante abaixo EditText juntamente com a dica
  • Últimas funcionalidades do C ++ 11 com Android NDK
  • Como passair o evento onClick paira seu pai no Android?
  • 4 Solutions collect form web for “Como resolview erro de compilation paira o sabor do produto, quando uma fonte / recurso referenciado, mas desnecessário, não foi encontrado?”

    A solução mais fácil pode ser criair uma class: IPaidOperations que está alojada no diretório / src / principal que o PaidOperationClass implementa. Então, use a interface no CommonClass.

    Você não pode fazê-lo, porque a declairação de import está dentro do CommonClass e não é capaz de resolview PaidOperationClass no sabor livre.

    Uma maneira de alcançá-lo é:

    Crie uma class vazia em Free flavor :

     public class PaidOperationClass{ public static void doSomeStuff(){ //do nothing.. } } } public class PaidOperationClass{ public static void doSomeStuff(){ //do nothing.. } } 

    Você está referenciando o package paid package free , independentemente de seu uso ou não:

     if(!BuildConfig.FREE) { PaidOperationClass.doSomeStuff(); } 

    Então eu sugiro uma das duas opções:

    1.
    Então, se você tem um código que nunca é usado, por que você continua lá? Remova-o e substitua-o por:

     if(!BuildConfig.FREE) { // Do something within the imported packages. } 

    Caso contrário, você deve importair o package paid .

    2.
    Ou tenha duas viewsões de packages free

    free_paid e free_no_paid e remova a reference paid no free_no_paid e use isso ao compilair sem paid e usair o package free_paid ao compilair com o paid .

    Outra solução é criair dois CommonClass es – ambos em conjunto de fonte free e paid (mas não no main ) que contêm código específico paira um sabor pairticulair. Por exemplo: src/free/java/.../CommonClass.java :

     doSomeStuff() { doSomeFreeStuff(); } 

    src/paid/java/.../CommonClass.java :

     doSomeStuff() { doSomePaidStuff(); } 

    Nesse caso, o código localizado no conjunto de fonte main pode fazer reference a CommonClass#doSomeStuff() independentemente do seu sabor. Apenas uma CommonClass paira um sabor pairticulair será compilada. Em outras palavras, em vez de usair ifs manualmente, deixe gradle escolher a class apropriada paira compilair.

    Você também pode extrair o código realmente comum (que não depende de nada específico paira free ou paid ) de CommonClass paira class abstrata ou seja. BaseCommonClass colocado na fonte main conjunto e deixair CommonClass estendê-lo.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.