編輯:關於android開發
最近有個需求,需要做兩個功能相似的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 }
android的布局-----LinearLayout(線性布局),linearlayout布局
android的布局-----LinearLayout(線性布局),linearlayout布局 學習導圖(圖片在網上下載) 知識點詳解(演示效果方便組件沒有設置id)
Android事件分發機制總結
Android事件分發機制總結 理解事件的分發機制,需要對View和ViewGroup事件的分發分別探討。View和ViewGroup的區別,一個View控件是指它裡面不
Android學習筆記--Sqlite數據庫,android--sqlite
Android學習筆記--Sqlite數據庫,android--sqlite 前幾天學習了Android中的數據存儲,包括文件存儲
PostgreSQL 9.5新特性:IMPORT FOREIGN SCHEMA
PostgreSQL 9.5新特性:IMPORT FOREIGN SCHEMA本次以故事的形式講述一名不緊跟時代步伐、不主動積極學習的員工在不了解最新特性的情況下,如何失