5

Как удалить активность из приложения? Вот упрощенный пример, у меня есть приложение, которое имеет следующие два варианта (Paid и Free). Приложение небольшое и имеет только 3 действия (MainActivity, ActivityOne и ActivityTwo). Платное приложение не нуждается в каких-либо ограничениях, так как оно будет использовать полную базу кода. Однако бесплатное приложение требует, чтобы у него были доступны MainActivity и ActivityTwo для пользователя, а не ActivityOne. Как я могу сделать «Manifest Merge» при компиляции кода, чтобы ActivityOne не присутствовал в бесплатной версии? Другими словами, как должно быть создано src/free/AndroidManifest.xml, чтобы у бесплатного приложения не было ActivityOne?Android - Удаление активности из вкуса

Ниже build.gradle файл для приложения:

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

Ниже файл манифеста для приложения Он расположен в SRC/главная/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

Используйте варианты сборки – NaviRamyle

ответ

1

в вашем свободного вкуса, в AndroidManifest вы можете указать:

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

Маркер инструменты: узел = "удалить" сделает слияние удалить какую-либо деятельность с android:name=".ui.activities.ActivityOne"

+0

Как разяснение, обязательно оставите свой основной файл manifest.xml таким, какой он есть. Вам нужно только убедиться, что в вашем ** бесплатном каталоге ** есть скопированный манифест и изменить этот узел активности в манифесте ** free **. Спасибо, @GabrieleMariotti! – w3bshark

+0

Кажется, что маркер ** tools: node = "remove" ** работает с суб-узлами активности, но он не работает с самим узлом активности. Я также проверил объединенный манифест в apk с помощью инструмента aapt, и узел активности не удаляется. Решение anagaf работает как шарм. –

+0

@PoianaApuana Перед тем, как опробовать ответ, вы должны рассмотреть возраст одного и того же ответа. Это было написано 2 года назад, это означает, что многое изменилось в последнее время, и, возможно, это был лучший ответ в то время, но не самый лучший из них сегодня. Манифестаторы не существовали 2 года назад .... –

6

Вы можете установить Android: включен атрибут с заполнителем

AndroidManifest.xml:

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

build.config:

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

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

Это решает мою проблему, отлично! –

Смежные вопросы