找回密码
 立即注册
查看: 277|回复: 0

在Unity中干预Android apk的编译流程 ...

[复制链接]
发表于 2022-5-10 12:00 | 显示全部楼层 |阅读模式
背景

Unity打包Android,是通过将工程输出为gradle工程,再由gradle来打包的。
如果需要对gradle工程做一些自己的定制,比如在build.gradle,AndroidManifest.xml等文件中加入自己的配置,那么可以在Editor-Project Settings-Player中来改动对应模板。



支持自定义的gradle工程模板

虽然支持这样的模板改动,但是自由度还是不够大,比如要在gradle工程根目录下新增一个config.ini配置文件,是不支持的。
调研发现,Unity提供IPostGenerateGradleAndroidProject接口,来让开发者在Gradle工程生成之后来修改一些工程文件,这就相当于Android工程里的编译时注解一样,可以很大自由度上修改工程文件和代码。
实践

以下是一个demo,在输出的gradle工程根目录下添加一个config.ini配置文件,内容为“id=1”。

  • 新建Unity Project
  • 在Assets-Editor里添加一个类AndroidPostGradle,C#代码如下:
using UnityEngine;

namespace UnityEditor.Android
{
    /**
    * gradle工程输出后,打包流程会回调所有的IPostGenerateGradleAndroidProject的实现类,执行类内的OnPostGenerateGradleAndroidProject方法
    **/
    public class AndroidPostGradle : IPostGenerateGradleAndroidProject
    {
        /**
        * 脚本执行的优先级,数字越小,越靠前执行
        **/
        public int callbackOrder => 999;

        /**
        * 执行的操作
        **/
        public void OnPostGenerateGradleAndroidProject(string path)
        {
            Debug.Log("Gradle Android: "+path);
        }
    }
}
然后编译Unity工程输出apk包,可以从控制台看到我们预期的日志,输出了工程的path,我们知道了临时的gradle工程是放在了Temp/gradleOut/unityLibrary里



C#输出了Path

打开对应目录看下gradle工程,launcher是启动用的application module,unityLibrary就是unity工程里的主逻辑,是一个library module。
原生Android工程里会有gradle文件夹,里面的配置指定了使用哪个版本的gradle工具。这个输出的工程里没有,gradle工具由Unity-Preferences里指定


综上,整体的打包流程是:

  • 将Unity工程转化为gradle工程
  • 回调所有的IPostGenerateGradleAndroidProject的实现类,执行类内的OnPostGenerateGradleAndroidProject方法
  • 通过gradle工具来打包该工程,生成apk包。
3. 更新上面的AndroidPostGradle类里的OnPostGenerateGradleAndroidProject方法,实现config.ini的新建和写入数据
public void OnPostGenerateGradleAndroidProject(string path)
{
    Debug.Log("Gradle Android: "+path);
    string configFile = path + "../config.ini";
    if (File.Exists(configFile))
    {
        File.Delete(configFile);
    }
    StreamWriter writer = File.CreateText(configFile);
    writer.WriteLine("id=1");
    writer.Flush();
    writer.Close();
}
重新打包一下,就可以看到config.ini已经如预期新建成功了,且内容与写入一致。


同理,也可以利用StreamWriter等C#工具来进行其他文件的增删改,定制自己的gradle工程。 开发者可以根据自己需求自行实践,此处不再赘述。
注:由于生成的gradle工程里没有gradle-wrapper.properties文件,所以没有办法改动gradle编译版本 ~,可以将预期的gradle版本zip包下载到本地解压,再在Unity-Preferences里指定本地路径

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 11:42 , Processed in 0.065632 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表