BlaXuan 发表于 2022-5-10 12:00

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

背景

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里指定本地路径
页: [1]
查看完整版本: 在Unity中干预Android apk的编译流程 ...