• Unity自动打包Apk


    unity打包apk相对来说比较容易,相信出过的人都明白,出包过程,没有大的难度,一步一操作,一步一等待,繁琐耗时,不懂的人又代替不了。这时候需求就来了,如何简单的一键打包搞定,这个就稍微有点难度,当然作为程序员就是要解决这些问题,封装变化,变繁为简。

    打包apk大概可以分为以下步骤(出apk需要的jdk,Android sdk这些不用多说,相信大家都会配置)
    1、配置PlayerSetting 
    2、配置渠道等第三方SDK
    3、copy外部资源和一些自己工程需要的一些配置
    4、unity打包build(如果出成Android工程,还需要就行Android工程的自动打包apk)
    没有什么难的东西,都是一些配置,繁琐的东西,一键化也就是写个脚本,按照步骤一步一步的执行就行了
    很简单相信大家都会,只是一些细节需要注意一下,细节中还是有一些坑的
     
    一、配置PlayerSetting 
     有两种方法
    1、事先使用PlayerSetting 编辑页面保存一个配置好的ProjectSettings.asset,需要的时候直接替换掉ProjectSettings目录下的ProjectSettings.asset就行了
    设置分离obb文件的属性,有的人可能不知道
    2、使用代码设置PlayerSetting(凡是在PlayerSetting编辑页面看到的属性都是可以使用代码进行设置的)
     (1)、Unity提供了命令行方式进行打包、调用方法等操作
    command line形式: unity执行文件路径 -projectPath 项目工程路径 -executeMethod 方法名 各种参数
    在unity项目Editor下的一个继承ScriptableObject的文件中的static方法都可以使用unity command line执行(注意Unity需要是关闭的)
    $unity_path -projectPath $project_path -quit -batchmode -executeMethod ProjectBuild.ProjectSetting -qmplatform $platform 
    //$unity_path unity执行文件路径 //$project_path 项目工程路径
    //-batchmode 不打开unity //-executeMethod 执行unity方法 //ProjectBuild.ProjectSetting Editor下的脚本名为ProjectBuild,其中有个名为ProjectSetting的方法,具体代码如下 //-qmplatform $platform 传入的参数

     (2)、有一些属性设置,比较难找,使用 PlayerSettings.SetPropertyInt("ScriptingBackend", (int)ScriptingImplementation.Mono2x, BuildTarget.iPhone); 慢慢尝试

     1   class ProjectBuild : Editor
     2     {
     3         const string OPT_PLATFORM = "-qmplatform";
     4         const string OPT_BUNDLE_VERSION = "-qmbundle_version";
     5         const string OPT_SHOW_VERSION = "-qmshow_version";
     6         const string OPT_VERSION_CODE = "-qmversion_code";
     7         /// <summary>
     8         /// 根据参数配置Unity ProjectSetting
     9         /// </summary>
    10         static void ProjectSetting()
    11         {
    12             Dictionary<string, string> settings = new Dictionary<string, string>();
    13             settings[OPT_PLATFORM] = "";
    14             settings[OPT_BUNDLE_VERSION] = "";
    15             settings[OPT_SHOW_VERSION] = "";
    16             settings[OPT_VERSION_CODE] = "";
    17             string[] args = System.Environment.GetCommandLineArgs();
    18             ParseArgs(settings, args);//解析参数
    19 
    20             PlayerSettings.companyName = "****";
    21             PlayerSettings.bundleVersion = settings[OPT_BUNDLE_VERSION];
    22             PlayerSettings.shortBundleVersion = settings[OPT_SHOW_VERSION];
    23             PlayerSettings.defaultInterfaceOrientation = UIOrientation.AutoRotation;
    24             PlayerSettings.allowedAutorotateToLandscapeLeft = true;
    25             PlayerSettings.allowedAutorotateToLandscapeRight = true;
    26             PlayerSettings.strippingLevel = StrippingLevel.StripByteCode;
    27             PlayerSettings.aotOptions = "nimt-trampolines=512,ntrampolines=2048";
    28             PlayerSettings.targetGlesGraphics = TargetGlesGraphics.Automatic;
    29             PlayerSettings.Android.preferredInstallLocation = AndroidPreferredInstallLocation.Auto;
    30             PlayerSettings.Android.targetDevice = AndroidTargetDevice.FAT;
    31             PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel9;
    32             PlayerSettings.Android.forceInternetPermission = true;
    33             PlayerSettings.Android.forceSDCardPermission = true;
    34             PlayerSettings.Android.bundleVersionCode = int.Parse(settings[OPT_VERSION_CODE]);
    35             PlayerSettings.Android.useAPKExpansionFiles = true;//是否使用obb分离模式
    36             PlayerSettings.productName = "******";
    37             PlayerSettings.bundleIdentifier = "*****";
    38             PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, "宏定义");//宏定义的设置
    39             EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTarget.Android);
    40         }
    41     }

    (3)、对于一些如Icon、splash页面的设置可以使用原名替换图片的方法

    (4)、 PlayerSettings.Android.useAPKExpansionFiles = true;//是否使用obb分离模式,这个主要是针对Google play的

    obb的命名,是需要一定的规则的,不然无法使用,可以使用代码自动设置obb的名字在Editor目录下有这个方法,出包时会自动调用,可以在这里设置
    (如果需要对dll文件进行加密的话,肯定是出成了Android工程,这里可以获取Android工程中的dll文件进行加密,同时替换可以解密的so文件)
      [PostProcessBuild(90)]
    public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject)
    {
        files = Directory.GetFiles(pathToBuiltProject, "*", SearchOption.AllDirectories);
        if (files != null)
        {
              foreach (string fileName in files)
              {
                   if (fileName.Contains(".obb"))
                   {
                       int bundleVersion = PlayerSettings.Android.bundleVersionCode;
                       string bundlePackageName = PlayerSettings.bundleIdentifier;
                       Directory.Move(fileName, pathToBuiltProject + "/main." + bundleVersion + "." + bundlePackageName + ".obb");
                   }
               }
        }
    }

     obb的使用上的还有一点小小的坑,Google play商店在下载游戏的时候,会自动下载apk所需的obb,但是有时候也不能保证一定成功,所以需要项目本身就具有这样的检测下载功能https://www.assetstore.unity3d.com/en/#!/content/3189这里有非常详细的代码,可以copy直接使用

    二、配置渠道等第三方SDK和copy外部资源
    1、sdk的接入
    统一接口,支持不同各种渠道的sdk接入
    http://blog.csdn.net/chenjie19891104/article/details/42217281这个可以看一下
    2、和不同渠道绑定的参数,建议拿出来做配置,可以不用重新出版本就可以切换不同渠道的版本
    3、sdk切换相关目录资源的替换,unity直接出成apk的话,就在unity打包之前,如果是先出Android工程的话,也可以在Android工程中进行,效率会更快一点,不需要再从unity build就可以出成不同的渠道包 
     
    三、unity打包build
    unity build Android 可以直接打包成apk或是Android工程,使用命令行调用的方式跟上面ProjectSetting的类似,-executeMethod 的参数名换成相应函数名即可,
    static void Build()
     {
               string android_project_path = "";//目标目录
                BuildTarget target = BuildTarget.Android;
                string[] outScenes = GetBuildScenes();//需要打包的scene名字数组
                BuildPipeline.BuildPlayer(outScenes , android_project_path, target, BuildOptions.AcceptExternalModificationsToPlayer);
     }
    // BuildOptions.AcceptExternalModificationsToPlayer
    表示出成Android工程
    直接打包apk就不用多说了,build成功就行了
     
    出成Android工程后还需要几步才能完成
    1、Android工程,自动打包apk,需要配置ant环境

    到官方主页http://ant.apache.org下载新版(目前为Ant1.9.6)的ant,得到的是一个apache-ant-1.9.6-bin.zip的压缩包。将其解压到你的硬盘上,例如:C:apache-ant-1.9.6。然后配置环境变量

    ANT_HOME    C:/ apache-ant-1.9.6

    path             C:/ apache-ant-1.9.6/bin

    classpath      C:/apache-ant-1.9.6/lib

    2、可以在Android工程中进行资源和渠道SDK的替换(也就是目录文件的替换),这样可以一个工程出成不同的渠道包
    3、签名的需要的ant.properties,这里写着Android签名文件的目录,用户名和密码,需要事先写好,copy到Android工程目录下

        key.store=./config/xxx.keystore

        key.alias=xxx

        key.store.password=xxx

        key.alias.password=xxx

    4、使用Android command line生成build.xml(这是ant签名打包的必须文件) 
    command line形式:  android update project -p Android工程路径 -n 生成apk的名字(这个command line的使用需要配置一下环境变量)
    android update project -n $apk_name -t 1 -p "$android_pj_path"
    //$apk_name  生成apk的名字
    //"$android_pj_path"  Android工程路径

    5、使用ant release,这个command line需要在Android工程目录下执行,不然command line会找不到路径,最后在bin目录下生成apk文件,有签名的和不签名的

    可以考虑与Jenkin结合使用,会更方便操作

    (by sht)

  • 相关阅读:
    Kubernetes 学习15 kubernetes 认证及serviceaccount
    Kubernetes 学习14 kubernetes statefulset
    Kubernetes 学习13 kubernetes pv pvc configmap 和secret
    Day_13【IO流】扩展案例2_统计指定项目文件中字符出现的次数
    Day_13【IO流】扩展案例1_读取项目文件内容并去重
    Day_12【集合】扩展案例4_判断字符串每一个字符出现的次数
    Day_12【集合】扩展案例3_产生10个长度为10,不能重复,由数字0-9,小写字母和大写字母组成的字符串
    Day_12【集合】扩展案例2_键盘录入一个字符串,对其进行去重,并将去重后的字符串组成新数组
    Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序
    Day_11【集合】扩展案例5_对list集合对象中的元素进行反转,求最大值最小值,求元素i在list集合中首次出现的索引,将oldvalue替换为newvalue
  • 原文地址:https://www.cnblogs.com/upstudio/p/5236194.html
Copyright © 2020-2023  润新知