Android 渠道包几种技巧

Posted on Tue 02 November 2021 in 游戏开发

1. 架构

建议的架构是,游戏本体作为一个library module,每一个渠道作为一个app module,这样较为简单。

img

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中可以应用这些配置

img

    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的值,就会发生报错。