這兩天爲一個App打包準備發佈上架,有幾十個渠道,須要爲每一個渠道做一些修改,好比應用名稱圖標,如今把過程當中遇到的問題及解決方法記錄下來,以備後需。java
如下是須要修改的地方:android
之前也作過相似的修改包名之類的字符串這類的小改動,問題不大,此次遇到的問題是, 須要爲各個渠道配置不一樣的應用圖標和啓動頁,這是之前沒有作過的。下面是每一個點解決方法。app
一、修改包名。gradle
修改包名是這四個中最簡單的,只須要在 productFlavors 中 的每一個渠道里重寫 applicationId:ui
productFlavors { hello{ applicationId "com.xxx.xxxx" } }
二、渠道商信息server
不一樣渠道商信息的配置其實和修改包名差很少,不一樣的是它的格式是,好比配置一個渠道商ID,用buildConfigField "int", "AGENT_ID", "1",這樣編譯後在BuildConfig文件下生成:public static final int AGENT_ID = 1;而後你就能夠BuildConfig.AGENT_ID 這樣引用。渠道商名稱的話用buildConfigField "String", "AGENT_NAME", "\"xx\""。這樣生成public static final String AGENT_NAME = "xx";xml
Ahello { applicationId "com.xxx.xxxx"//修改包名 buildConfigField "int", "AGENT_ID", "1"//渠道商ID buildConfigField "String", "AGENT_NAME", "\"Ahello\""//渠道商名稱 }
三、修改應用名blog
修改應用名就不像上面那麼簡單,不過查了一下也不難。使用的是:resValue "string", "你要設置的key", "你要設置的值"圖片
resValue "string", "app_name", "Ahello"
須要注意的是這個是resValue 是增長一個值,若是你在string.xml中已經有一個app_name,請先刪除,不然編譯不過。資源
Ahello { applicationId "com.xxx.xxxx"//修改包名 buildConfigField "int", "AGENT_ID", "1"//渠道商ID buildConfigField "String", "AGENT_NAME", "\"Ahello\""//渠道商名稱 resValue "string", "app_name", "Ahello"//應用名 resValue "string", "copyright", "Ahello @ 2018" resValue "string", "customer_server_phone_number", "財富熱線:110110" }
四、修改圖標、圖片資源
修改圖片資源花費的時間最多,我先想到的兩種方案,第一把要修改的圖標按渠道商命名,而後所有丟到drawable裏。而後修改AndroidManifest.xml裏android:icon="${app_icon}"
<application android:name="com.xxx.xxx" android:allowBackup="true" android:icon="${app_icon}" android:label="@string/app_name" android:supportsRtl="false" tools:replace="android:supportsRtl,android:label" android:theme="@style/AppTheme.NoActionBar">
在gradle裏則加manifestPlaceholders = [app_icon: "@drawable/logo_xxxx"]
Ahello { applicationId "com.xxx.xxxx"//修改包名 buildConfigField "int", "AGENT_ID", "1"//渠道商ID buildConfigField "String", "AGENT_NAME", "\"Ahello\""//渠道商名稱 resValue "string", "app_name", "Ahello"//應用名 resValue "string", "copyright", "Ahello @ 2018" resValue "string", "customer_server_phone_number", "財富熱線:110110" manifestPlaceholders = [app_icon: "@drawable/logo_xxxx"]//應用圖標 }
可是這種方法有一個顯而易見的缺點,就是A渠道包裏憑空多了幾十個其餘渠道包的圖片,形成了apk包過大,這不是我想要的結果。
而後第二種方法是,爲不一樣的渠道拉分支,這樣能夠避免apk過大問題,而且以上這些配置均可以省,可是拉分支就不能批量打包,一個個打太麻煩了。果斷放棄。
而後問了朋友有沒有解決方法,朋友能夠分渠道建文件夾,把圖片同一命名分別放到各渠道文件夾,而後gradle裏寫sourceSets
Ahello { applicationId "com.xxx.xxxx"//修改包名 sourceSets { Ahello { res.srcDirs = ['src_custom/Ahello/res'] } } }
這種方法能夠有效解決換圖片問題,同時,還能夠替換assets文件夾文件,甚至java類文件
Ahello { applicationId "com.xxx.xxxx"//修改包名 sourceSets { Ahello { res.srcDirs = ['src_custom/Ahello/res']//替換res文件 rassets.srcDirs = ['src_custom/Ahello/assets']//替換assets文件 java.srcDirs = ['src_custom/Ahello/java']//替換java類文件 } } }
因此最後的完整修改是:
Ahello { applicationId "com.xxx.xxxx"//修改包名 buildConfigField "int", "AGENT_ID", "1"//渠道商ID buildConfigField "String", "AGENT_NAME", "\"Ahello\""//渠道商名稱 resValue "string", "app_name", "Ahello"//應用名 resValue "string", "copyright", "Ahello @ 2018" resValue "string", "customer_server_phone_number", "財富熱線:110110" manifestPlaceholders = [app_icon: "@drawable/logo_xxxx"]//應用圖標 sourceSets { Ahello { res.srcDirs = ['src_custom/Ahello/res']//替換res文件 rassets.srcDirs = ['src_custom/Ahello/assets']//替換assets文件 java.srcDirs = ['src_custom/Ahello/java']////替換類文件 } } }
我以爲每一個渠道都寫一個sourceSets,再從新寫渠道名,這樣寫有點麻煩,就把sourceSets這部分單獨拿出來放到defaultConfig裏。固然這兩種寫法各有缺點,看我的習慣。
這裏有個小插曲,我在爲不一樣渠道建立文件時,無心發現android studio已經爲上述問題提供瞭解決方案。具體是這樣的:項目右鍵-->new-->Android Resource Directory.
as已經內置了不一樣的類型可供選擇,而且能夠選擇渠道,省去了gradle裏手動寫配置。但也有一個問題,就是建立的文件夾跟main是同一級的,像咱們這樣有幾十個渠道,就會顯得很混亂。
因此我最後沒有采用as內置的方法,而用上面一種。
第一次寫,寫得有點亂,就這樣。