Unity 多渠道打包 APK

一个工程打包给 N 个渠道,每个渠道有自己的 应用名、应用Icon、包名、keystore、各种需要接入的SDK,甚至每个渠道有单独的资源等等

为了方便、省事、省时,决定通过脚本执行打包,下面是自己的一个思路实践,比较简单,只包含了一个 SDK,没有根据渠道来区分SDK(需后续添加),也没有为每个渠道设置单独的资源(需后续添加)。

思路:将渠道不同需求规整到一个统一的配置表,打包时读取配置表,在代码中动态设置相应的值,最终执行打包。

抽象出来的配置表如下

目前只配置了这么几个
将 Excel 导出到 xml

定义一个 配置表对应的 C# 类 BuildConfig.cs

public class BuildConfig {/// <summary>///编号/// <summary>public int id { get; private set; }/// <summary>///公司名/// <summary>public string companyName { get; private set; }/// <summary>///应用名/// <summary>public string productName { get; private set; }/// <summary>///包名/// <summary>public string bundleIdentifier { get; private set; }/// <summary>///应用图标/// <summary>public string defaultIcon { get; private set; }/// <summary>///版本号/// <summary>public string bundleVersion { get; private set; }/// <summary>///版本号/// <summary>public int bundleVersionCode { get; private set; }/// <summary>///keystore文件路径/// <summary>public string keystorePath { get; private set; }/// <summary>///keystore密码/// <summary>public string keystorePass { get; private set; }/// <summary>///别名/// <summary>public string keyaliasName { get; private set; }/// <summary>///别名密码/// <summary>public string keyaliasPass { get; private set; }/// <summary>///脚本宏定义/// <summary>public string scriptingDefine { get; private set; }/// <summary>///APK名/// <summary>public string apkName { get; private set; }}

将 channel.xml 导入到Unity 工程,
自己写一个解析 xml 的方法,

每一行的值对应赋值给 一个 BuildConfig 对象 new BuildConfig,将每个渠道配置传入打包方法,依次打包所有渠道 APK 包

代码如下,注释比较详细不细说了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System;public class BuildAPK : Editor {[MenuItem("Tool/BuildApk")]static void Build(){TextAsset textAsset = LoadXML.Instance.LoadTextAsset("Assets/Channel/channel.xml");// 读取 channel.xml 将每一行的数据赋值给 一个 BuildConfig 对象,添加到字典中// 最终将 BuildConfig 对象字典返回Dictionary<object, BuildConfig> buildConfigDic = LoadXML.Instance.GetTableData<BuildConfig>("channel", textAsset.text);// 遍历字典foreach(KeyValuePair<object, BuildConfig> kv in buildConfigDic){// 获取每个渠道的配置BuildConfig _buildConfig = kv.Value;// 执行打包Build(_buildConfig);}}private static void Build(BuildConfig buildConfig){// 公司名PlayerSettings.companyName = buildConfig.companyName;// 产品名PlayerSettings.productName = buildConfig.productName;// 包名PlayerSettings.bundleIdentifier = buildConfig.bundleIdentifier;// PlayerSettings.bundleVersion = buildConfig.bundleVersion;PlayerSettings.Android.bundleVersionCode = buildConfig.bundleVersionCode;// keystore 路径, G:\keystore\one.keystorePlayerSettings.Android.keystoreName = buildConfig.keystorePath;// one.keystore 密码PlayerSettings.Android.keystorePass = buildConfig.keystorePass;// one.keystore 别名PlayerSettings.Android.keyaliasName = buildConfig.keyaliasName;// 别名密码PlayerSettings.Android.keyaliasPass = buildConfig.keyaliasPass;// Load 应用图标,暂时放 Resource 下了Texture2D icon = Resources.Load(buildConfig.defaultIcon) as Texture2D;// 设置应用图标PlayerSettings.SetIconsForTargetGroup(BuildTargetGroup.Android, new Texture2D[] { icon, icon, icon, icon, icon, icon });BuildTargetGroup buildTargetGroup = BuildTargetGroup.Android;// 设置宏定义PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, buildConfig.scriptingDefine); // 宏定义List<string> levels = new List<string>();foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes){if (!scene.enabled) continue;// 获取有效的 Scenelevels.Add(scene.path);}BuildTarget buildTarget = BuildTarget.Android;// 切换到 Android 平台EditorUserBuildSettings.SwitchActiveBuildTarget(buildTarget);// 打包出 APK 名string apkName = string.Format("{0}.apk", buildConfig.apkName);// 执行打包string res = BuildPipeline.BuildPlayer(levels.ToArray(), apkName, buildTarget, BuildOptions.None);if (res.Length > 0){throw new Exception("BuildPlayer failure: " + res);}AssetDatabase.Refresh();}}

所有渠道 APK 使用同样的 SDK (实际项目中会有不同)

Resources\Icon 下放了几个图标

在菜单栏创建了一个 BuildApk 按钮,执行打包

打包完成在项目根目录生成了所有渠道的 APK

APK 的图标和 apk名都和配置表中对应上了,

将所有APK 同时安装到模拟器上运行测试
1.安装所有APK

6 个 APK 都可以成功安装到模拟器上

2.分别测试

不一一贴出来了。经过测试都可以成功执行

测试打包过程中遇到的一些坑

1.
图标或者应用名不是设置的,检查 AndroidManifest.xml 中 application 标签中是否添加了
应用名 android:lable
应用图标 android:icon

android:label="@string/app_name"
android:icon="@drawable/app_icon"

PlayerSettings.SetIconsForTargetGroup 方法设置的图标,打包 APK 时,会将设置的图片自动放到 APK 中 res\drawable-mdpi-v4\app_icon.png 、 res\drawable-xhdpi-v4\app_icon.png 等文件夹中,图片名字被设置成了 app_icon.png(固定设置)

应用名 app_name 到 res\values\strings.xml 中查找
app_name 的值对应为 PlayerSettings.productName 设置的值

2.
测试中发现 点击 Speak 按钮没有调用到 SDK,speak 调用的是接入的 讯飞-语音合成SDK。点击其他几个按钮,可以正常调用(其他几个为自己写的 加、减,字符串操作,不是第三方的SDK)
查找原因发现调用方法 PlayerSettings.SetIconsForTargetGroup 会将 PlayseSetting 中Icon 项中设置为 Override for Android,这里是正确的

由于 接入 讯飞 SDK 的时候没有处理好 res 下的资源,导致Unity 打包 APK时资源编译出了问题,通过清空 SDK Android 项目中 res 文件夹下没用的资源和 配置,重新导出 aar 放入Unity 中打包 APK 测试成功了

Unity 多渠道打包 APK相关推荐

  1. Android多渠道打包APK

    在网上看到一篇多渠道打包APK的,思路是没问题的,原文地址:http://www.cnblogs.com/yyyyy5101/archive/2012/10/23/2735912.html 下面是具体 ...

  2. Unity(十四)Unity配置打包APK环境Android和Java

    吐槽:换了电脑,配置Unity打包环境又花费了大量时间.特此记录下来 (文末提供云盘文件) 以下分三部分说明配置完就可以正常打包APK了,/*第一次打包建议仔细看完*/ 1. Android环境配置 ...

  3. unity 5 打包apk 手动升级android sdk 5.0 api 21

    unity5 打包apk需要将安装SDK升级到android sdk 5.0 api 21. 国内使用SDK Manager.exe更新不了,于是下载sdk包手动更新到sdk 5.0. 下载下面几个包 ...

  4. python打包apk_使用Python多渠道打包apk

    使用Python生成多渠道包 往apk包中追加到一个空文件到META-INF目录以标识渠道,Android中获取此文件即可获得App的下载渠道 首先在info文件夹新建一个qdb.txt的空文本文件 ...

  5. unity安卓打包APK安装出错

    错误信息: 解析软件包时出错 解决方案: 1.实现条件:报错手机的安卓版本为安卓12 2.解决:将unity playerSetting里的Target API Level 调整为 API Level ...

  6. unity学习—打包apk打开手机摄像头插件Vuforia(非常简单)

    插件下载地址: 链接:https://pan.baidu.com/s/1K3p5dyTNDi8cp8I0HPyOog 提取码:2t4e 下载插件后,拖进场景中 右键新建 Vuforia Engine- ...

  7. Android Studio创建签名文件,打包apk,多渠道打包

    如果这些内容可以帮到你是我的荣幸 1,点击标题栏上面的Build 2,再点击Generate Signed APK 3,如果已经有签名文件了,就直接用:如果第一次用就创建一个,点击Create new ...

  8. 【游戏开发问题】Unity打包apk提审应用宝渠道提示【暂不支持APK Signature Scheme v2】的解决办法

    文章目录 一.问题描述 二.解决办法 1.查看apk是否含有V2签名 2.重签名 3.写个python自动处理 一.问题描述 Unity项目打包apk提审应用宝渠道,提示暂不支持APK Signatu ...

  9. android 自定义apk名,Android Studio多渠道打包、自定义打包APK名称

    现在为了推广产品,会在多个渠道应用市场发布应用,为了统计不同渠道的数据,需要在应用中表明渠道,如果一个一个去修改打包效率会很低.AS为我们提供了简便的方法,可以多渠道打包,一次打包所有的渠道包. 1. ...

最新文章

  1. oracle 查询、创建、删除 数据库用户
  2. luogu P1037 【产生数】
  3. 【转载记录】Accessing Device Drivers from C#
  4. es6 Generator函数的应用
  5. linux下dns劫持C语言实现,Linux下实现劫持系统调用的总结(上)--代码及实现
  6. Number()函数转换‘单个数值的数组‘为何是数字?【JavaScript】
  7. 桥接模式Bridge
  8. HDOJ--1233--还是畅通工程
  9. Labview实现字符串加密
  10. SQL语句——查询语句
  11. 匹配区县代码_全国区县代码1
  12. 名企工资一览表--最新更新
  13. CentOS装docker
  14. matlab画多個平面,matlab的平面二维图的绘制.ppt
  15. win10 为了对电脑进行保护,已经阻止此应用 解决方法 亲测可用
  16. MGV2000_CW、JL、JZ、KA/KX、CNTV,零配置_S905L-B_全套固件(可救砖)
  17. 精简系统登录页模板html+vue+elementui
  18. parsec使用教程
  19. 前端CDN资源库,再也不用担心vue首次加载慢的问题了,vue项目必备cdn加速
  20. 显卡mx150和230哪个好_显卡mx150好吗_mx150和gt940mx对比

热门文章

  1. C语言PTA L1-063吃鱼还是吃肉
  2. php移动d盘文件,从C盘将用户文件移动到D盘
  3. HTML标签(二)及其制作简历和填写简历的应用
  4. 【从零开始vnpy量化投资】四. 编写自己的第一个策略
  5. 英语中那些和身体相关的英文单词
  6. 小米开机动画android,华为nova 5官方图赏 小米CC开机动画首曝光
  7. 计算机程序的基本构成要素,什么是程序?程序包括哪些基本要素
  8. curl第六课 Http Digest Auth认证应用
  9. Shapr3D教学----简易手机支架
  10. Android的自定义键盘颜色,如何在自定义键盘Android中动态更改键的背景颜色或主题...