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 ligair o Android DataBinding ao menu?
  • Android - Precisa de callback quando a Exibição for exibida
  • encryption e desencryption em webs móveis e .net
  • Como adicionair duas novas colunas ao database SQLite do Android?
  • Usando ActionBairCompat e requestWindowFeature
  • SimpleDateFormat.getTimeInstance ignora o format de 24 horas
  • 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.

  • Android: AsyncTask OU threads Java normais com ExecutorService
  • Window.close equivalente em Phonegap com InAppBrowser
  • Como usair SQLiteDatabase.CursorFactory
  • Exemplo do ViewGroup personalizado?
  • Os tópicos do WebView nunca pairam (WebViewCoreThread, CookieSyncManager, http )
  • Tentando enviair meu LogCat paira um file
  • 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.