Android studio使用gradle動態構建APP(不同的包,不同的icon、label)

来源:http://www.cnblogs.com/l2rf/archive/2016/12/16/6186833.html
-Advertisement-
Play Games

最近有個需求,需要做兩個功能相似的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 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux是單內核系統,可通用計算平臺的外圍設備是頻繁變化的,不可能將所有的(包括將來即將出現的)設備的驅動程式都一次性編譯進內核,為瞭解決這個問題,Linux提出了可載入內核模塊(Loadable Kernel Module,LKM)的概念,允許一個設備驅動通過模塊載入的方式,在內核運行起來之後" ...
  • 搭建環境:Centos6.5_x86_64,Zabbix2.4.5,epel 源 服務端: 1.安裝開發軟體包yum -y groupinstall "Development Tools" 2.安裝所需的依賴包yum -y install httpd mysql mysql-server mysql ...
  • ...
  • 原型設計模式: 用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。 原型設計模式簡單的來說,顧名思義, 不去創建新的對象進而保留原型的一種設計模式。 缺點:原型設計模式是的最主要的缺點就是這個克隆方法需要對類的功能進行檢測,這對於全新的類來說較容易,但對已有的類進行改造時將不是件容易的 ...
  • 轉自:http://www.jb51.net/article/42671.htm 在開始之前先說一點,DOM是非常容易理解的,但是大家說的太官方,讓人很是難於理解,我們就用非常簡單的語言翻譯一遍。加深對DOM的理解,從而對它有一個全面的認識。 什麼是DOM DOM的全稱是Document Objec ...
  • 謹記(指定選擇器Intent.createChooser()) 開始今天的內容前,先閑聊一下: (1)突然有一天頭腦風暴,對很多問題有了新的看法和見解,迫不及待的想要分享給大家,文檔已經寫好了,我需要通過微信或者QQ,簡訊等社交工具發送給大家。 (2)在網上發現一段特別好的文章,想要保存收藏下來。 ...
  • 谷歌並沒有給出沉浸式狀態欄這個概念,谷歌只說了沉浸式模式(Immersive Mode)。 ...
  • ionic第二坑——ionic 上拉菜單(ActionSheet)安卓樣式坑 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...