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. 物联网11种通信协议
  2. 0308-标签的用法(a,ul/ol,table)
  3. 负载均衡算法 — 轮询
  4. when is extension component's resource bundle loaded
  5. C++11系列学习之七---------初始化列表
  6. Web Reference和Service Reference的区别
  7. Oracle数据库日常管理之数据备份,恢复及迁移 (第五讲 )
  8. UiAutomator喷射事件的源代码分析
  9. Hbase compact入门
  10. ApacheCN 翻译活动进度公告 2019.6.21
  11. java实现 图片转ico
  12. 在别人的空间里看到的收藏在这里
  13. 虚拟网络之Kubernetes Cilium CNI 快速部署实操
  14. 酒店订房系统 java_javaweb酒店客房预订系统
  15. 谷歌开发者被封 账号中的钱_Google GMC又被封?解锁谷歌广告账号运营新姿势
  16. 【慕课笔记】第一章 JAVA初体验 第3节 使用记事本编写JAVA程序
  17. 微信建群怎么建?2个方法,快速学会!
  18. directive 自定义指令
  19. 成功帮我拿3家大厂offer(阿里、美团、虾皮),这份Java面试宝典,简直神了
  20. Chrome插件安装办法【手机端】

热门文章

  1. Spark-HDFS 删除空文件 合并小文件
  2. 阿里巴巴携手CCTV慈善之夜“搞事情”:开启公益账户,魔豆妈妈李娟当选年度慈善人物
  3. 电源升压5v芯片归纳
  4. 曾推动微信运动成为潮流的乐心,想要用小米模式跟传统医疗说不
  5. arduino 如何把模拟口当数字口使用
  6. 【数据结构】-链栈(带头结点)
  7. 图为科技-推出5G移动边缘计算盒子 AI智能MEC设备
  8. BUUctf-WEB-Havefun
  9. Utilizing BERT for Aspect-Based Sentiment Analysis via Constructing Auxiliary Sentence 论文总结
  10. Java--LinkedList