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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...