5

Làm cách nào để xóa hoạt động khỏi ứng dụng? Dưới đây là một ví dụ đơn giản, tôi có một ứng dụng có hai hương vị sau (Trả tiền và Miễn phí). Ứng dụng nhỏ và chỉ có 3 hoạt động (MainActivity, ActivityOne và ActivityTwo). Các ứng dụng trả tiền không cần bất kỳ hạn chế vì nó sẽ sử dụng cơ sở mã đầy đủ. Tuy nhiên, ứng dụng miễn phí yêu cầu nó phải có MainActivity và ActivityTwo có thể truy cập được cho người dùng chứ không phải ActivityOne. Làm thế nào tôi có thể làm một "Manifest Merge" khi biên dịch mã để ActivityOne không có mặt trên phiên bản miễn phí? Nói cách khác làm thế nào nên src/free/AndroidManifest.xml được tạo để ứng dụng miễn phí không có ActivityOne?Android - Xóa hoạt động khỏi Flavour

Dưới đây là build.gradle tập tin cho các ứng dụng:

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

Dưới đây là file manifest cho ứng dụng Nó nằm ở 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

Sử dụng các biến thể xây dựng – NaviRamyle

Trả lời

1

Trong miễn phí hương vị, trong AndroidManifest bạn có thể chỉ định:

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

Các marker công cụ: node = "loại bỏ" sẽ làm cho việc sáp nhập loại bỏ bất kỳ hoạt động với android:name=".ui.activities.ActivityOne"

+0

Cũng giống như làm rõ, hãy đảm bảo để lại tệp manifest.xml chính của bạn. Bạn chỉ cần đảm bảo có tệp kê khai được sao chép trong thư mục ** miễn phí ** của bạn và sửa đổi nút hoạt động đó trong tệp kê khai của ** free ** flavor. Cảm ơn, @GabrieleMariotti! – w3bshark

+0

Dường như dấu ** công cụ: node = "remove" ** hoạt động với các nút con hoạt động, nhưng nó không hoạt động với chính nút hoạt động. Tôi cũng đã kiểm tra tệp kê khai được hợp nhất trong apk bằng công cụ aapt và nút hoạt động không bị xóa. Các giải pháp của anagaf hoạt động như một say mê. –

+0

@PoianaApuana Trước khi downvoting một câu trả lời bạn nên xem xét độ tuổi của cùng một câu trả lời. Nó được viết cách đây 2 năm, có nghĩa là nhiều thứ đã thay đổi trong thời gian đó và có thể đó là câu trả lời hay nhất vào thời điểm đó nhưng không phải là câu trả lời hay nhất hiện nay. Các manifestPlaceholders đã không tồn tại 2 năm trước .... –

6

Bạn có thể đặt android: attribute kích hoạt với một placeholder

AndroidManifest.xml:

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

build.config:

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

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

Điều này giải quyết vấn đề của tôi, hoàn hảo! –

Các vấn đề liên quan