最近有個需求,需要做兩個功能相似的APP,大部分代碼是一樣的,只是界面不一樣,以前要維護兩套代碼,比較麻煩,最近在網上找資料,發現可以用gradle使用同一套代碼構建兩個APP。下麵介紹使用方法: 首先要構建兩個APP需要有兩個APP圖標、APP名字和AndroidManifest.xml。Andr ...
最近有個需求,需要做兩個功能相似的APP,大部分代碼是一樣的,只是界面不一樣,以前要維護兩套代碼,比較麻煩,最近在網上找資料,發現可以用gradle使用同一套代碼構建兩個APP。下麵介紹使用方法:
首先要構建兩個APP需要有兩個APP圖標、APP名字和AndroidManifest.xml。AndroidManifest放置目錄如下:
gradle構建需要用的配置文件build.gradle。 要使用兩個AndroidManifest需要在build.gradle文件中配置sourceSets
1 sourceSets 2 { 3 4 app1 5 { 6 manifest.srcFile 'src/main/manifest/AndroidManifest1.xml' 7 } 8 app2 9 { 10 manifest.srcFile "src/main/manifest/AndroidManifest2.xml" 11 } 12 }
同時需要修改AndroidManifest添加xmlns:tools和tools:replace如下:
1 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 package="com.Example.app1"> 4 5 <application 6 android:allowBackup="true" 7 android:icon="@drawable/ic_launcher" 8 android:label="@string/app_name" 9 android:theme="@style/AppTheme" 10 tools:replace="android:icon,android:label">
android:icon,android:label表示需要使用不同的icon和label。
要使用兩個不同的包名,需要在build.gradle文件中配置productFlavors
1 productFlavors{ 2 3 4 5 6 app1 7 { 8 applicationId "com.Example.app1" 9 versionCode 37 10 versionName "2.0.0" 11 manifestPlaceholders = [APPNAME: "app1"] 12 } 13 app2 14 { 15 applicationId "com.Example.app2" 16 versionCode 5 17 versionName "1.0.4" 18 manifestPlaceholders = [APPNAME: "app2"] 19 } 20 21 }
productFlavors中配置了不同的包名和版本信息以及變數APPNAME。APPNAME的值可以用在AndroidManifest中:
<meta-data android:name="APPNAME" android:value="${APPNAME}" />
完整的build.gradle如下:
1 apply plugin: 'com.android.application' 2 3 android { 4 5 compileSdkVersion 22 6 buildToolsVersion '23.0.2' 7 8 defaultConfig { 9 minSdkVersion 19 10 targetSdkVersion 22 11 12 } 13 buildTypes { 14 release { 15 minifyEnabled true 16 shrinkResources true 17 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 } 19 debug 20 { 21 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 22 } 23 } 24 25 26 packagingOptions { 27 exclude 'META-INF/DEPENDENCIES.txt' 28 exclude 'META-INF/LICENSE.txt' 29 exclude 'META-INF/NOTICE.txt' 30 exclude 'META-INF/NOTICE' 31 exclude 'META-INF/LICENSE' 32 exclude 'META-INF/DEPENDENCIES' 33 exclude 'META-INF/notice.txt' 34 exclude 'META-INF/license.txt' 35 exclude 'META-INF/dependencies.txt' 36 exclude 'META-INF/LGPL2.1' 37 } 38 sourceSets 39 { 40 41 app1 42 { 43 manifest.srcFile 'src/main/manifest/AndroidManifest1.xml' 44 } 45 app2 46 { 47 manifest.srcFile "src/main/manifest/AndroidManifest2.xml" 48 } 49 } 50 51 52 productFlavors{ 53 54 55 56 57 app1 58 { 59 applicationId "com.Example.app1" 60 versionCode 37 61 versionName "2.0.0" 62 manifestPlaceholders = [APPNAME: "app1"] 63 } 64 app2 65 { 66 applicationId "com.Example.app2" 67 versionCode 5 68 versionName "1.0.4" 69 manifestPlaceholders = [APPNAME: "app2"] 70 } 71 72 } 73 74 } 75 76 allprojects { 77 repositories { 78 maven { url "https://jitpack.io" } 79 } 80 } 81 82 dependencies { 83 compile fileTree(dir: 'libs', include: ['*.jar']) 84 }