Android 渠道包几种技巧
Posted on Tue 02 November 2021 in 游戏开发
1. 架构
建议的架构是,游戏本体作为一个library module,每一个渠道作为一个app module,这样较为简单。
2. 编译缓慢
给gradle换国内源
repositories {
maven{ url'https://maven.aliyun.com/repository/google' }
maven{ url'https://maven.aliyun.com/repository/public' }
}
3. 命令行传入编译参数
gradlew :app:buildRelease -Papp_name=我的游戏
项目的总build.gradle中写
ext {
app_id = project.hasProperty("app_id") ? project.property('app_id') : 'com.example.laya_template'
app_name = project.hasProperty("app_name") ? project.property('app_name') : 'testgame'
version_code = Integer.parseInt(project.hasProperty("version_code") ? project.property('version_code') : "1")
version_name = project.hasProperty("version_name") ? project.property('version_name') : "0.0.1"
channel_app_id = project.hasProperty("channel_app_id") ? project.property('channel_app_id') : ""
channel_app_id2 = project.hasProperty("channel_app_id2") ? project.property('channel_app_id2') : ""
channel_splash_id = project.hasProperty("channel_splash_id") ? project.property('channel_splash_id') : ""
}
app项目的gradle中可以应用这些配置
defaultConfig {
minSdk 19
targetSdk 30
applicationId rootProject.ext.app_id
versionCode rootProject.ext.version_code
versionName rootProject.ext.version_name
manifestPlaceholders = [
app_name: rootProject.ext.app_name,
channel_app_id: rootProject.ext.channel_app_id,
channel_app_id2: rootProject.ext.channel_app_id2,
channel_splash_id: rootProject.ext.channel_splash_id,
];
}
同时传入到AndroidManifest.xml中:
<meta-data android:name="channel_app_id" android:value="${channel_app_id}" />
<meta-data android:name="channel_app_id2" android:value="${channel_app_id2}" />
<meta-data android:name="channel_splash_id" android:value="${channel_splash_id}" />
传入后可以在application或者activity中获取:
public String getMetaData (String key) {
try {
ApplicationInfo appInfo = getPackageManager()
.getApplicationInfo(getPackageName(),
PackageManager.GET_META_DATA);
return appInfo.metaData.getString(key);
} catch (PackageManager.NameNotFoundException e) {
}
return null;
}
可能这里会有一个问题:是不是我所有渠道app模块都需要写一遍AndroidManifest.xml?
不用。在gamecore的AndroidManifest.xml里写,编译后所有app都可以读取到对应的值。
但是注意一点,虽然AndroidManifest.xml最终会被合并,但是manifestPlaceholders不会共享,例如如果我想在app_vivo中写一条:
<meta-data android:name="test222" android:value="${app_name}" />
如果在app_vivo的build.gradle中没有定义app_name的值,就会发生报错。