using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; namespace TyphoonUnitySDK { [CustomEditor(typeof(TempPublishGooglePlay))] public class TempPublishGooglePlayEditor : Editor { [MenuItem("临时发布/发布google play")] private static void Open() { InspectorWindow.Open( Editor.CreateEditor(TempPublishGooglePlay.Default, typeof(TempPublishGooglePlayEditor))); } private TempPublishGooglePlay Target => target as TempPublishGooglePlay; class ProjInfo { public string Path; public long BuildTime; public ProjInfo(string path, long buildTime) { Path = path; BuildTime = buildTime; } } public override void OnInspectorGUI() { base.OnInspectorGUI(); if (GUILayout.Button("保存配置", GUILayout.Height(44))) { EditorUtility.SetDirty(Target); AssetDatabase.SaveAssets(); } if (GUILayout.Button("一键发布", GUILayout.Height(44))) { UniEditor.ShowMessageBox("发布?", Publish); } } private bool TryGetNearestUnityProj(out string path) { path = default; var dir = $".typhoonoutput"; var directories = Directory.GetDirectories(dir); var matches = new List(); foreach (var element in directories) { Debug.Log(element); var name = Path.GetFileName(element); Debug.Log(name); if (name.StartsWith("google_play_")) { var timeString = name.Replace("google_play_", ""); if (long.TryParse(timeString, out var time)) { Debug.Log($"加入:{element}"); matches.Add(new ProjInfo(element, time)); } } } matches.Sort((a, b) => b.BuildTime.CompareTo(a.BuildTime)); if (matches.Count > 0) { path = matches.First().Path; return true; } return false; } private void Publish() { if (!TryGetNearestUnityProj(out var unityProj)) { UniEditor.ShowMessageBox("找不到匹配项目可以发布", null); return; } if (!Directory.Exists(Target.AndroidPublishProj)) { UniEditor.ShowMessageBox("AndroidPublishProj不可为空", null); return; } Debug.Log("注入到打包工程..."); WriteAndroidManifestXml(); WriteGoogleServiceJson(); WriteConfigJava(); WriteIcon(); WriteUnityLibrary(unityProj); WriteBuildGradle(); WriteStringsXml(); Debug.Log("处理完毕..."); } private void WriteAndroidManifestXml() { var path = $@"{Target.AndroidPublishProj}\gplay\src\main\AndroidManifest.xml"; Debug.Log($"写入:{path}"); var android_manifest_xml = $@" "; File.WriteAllText(path, android_manifest_xml); } private void WriteGoogleServiceJson() { var path = $@"{Target.AndroidPublishProj}\gplay\google-services.json"; if (Target.GoogleServiceJson != null) { Debug.Log($"写入:{path}"); var from = AssetDatabase.GetAssetPath(Target.GoogleServiceJson); File.Copy(from, path, true); } else { if (File.Exists(path)) { Debug.Log($"删除:{path}"); File.Delete(path); } } } private void WriteConfigJava() { var path = $@"{Target.AndroidPublishProj}\gplay\src\main\java\com\typhoon\gplay\Config.java"; var java = $@"package com.typhoon.gplay; /*打包配置*/ public class Config {{ /*启动进入demo测试页/游戏场景*/ public static boolean LAUNCHER_DEMO = false; /*Debug 模式开关*/ public static boolean DEBUG_MODE = {Target.DebugMode.ToString().ToLower()}; /*竖屏模式为true,横屏模式为false*/ public static boolean ORIENTATION_PORTRAIT = {Target.Portrait.ToString().ToLower()};; /*admob插页*/ public static String ADMOB_INTERS_UNIT = ""{Target.IntersId}""; /*admob激励视频*/ public static String ADMOB_VIDEO_UNIT = ""{Target.VideoId}""; /*admob banner*/ public static String ADMOB_BANNER_UNIT = """"; /*admob 原生广告*/ public static String ADMOB_NATIVE_UNIT = """"; }} "; Debug.Log($"写入:{path}"); File.WriteAllText(path, java); } private void WriteIcon() { var path = $@"{Target.AndroidPublishProj}\gplay\src\main\res\mipmap-mdpi\app_icon.png"; if (Target.Icon != null) { var from = AssetDatabase.GetAssetPath(Target.Icon); Debug.Log($"写入:{path}"); File.Copy(from, path, true); } } private void WriteUnityLibrary(string unityProj) { var androidUnityLib = $@"{Target.AndroidPublishProj}\unityLibrary"; var unityLib = $"{unityProj}/unityLibrary"; if (Directory.Exists(unityLib)) { Debug.Log("更换unitylib"); Directory.Delete(androidUnityLib,true); UniEditor.CopyFolder(unityLib,androidUnityLib); } var xmlPath = $@"{androidUnityLib}\src\main\AndroidManifest.xml"; var xml = File.ReadAllText(xmlPath); xml = xml.Replace("", ""); xml = xml.Replace("", ""); xml = xml.Replace("", ""); xml = xml.Replace("", ""); Debug.Log($"写入:{xmlPath}"); File.WriteAllText(xmlPath, xml); // var xmlAndroid = $"{androidUnityLib}/src/main/AndroidManifest.xml"; // var xmlUnity = $"{unityLib}/src/main/AndroidManifest.xml"; // // var map = new (string androidPath, string unityPath)[] // { // //{unityProj}\unityLibrary // ($"{androidUnityLib}/libs", $"{unityLib}/libs"), // ($"{androidUnityLib}/src/main/assets", $"{unityLib}/src/main/assets"), // ($"{androidUnityLib}/src/main/java", $"{unityLib}/src/main/java"), // ($"{androidUnityLib}/src/main/jniLibs", $"{unityLib}/src/main/jniLibs"), // // }; // // // foreach (var e in map) // { // UniEditor.TryDeleteFolder(e.androidPath); // UniEditor.CopyFolder(e.unityPath, e.androidPath); // Debug.Log($"写入:{e.androidPath} "); // } // // File.Copy(xmlUnity, xmlAndroid, true); // Debug.Log($"复制:{xmlUnity}-->{xmlAndroid} "); // var xmlPath = $@"{androidUnityLib}\src\main\AndroidManifest.xml"; // var xml = File.ReadAllText(xmlPath); // xml = xml.Replace("", ""); // xml = xml.Replace("", ""); // xml = xml.Replace("", ""); // xml = xml.Replace("", ""); // File.WriteAllText(xmlPath, xml); // Debug.Log($"写入:{xmlPath}"); // // var gradle = $@"{Target.AndroidPublishProj}\unityLibrary\build.gradle"; // var gradle_from = $"{unityLib}/build.gradle"; // Debug.Log($"写入:{gradle}"); // File.Copy(gradle_from,gradle,true); } private void WriteBuildGradle() { var path = $@"{Target.AndroidPublishProj}\gplay\build.gradle"; var gradle = $@"import java.text.SimpleDateFormat apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' android {{ compileSdkVersion 33 buildToolsVersion '30.0.3' compileOptions {{ sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }} /*签名配置*/ signingConfigs {{ release {{ def signDir = rootProject.file('sign') keyAlias 'key0' keyPassword '123456798' storeFile file(signDir.getAbsolutePath() + '/fishing.jks') storePassword '123456798' }} debug {{ def signDir = rootProject.file('sign') keyAlias 'key0' keyPassword '123456798' storeFile file(signDir.getAbsolutePath() + '/fishing.jks') storePassword '123456798' }} }} defaultConfig {{ minSdkVersion 21 targetSdkVersion 33 versionCode {Target.Version} versionName '{Target.VersionName}' applicationId '{Target.PackageName}' consumerProguardFiles ""consumer-rules.pro"" ndk {{ abiFilters 'armeabi-v7a', 'arm64-v8a' }} }} //发布的包名 applicationVariants.all {{ variant -> variant.outputs.all {{ def formattedDate = new SimpleDateFormat(""yyyyMMdd_HHmmss"").format(new Date()) def versionName = variant.versionName def buildType = variant.buildType.name def appName = variant.applicationId outputFileName = ""${{appName}}_v${{versionName}}_${{buildType}}_${{formattedDate}}.apk"" }} }} sourceSets {{ main {{ jniLibs.srcDirs = ['libs'] }} }} aaptOptions {{ noCompress = ['.unity3d', '.ress', '.resource', '.obb', 'aa/catalog.json', 'aa/settings.json', 'aa/AddressablesLink/link.xml', '.bundle'] ignoreAssetsPattern = ""!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"" }} lintOptions {{ abortOnError false }} buildTypes {{ debug {{ minifyEnabled false useProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', getDefaultProguardFile('proguard-android-optimize.txt') signingConfig signingConfigs.debug jniDebuggable true }} release {{ minifyEnabled false useProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', getDefaultProguardFile('proguard-android-optimize.txt') signingConfig signingConfigs.release }} }} packagingOptions {{ doNotStrip '*/armeabi-v7a/*.so' doNotStrip '*/arm64-v8a/*.so' }} bundle {{ language {{ enableSplit = false }} density {{ enableSplit = false }} abi {{ enableSplit = true }} }} }} dependencies {{ api fileTree(includes: ['*.jar', '*.aar'], dir: 'libs') api project(':sdk_plug') api project(':unity_app') api platform('com.google.firebase:firebase-bom:32.2.3') api 'com.google.firebase:firebase-analytics:21.3.0' api 'com.google.android.gms:play-services-ads:21.3.0' }}"; Debug.Log($"写入:{path}"); File.WriteAllText(path, gradle); } private void WriteStringsXml() { var path = $@"{Target.AndroidPublishProj}\gplay\src\main\res\values\strings.xml"; var xml = $@" {Target.GameName} Game view "; Debug.Log($"写入:{path}"); File.WriteAllText(path, xml); } } }