5

Come rimuovere un'attività dal sapore di un'app? Ecco un esempio semplificato, ho un'app che ha i seguenti due sapori (a pagamento e gratuito). L'app è piccola e ha solo 3 attività (MainActivity, ActivityOne e ActivityTwo). L'app a pagamento non ha bisogno di alcuna limitazione poiché utilizzerà il codice completo. L'app gratuita tuttavia richiede che MainActivity e ActivityTwo siano accessibili all'utente e non a ActivityOne. Come posso fare una "Manifest Merge" durante la compilazione del codice in modo che ActivityOne non sia presente nella versione gratuita? In altre parole, come deve essere creato src/free/AndroidManifest.xml in modo che l'app gratuita non abbia ActivityOne?Android - Rimozione di attività da Flavor

riportano di seguito le file di build.gradle per l'applicazione:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.example.calculator" 
     minSdkVersion 21 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    productFlavors { 
     paid { 
      applicationId "com.example.paid" 
      resValue "string", "app_name", "Paid Calculator" 
      versionName "1.0-full" 
     } 
     free { 
      applicationId "com.example.free" 
      resValue "string", "app_name", "Free Calculator" 
      versionName "1.0-free" 
     } 
    } 
    sourceSets { 
     paid { 
      manifest.srcFile 'src/paid/AndroidManifest.xml' 
     } 
     free { 
      manifest.srcFile 'src/free/AndroidManifest.xml' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:cardview-v7:21.0.0' 
    compile 'com.android.support:recyclerview-v7:21.0.0' 
    compile 'com.android.support:design:22.2.0' 
    compile 'com.android.support:appcompat-v7:22.2.0' 
} 

Di seguito si riporta il file manifesto per l'applicazione Si trova a src/main/AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.calculator"> 

    <application 
     android:name="com.example.calculator.ui.activities.AppController" 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".ui.activities.MainActivity" 
      android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".ui.activities.ActivityOne" 
      android:label="@string/title_activity_one" 
      android:parentActivityName=".ui.activities.MainActivity"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value=".ui.activities.MainActivity" /> 
     </activity> 
     <activity 
      android:name=".ui.activities.ActivityTwo" 
      android:label="@string/title_activity_two" 
      android:parentActivityName=".ui.activities.MainActivity"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value=".ui.activities.MainActivity" /> 
     </activity> 
    </application> 
</manifest> 
+0

Utilizzare le varianti di costruzione – NaviRamyle

risposta

1

Nel proprio stile gratuito, nel numero AndroidManifest è possibile specificare:

<activity android:name=".ui.activities.ActivityOne" tools:node="remove"/> 

Il marcatore strumenti: node = "remove" farà la fusione rimuovere qualsiasi attività con android:name=".ui.activities.ActivityOne"

+0

Proprio come un chiarimento, assicurati di lasciare il manifest.xml principale così com'è. Devi solo assicurarti che ci sia un manifest copiato nella tua directory ** free ** e modificare quel nodo attività nel manifest di ** free ** flavour. Grazie, @GabrieleMariotti! – w3bshark

+0

Sembra che il marcatore ** tools: node = "remove" ** funzioni con i sub-nodi dell'attività, ma non funzioni con il nodo attività stesso. Ho anche controllato il manifest unito nell'apk con lo strumento aapt e il nodo attività non è stato rimosso. La soluzione di anagaf funziona come un fascino. –

+0

@PoianaApuana Prima di effettuare il downvoting di una risposta, è necessario considerare l'età della stessa risposta. È stato scritto 2 anni fa, significa che nel frattempo molte cose sono cambiate e potrebbe essere la migliore risposta in quel momento, ma non quella migliore oggi. I manifestPlaceholders non esistevano 2 anni fa .... –

6

È possibile impostare Android: attributo enabled con un segnaposto

AndroidManifest.xml:

<activity 
    android:name=".ui.activities.ActivityOne" 
    android:enabled="${isPaidVersion}"/> 

build.config:

defaultConfig { 
    ... 
    manifestPlaceholders = [isPaidVersion: "false"] 
} 

productFlavors { 
    paid { 
     ... 
     manifestPlaceholders = [isPaidVersion:"true"] 
    } 
    free { 
     ... 
    } 
} 
+0

Questo risolve il mio problema, perfetto! –