多渠道打包早已不是什么新技术,网上一搜千千万万数不尽数,但是对于没使用过的开发者,看了网上复制又复制的文章却是一头雾水,完全找不到符合自己需求的多渠道配置,以下总结:
需求:
- 不同渠道,配置不同包名。
- 不同渠道,不同app名称。
- 不同渠道,icon需要对应。
- 不同渠道,版本号需要单独指定。
代码撸起来:
gradle的多渠道配置,利用productFlavors 需要几个包就配置几个马甲,在android{} 里面添加如下:
productFlavors {
baidu {}
xiaomi {}
huawei {}
}
配置三个渠道,然后 Sync Now,发现报错:
ERROR: All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html
Affected Modules: app
defaultConfig下添加`
flavorDimensions "versionName"
根据需求配置:
AndroidManifest.xml 的application里面需先配置 meta:
<meta-data
android:name="CHANNEL"
android:value="${CHANNEL_VALUE}" />
productFlavors {
baidu{
applicationId "com.allen.channel.baidu"
versionName "1.0.1"
resValue "string", "app_name", "百度"
manifestPlaceholders = [CHANNEL_VALUE: "baidu"
,app_icon : "@mipmap/app_icon"]
}
xiaomi{
applicationId "com.allen.channel.xiaomi"
versionName "1.0.2"
resValue "string", "app_name", "小米"
manifestPlaceholders = [CHANNEL_VALUE: "xiaomi"
,app_icon : "@mipmap/app_icon"
]
}
huawei{
applicationId "com.allen.channel.huawei"
versionName "1.0.3"
resValue "string", "app_name", "华为"
manifestPlaceholders = [CHANNEL_VALUE: "huawei"
,app_icon : "@mipmap/app_icon"
]
}
}
说明:
applicationId:顾名思义,指定对应马甲的包名。
versionName:这个不用说。
resValue:指定马甲的应用名称,注意:如果马甲中指定了app的名称,项目中的strings.xml文件的app_name必须删除
<resources>
<string name="app_name">安安</string>
</resources>
manifestPlaceholders:指定马甲的icon,需要在src目录下新建相对应渠道的文件夹:
该目录下可以存放res等资源文件,如华为马甲为例:
manifestPlaceholders = [CHANNEL_VALUE: "huawei"
,app_icon : "@mipmap/app_icon"
]
在“huawei”渠道目录下的mipmap文件夹中有一张app_icon的图片,实例:
发现我把其他渠道的icon名称都配了“app_icon”,这个不是固定,自定义的。主目录下的app_icon是默认的,AndroidManifest.xml默认配置。
AndroidManifest如下:
打包
签名包需要在gradle配置signingConfigs:
signingConfigs {
release {
storeFile file('channel.jks')
storePassword '123456'
keyAlias 'channel'
keyPassword '123456'
}
debug {
storeFile file('channel.jks')
storePassword '123456'
keyAlias 'channel'
keyPassword '123456'
}
}
channel.jks我已放置app目录下。
双击–》
assemble:打出来的包,包含release和debug两种类型。
assembleDebug:只有debug。
assembleRelease:只有release。
也可以渠道单独打包,如assembleXiaomi等等可以自己尝试。
我双击assembleRelease之后:
注意位置查看,打出来的都是release。
最后我在MainActivity中获取渠道测试:
public class MainActivity extends AppCompatActivity {
private TextView tv_content;
private TextView tv_id;
private TextView tv_channel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_id = findViewById(R.id.tv_id);
tv_channel = findViewById(R.id.tv_channel);
tv_content = findViewById(R.id.tv_content);
tv_id.setText(BuildConfig.APPLICATION_ID);
tv_channel.setText(BuildConfig.FLAVOR);
tv_content.setText(BuildConfig.VERSION_NAME);
}
}
简单获取对应的渠道信息。
效果:
来源:CSDN
作者:LL继续前进
链接:https://blog.csdn.net/u013836857/article/details/104048530