diff --git a/Editor/GuruManager/Files/baseProjectTemplate.txt b/Editor/GuruManager/Files/baseProjectTemplate.txt new file mode 100644 index 0000000..1e072c6 --- /dev/null +++ b/Editor/GuruManager/Files/baseProjectTemplate.txt @@ -0,0 +1,31 @@ +allprojects { + buildscript { + repositories {**ARTIFACTORYREPOSITORY** + google() + jcenter() + mavenCentral() + } + + dependencies { + // If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity + // See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html + // See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle + // To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version +// classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.android.tools.build:gradle:7.4.2' + **BUILD_SCRIPT_DEPS** + } + } + + repositories {**ARTIFACTORYREPOSITORY** + google() + jcenter() + flatDir { + dirs "${project(':unityLibrary').projectDir}/libs" + } + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/Editor/GuruManager/Files/baseProjectTemplate.txt.meta b/Editor/GuruManager/Files/baseProjectTemplate.txt.meta new file mode 100644 index 0000000..a6062a5 --- /dev/null +++ b/Editor/GuruManager/Files/baseProjectTemplate.txt.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 210888b84fe449e88319129ae097514d +timeCreated: 1722245010 \ No newline at end of file diff --git a/Editor/GuruManager/Files/gradleTemplate.txt b/Editor/GuruManager/Files/gradleTemplate.txt index 6b197ad..4eda1cc 100644 --- a/Editor/GuruManager/Files/gradleTemplate.txt +++ b/Editor/GuruManager/Files/gradleTemplate.txt @@ -2,7 +2,6 @@ org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M org.gradle.parallel=true org.gradle.daemon=true org.gradle.caching=true -android.enableR8=**MINIFY_WITH_R_EIGHT** unityStreamingAssets=**STREAMING_ASSETS** # Android Resolver Properties Start android.useAndroidX=true diff --git a/Editor/GuruManager/Files/mainTemplate.txt b/Editor/GuruManager/Files/mainTemplate.txt index e69de29..2bf4463 100644 --- a/Editor/GuruManager/Files/mainTemplate.txt +++ b/Editor/GuruManager/Files/mainTemplate.txt @@ -0,0 +1,41 @@ +apply plugin: 'com.android.library' +**APPLY_PLUGINS** + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) +**DEPS**} + +android { + namespace "com.unity3d.player" + ndkPath "**NDKPATH**" + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD** + } + + lintOptions { + abortOnError false + } + + aaptOptions { + noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ') + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~" + }**PACKAGING_OPTIONS** +} +**IL_CPP_BUILD_SETUP** +**SOURCE_BUILD_SETUP** +**EXTERNAL_SOURCES** diff --git a/Editor/GuruManager/Files/proguard-user.txt b/Editor/GuruManager/Files/proguard-user.txt new file mode 100644 index 0000000..b77274c --- /dev/null +++ b/Editor/GuruManager/Files/proguard-user.txt @@ -0,0 +1,132 @@ +-keep class com.unity3d.plugin.* { *; } + +#proguard-adjust.pro +-keep public class com.adjust.sdk.** { *; } +-keep class com.amazon.device.ads.** { *; } +-keep class com.amazon.aps.** { *; } +-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient { + com.google.android.gms.ads.identifier.AdvertisingIdClient$Info getAdvertisingIdInfo(android.content.Context); +} +-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info { + java.lang.String getId(); + boolean isLimitAdTrackingEnabled(); +} +-keep public class com.android.installreferrer.** { *; } +-keepclassmembers class com.ironsource.sdk.controller.IronSourceWebView$JSInterface { + public *; +} +-keepclassmembers class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} +-keep public class com.google.android.gms.ads.** { + public *; +} +-keep class com.ironsource.adapters.** { *; } +-dontwarn com.ironsource.mediationsdk.** +-dontwarn com.ironsource.adapters.** +-keepattributes JavascriptInterface +-keepclassmembers class * { + @android.webkit.JavascriptInterface ; +} + +-keep class dalvik.system.VMRuntime { + java.lang.String getRuntime(); +} +-keep class android.os.Build { + java.lang.String[] SUPPORTED_ABIS; + java.lang.String CPU_ABI; +} +-keep class android.content.res.Configuration { + android.os.LocaleList getLocales(); + java.util.Locale locale; +} +-keep class android.os.LocaledList { + java.util.Locale get(int); +} + +#proguard-facebook.pro +-keep class com.facebook.** { *; } +-keepattributes Signature +-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip +-keep @com.facebook.common.internal.DoNotStrip class * +-keep class com.facebook.stetho.** { *; } +-keepclassmembers class * { + @com.facebook.common.internal.DoNotStrip *; +} +-keepclassmembers class * { + native ; +} +-dontwarn okio.** +-dontwarn javax.annotation.** +-dontwarn com.android.volley.toolbox.** + +-keep class com.bytedance.sdk.** { *; } +-keep class com.pgl.sys.ces.* { *; } +-keep class com.facebook.** { *; } +-keep class com.google.android.play.core.** { *; } +-keep class com.google.games.bridge.** { *; } +-keep class com.google.android.gms.** { *; } +-keep class com.google.android.gms.games.leaderboard.** { *; } +-keep class com.google.android.gms.games.snapshot.** { *; } +-keep class com.google.android.gms.games.achievement.** { *; } +-keep class com.google.android.gms.games.event.** { *; } +-keep class com.google.android.gms.games.stats.** { *; } +-keep class com.google.android.gms.games.video.** { *; } +-keep class com.google.android.gms.games.* { *; } +-keep class com.google.android.gms.common.api.ResultCallback { *; } +-keep class com.google.android.gms.signin.** { *; } +-keep class com.google.android.gms.dynamic.** { *; } +-keep class com.google.android.gms.dynamite.** { *; } +-keep class com.google.android.gms.tasks.** { *; } +-keep class com.google.android.gms.security.** { *; } +-keep class com.google.android.gms.base.** { *; } +-keep class com.google.android.gms.actions.** { *; } +-keep class com.google.android.gms.common.ConnectionResult { *; } +-keep class com.google.android.gms.common.GooglePlayServicesUtil { *; } +-keep class com.google.android.gms.common.api.** { *; } +-keep class com.google.android.gms.common.data.DataBufferUtils { *; } +-keep class com.google.android.gms.games.quest.** { *; } +-keep class com.google.android.gms.nearby.** { *; } +-keep class com.google.android.gms.ads.** { *; } + +-keep class com.pubmatic.sdk.** { *; } +-keep class com.applovin.** { *; } +-keep class com.chartboost.** { *; } + +-keep class com.guru.** { *; } +-keep class guru.core.** { *; } + +-keep class com.onevcat.uniwebview.* { *; } +-keep class com.iab.omid.* { *; } + +-keep public class com.tradplus.** { *; } +-keep class com.tradplus.ads.** { *; } +-keep class com.applovin.mediation.adapters.** { *; } + +-keep public class com.applovin.sdk.AppLovinSdk{ *; } +-keep public class com.applovin.sdk.AppLovin* { + public protected *; +} +-keep public class com.applovin.nativeAds.AppLovin* { + public protected *; +} +-keep public class com.applovin.adview.* { + public protected *; +} +-keep public class com.applovin.mediation.* { + public protected *; +} +-keep public class com.applovin.mediation.ads.* { + public protected *; +} +-keep public class com.applovin.impl.*.AppLovin { + public protected *; +} +-keep public class com.applovin.impl.**.*Impl { + public protected *; +} +-keepclassmembers class com.applovin.sdk.AppLovinSdkSettings { + private java.util.Map localSettings; +} +-keep class com.applovin.mediation.adapter.** { *; } +-keep class com.applovin.mediation.unity.** { *; } diff --git a/Editor/GuruManager/Files/proguard-user.txt.meta b/Editor/GuruManager/Files/proguard-user.txt.meta new file mode 100644 index 0000000..b53f03a --- /dev/null +++ b/Editor/GuruManager/Files/proguard-user.txt.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a08608d11bf7483fa4c49df80ebab657 +timeCreated: 1722245439 \ No newline at end of file diff --git a/Editor/GuruManager/Files/settingsTemplate.txt b/Editor/GuruManager/Files/settingsTemplate.txt new file mode 100644 index 0000000..e3d9663 --- /dev/null +++ b/Editor/GuruManager/Files/settingsTemplate.txt @@ -0,0 +1,60 @@ +pluginManagement { + repositories { + **ARTIFACTORYREPOSITORY** + gradlePluginPortal() + google() + mavenCentral() + } +} + +include ':launcher', ':unityLibrary' +**INCLUDES** + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) + repositories { + **ARTIFACTORYREPOSITORY** + google() + mavenCentral() +// Android Resolver Repos Start + def unityProjectPath = $/file:///**DIR_UNITYPROJECT**/$.replace("\\", "/") + maven { + url "https://verve.jfrog.io/artifactory/verve-gradle-release" // Packages/com.guru.unity.max/Mediation/Verve/Editor/Dependencies.xml:7 + } + maven { + url (unityProjectPath + "/Assets/GeneratedLocalRepo/Firebase/m2repository") // Packages/com.google.firebase.firestore/Firebase/Editor/FirestoreDependencies.xml:20, Packages/com.google.firebase.app/Firebase/Editor/AppDependencies.xml:22, Packages/com.google.firebase.auth/Firebase/Editor/AuthDependencies.xml:20, Packages/com.google.firebase.messaging/Firebase/Editor/MessagingDependencies.xml:24, Packages/com.google.firebase.crashlytics/Firebase/Editor/CrashlyticsDependencies.xml:20, Packages/com.google.firebase.dynamic-links/Firebase/Editor/DynamicLinksDependencies.xml:20, Packages/com.google.firebase.installations/Firebase/Editor/InstallationsDependencies.xml:20, Packages/com.google.firebase.remote-config/Firebase/Editor/RemoteConfigDependencies.xml:20, Packages/com.google.firebase.analytics/Firebase/Editor/AnalyticsDependencies.xml:18 + } + maven { + url "https://aws.oss.sonatype.org/content/repositories/releases/" // Packages/com.guru.unity.max/Amazon/Scripts/Editor/AmazonDependencies.xml:10 + } + maven { + url "https://artifactory.bidmachine.io/bidmachine" // Packages/com.guru.unity.max/Mediation/BidMachine/Editor/Dependencies.xml:8 + } + maven { + url "https://artifact.bytedance.com/repository/pangle" // Packages/com.guru.unity.max/Mediation/ByteDance/Editor/Dependencies.xml:8 + } + maven { + url "https://cboost.jfrog.io/artifactory/chartboost-ads/" // Packages/com.guru.unity.max/Mediation/Chartboost/Editor/Dependencies.xml:8 + } + maven { + url "https://android-sdk.is.com/" // Packages/com.guru.unity.max/Mediation/IronSource/Editor/Dependencies.xml:8 + } + maven { + url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea" // Packages/com.guru.unity.max/Mediation/Mintegral/Editor/Dependencies.xml:8 + } + maven { + url "https://maven.ogury.co" // Packages/com.guru.unity.max/Mediation/OguryPresage/Editor/Dependencies.xml:8 + } + maven { + url "https://s3.amazonaws.com/smaato-sdk-releases/" // Packages/com.guru.unity.max/Mediation/Smaato/Editor/Dependencies.xml:8 + } + maven { + url "https://repo.pubmatic.com/artifactory/public-repos" // Packages/com.guru.unity.max/OpenWrapSDK/Editor/OpenWrapSDKDependencies.xml:18, Packages/com.guru.unity.max/OpenWrapSDK/Mediation/AppLovinMAX/Editor/ALOpenWrapMediationDependencies.xml:7 + } + mavenLocal() +// Android Resolver Repos End + flatDir { + dirs "${project(':unityLibrary').projectDir}/libs" + } + } +} diff --git a/Editor/GuruManager/Files/settingsTemplate.txt.meta b/Editor/GuruManager/Files/settingsTemplate.txt.meta new file mode 100644 index 0000000..ff0622a --- /dev/null +++ b/Editor/GuruManager/Files/settingsTemplate.txt.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4f7213bbbc8741bd89b3bd17a7bea43e +timeCreated: 1722240718 \ No newline at end of file diff --git a/Editor/GuruManager/Helper/AndroidProjectMod.cs b/Editor/GuruManager/Helper/AndroidProjectMod.cs index 1a945bd..ec4f7e5 100644 --- a/Editor/GuruManager/Helper/AndroidProjectMod.cs +++ b/Editor/GuruManager/Helper/AndroidProjectMod.cs @@ -10,27 +10,43 @@ namespace Guru.Editor public class AndroidProjectMod { - private static readonly int TargetSDKVersion = 33; + private const int TargetSDKVersion = 34; + private const string K_ANRDROID_PLUGINS_NAME = "Plugins/Android"; - private static readonly string LauncherName = "launcherTemplate"; - private static string LauncherFullPath = Path.Combine(Application.dataPath, $"Plugins/Android/{LauncherName}.gradle"); + private const string LauncherName = "launcherTemplate"; + private static string LauncherFullPath = Path.Combine(Application.dataPath, $"{K_ANRDROID_PLUGINS_NAME}/{LauncherName}.gradle"); - private static readonly string MainName = "mainTemplate"; - private static string MainFullPath = Path.Combine(Application.dataPath, $"Plugins/Android/{MainName}.gradle"); + private const string MainName = "mainTemplate"; + private static string MainFullPath = Path.Combine(Application.dataPath, $"{K_ANRDROID_PLUGINS_NAME}/{MainName}.gradle"); - private static readonly string PropertiesName = "gradleTemplate"; - private static string PropertiesFullPath = Path.Combine(Application.dataPath, $"Plugins/Android/{PropertiesName}.properties"); + private const string BaseProjectName = "baseProjectTemplate"; + private static string BaseProjectFullPath = Path.Combine(Application.dataPath, $"{K_ANRDROID_PLUGINS_NAME}/{BaseProjectName}.gradle"); + + private const string PropertiesName = "gradleTemplate"; + private const string K_ENABLE_R8 = "android.enableR8"; + private static string PropertiesFullPath = Path.Combine(Application.dataPath, $"{K_ANRDROID_PLUGINS_NAME}/{PropertiesName}.properties"); + + private const string SettingsName = "settingsTemplate"; + private static string SettingsFullPath = Path.Combine(Application.dataPath, $"Plugins/Android/{SettingsName}.gradle"); + private const string K_LINE_UNITYPROJECT = "def unityProjectPath"; + + + private const string ProguardUserName = "proguard-user"; + private static string ProguardUserFullPath = Path.Combine(Application.dataPath, $"{K_ANRDROID_PLUGINS_NAME}/{ProguardUserName}.txt"); public static void Apply() { - FixLauncher(); - FixMain(); - FixProperties(); - CheckTargetSDKVersion(); + ApplyLauncher(); + ApplyBaseProjectTemplates(); + ApplyMainTemplates(); + ApplyGradleTemplate(); + ApplySettings(); + ApplyProguardUser(); + CheckTargetSDKVersion(); // 强制修复构建版本号 } - private static void FixLauncher() + private static void ApplyLauncher() { if (!File.Exists(LauncherFullPath)) { @@ -64,7 +80,7 @@ namespace Guru.Editor File.WriteAllLines(LauncherFullPath, lines); } - private static void FixMain() + private static void ApplyMainTemplates() { if (!File.Exists(MainFullPath)) { @@ -72,13 +88,99 @@ namespace Guru.Editor CopyFile($"{MainName}.txt", MainFullPath); } } - private static void FixProperties() + + private static void ApplyBaseProjectTemplates() + { + if (!File.Exists(BaseProjectFullPath)) + { + Debug.Log($"[MOD] --- Copy file to: {BaseProjectFullPath}"); + CopyFile($"{BaseProjectName}.txt", BaseProjectFullPath); + } + } + + + + private static void ApplyGradleTemplate() { if (!File.Exists(PropertiesFullPath)) { Debug.Log($"[MOD] --- Copy file to: {PropertiesFullPath}"); CopyFile($"{PropertiesName}.txt", PropertiesFullPath); } + + if (TargetSDKVersion > 33) + { + FixGradleTemplate(PropertiesFullPath); + } + } + + private static void FixGradleTemplate(string filePath) + { + if (File.Exists(filePath)) + { + bool isDirty = false; + var lines = File.ReadAllLines(filePath); + + for (int i = 0; i < lines.Length; i++) + { + if (lines[i].StartsWith(K_ENABLE_R8)) + { + lines[i] = $"# {lines[i]}"; // 禁用R8 + isDirty = true; + break; + } + } + + if (isDirty) File.WriteAllLines(filePath, lines); + } + } + + + /// + /// 写入所有的配置文件 + /// + private static void ApplySettings() + { + if (!File.Exists(SettingsFullPath)) + { + CopyFile($"{SettingsName}.txt", SettingsFullPath); + } + FixProjectPathInSettings(SettingsFullPath); + } + + + private static void FixProjectPathInSettings(string settingsPath) + { + bool isDirty = false; + if (File.Exists(settingsPath)) + { + string projectPath = Path.GetFullPath($"{Application.dataPath}/../").Replace("\\", "/"); + var lines = File.ReadAllLines(settingsPath); + for (int i = 0; i < lines.Length; i++) + { + if (lines[i].Contains(K_LINE_UNITYPROJECT)) + { + lines[i] = $" def unityProjectPath = $/file:////{projectPath}/$.replace(\"\\\\\", \"/\")"; + isDirty = true; + break; + } + } + + if(isDirty) + File.WriteAllLines(settingsPath, lines); + } + } + + + /// + /// 写入所有的配置文件 + /// + private static void ApplyProguardUser() + { + if (!File.Exists(ProguardUserFullPath)) + { + CopyFile($"{ProguardUserName}.txt", ProguardUserFullPath); + } } private static void CheckTargetSDKVersion()