Unity升级gradle打包apk
- 这里Unity2018.4.36,Android studio2020.3.1 Patch 3
- 修改Unity设置Edit->Preferences->External Tools 取消勾选Gradle Installed with Unity 浏览到Android Studio自带的gradle(这里是gralde-7.0.2)
- 修改unity配置 使用自定义mainTemplate.gradle 勾选File->Build Settings->Player Settings->Android->Publish Settings->Custom Gradle Template, 在工程中生成Plugins->Android->mainTemplate.gradle文件
- 修改mainTemplate.gradle
buildscript->dependencies中修改classpath 提升gradle版本com.android.tools.build:gradle:7.0.0
dependencies下加入需要依赖的库
com.google.android.gms:play-services-auth:19.2.0
com.android.billingclient:billing:4.0.0
pub.devrel:easypermissions:3.0.0
android->aaptOptions中**STREAMING_ASSETS**会列出所有StreamingAssets目录下的文件,文件数量多的时候会导致出包非常慢甚至出包失败,默认的选项修改为通配符
Unity打包过程临时生成的apk在升级gradle以后不匹配会报找不到apk文件,修改生成的apk文件名字android块中添加
android.applicationVariants.all {variant ->
variant.outputs.all {
outputFileName = "gradleOut-release.apk"
}
}
- 新版gradle要求使用Java11, Unity中Editor目录添加文件生成gradle.properties, org.gradle.java.home值为Java11 jre所在目录代码如下:
using UnityEditor.Android;
using System.IO;
public class AndroidPostBuildProcessor : IPostGenerateGradleAndroidProject
{
public int callbackOrder
{
get
{
return 999;
}
}
void IPostGenerateGradleAndroidProject.OnPostGenerateGradleAndroidProject(string path)
{
string gradlePropertiesFile = path + "/gradle.properties";
if (File.Exists(gradlePropertiesFile))
{
File.Delete(gradlePropertiesFile);
}
StreamWriter writer = File.CreateText(gradlePropertiesFile);
writer.WriteLine("org.gradle.jvmargs=-Xmx4096M");
writer.WriteLine("org.gradle.java.home=C:/Program Files/Android/Android Studio/jre");
writer.WriteLine("android.useAndroidX=true");
writer.WriteLine("android.enableJetifier=true");
writer.Flush();
writer.Close();
}
}
- 其它问题
androis studio 导出jar包里面会带com.xxx.xxx.BuildConfig.class,直接放到Unity打包会报错BuildConfig.class重复,用解压工具打开jar删除里面的BuildConfig.class
导出代码jar包到unity里面使用(aar没这个问题),代码中引用res资源his.getString(R.string.strId)会找不到,使用反射获取
String srt = AndroidUtil.getRStr("string_id", this);
/**
* 根据给定的类型名和字段名,返回R文件中的字段的值
* @param fieldName 字段名
* @return 字段的值
* @throws Exception
*/
public static String getRStr(String fieldName, Context context){
String retStr = null;
try {
int stringId = context.getResources().getIdentifier(fieldName, "string", contextgetPackageName());
retStr = context.getResources().getString(stringId);
} catch (Exception e) {
Log.d(""+context.getClass(),"can't find"+ context.getPackageName() +".R$string +fieldName);
return null;
}
return retStr;
}
wzby安卓工程导出aar的时候报错本地aar不能直接依赖,临时改用compileOnly