對(duì)于Android手機(jī)來(lái)說(shuō)灸蟆,不同渠道的應(yīng)用使用不同的界面和邏輯是常有的事。甚至有時(shí)候同一個(gè)App還得以不同的名稱和面貌出現(xiàn)发皿。如果需要使這些不同面貌但內(nèi)在一樣的App能在同一部手機(jī)上安裝崔慧,那就需要使用不同的包名。那么我們預(yù)先設(shè)置好不同渠道的打包方式穴墅,日后的維護(hù)就很簡(jiǎn)單了惶室。
這里幾個(gè)基本點(diǎn)列一下。
1.設(shè)置渠道
在build.gradle里設(shè)置
defaultConfig {
...
flavorDimensions "money"
}
...
productFlavors {
green_site {
dimension "money"
}
home_site {
dimension "money"
}
}
以上就設(shè)置了兩個(gè)渠道玄货,只不過(guò)這兩個(gè)渠道沒(méi)有設(shè)置任何個(gè)性化的區(qū)別皇钞,暫時(shí)還沒(méi)有意義。
2.設(shè)置不同的logo和名稱
我們加一點(diǎn)細(xì)節(jié)
productFlavors {
green_site {
dimension "money"
resValue "string", "app_name", "綠色版"
manifestPlaceholders = [app_icon: "@mipmap/logo_4_green"]
}
home_site {
dimension "money"
resValue "string", "app_name", "正式版"
manifestPlaceholders = [app_icon: "@mipmap/logo"]
}
}
這里通過(guò)resValue
加入了應(yīng)用名稱的設(shè)置松捉。要注意的是需要把原先strings.xml
文件中的app_name
去掉夹界,不然會(huì)沖突。
然后通過(guò)manifestPlaceholders
設(shè)置AndroidManifest
中可以使用的變量隘世。這里我們?cè)O(shè)置了app_icon
可柿。
那么對(duì)應(yīng)的,在AndroidManifest
中以"${app_icon}"
的形式調(diào)用以上變量設(shè)置logo丙者。
<application
android:allowBackup="true"
android:icon="${app_icon}"
android:label="@string/app_name"
android:name=".App"
android:roundIcon="${app_icon}"
android:supportsRtl="true">
</application>
現(xiàn)在我們?cè)诓煌老掠胁煌拿Q和logo了复斥。
但是,這兩個(gè)安裝包還無(wú)法在同一部手機(jī)上并存械媒,因?yàn)樗麄兊陌且粯拥哪慷В举|(zhì)上還是同一個(gè)App。
3.設(shè)置不同的包名
productFlavors {
green_site {
dimension "money"
resValue "string", "app_name", "綠色版"
applicationId "com.greenapp"
manifestPlaceholders = [app_icon: "@mipmap/logo_4_green"]
}
home_site {
dimension "money"
resValue "string", "app_name", "正式版"
applicationId "com.myapp"
manifestPlaceholders = [app_icon: "@mipmap/logo"]
}
}
這里我們添加了applicationId
纷捞。
然后痢虹,在build.gradle里調(diào)用他。
defaultConfig {
applicationId "${applicationId}"
...
}
現(xiàn)在主儡,我們打包出來(lái)后相當(dāng)于兩個(gè)App奖唯,可以同時(shí)在一部手機(jī)上安裝了。
這里要注意的是打包的簽名也要設(shè)置不同的文件缀辩,很多平臺(tái)是要認(rèn)簽名的臭埋。
4.設(shè)置不同的FileProvider
如果你的App有使用FileProvider
踪央。那么還要設(shè)置一下,畢竟FileProvider
是和包名關(guān)聯(lián)的瓢阴。不然會(huì)報(bào)同名錯(cuò)誤畅蹂。
我們?cè)僭黾右粋€(gè)變量authorities
productFlavors {
green_site {
dimension "money"
resValue "string", "app_name", "綠色版"
applicationId "com.greenapp"
manifestPlaceholders = [app_icon: "@mipmap/logo_4_green",authorities:"com.greenapp.FileProvider"]
}
home_site {
dimension "money"
resValue "string", "app_name", "正式版"
applicationId "com.myapp"
manifestPlaceholders = [app_icon: "@mipmap/logo",authorities:"com.myapp.FileProvider"]
}
}
然后在AndroidManifest
中設(shè)置Provider
<application
android:allowBackup="true"
android:icon="${app_icon}"
android:label="@string/app_name"
android:name=".App"
android:roundIcon="${app_icon}"
android:supportsRtl="true">
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${authorities}"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
以上,完工荣恐。