每个人都有自己的知识体系。
Toggle navigation
Home
随笔
C#/.Net
树莓派 / Raspberry
皓月汉化组
Beego
Golang
OxideMod
apache
haproxy
windows
Java
Objective-C
日语/罗马音歌词/日语常识
MongoDB
python
电学
公告
Minecraft服务器-公告
NanoPi
C4D (CINEMA 4D)
生活
推流/m3u8/rtmp/rtsp
Unity
ffmpeg
数据结构
区块链
tarui
UnityForPSVita
i-mode
About Me
Archives
Tags
仅在Unity内做到,完全控制Activity和 构建管线骚操作 抑制unity强行插入UnityPlayerActivity为默认Activity
2026-05-21 18:54:37
6
0
0
akiragatsu
目标:死活不去重新编译第三方arr,做到完全unity内搞定。 顺带,也搞定Unity Android项目,Unity2022.3.48这些版本自己会在AndroidManifest.xml最终打包时给你硬塞UnityPlayerActivity的问题。 例如QuickSDK要求初始化 必须在Activity OnCreate回调中调用, 然而他自己arr的源码QuickUnityPlayerproxyActivity.java 中,都是注释的。 ``` @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); mActivity = this; Sdk.getInstance().onCreate(this); // 探娱初始化 // doInit(); // requestInit(); } ``` 然后UnityC#中调用并不及时,不满足,一直提示初始化 必须在Activity OnCreate回调中调用。 但是我们才不去耽误时间重新编译arr 踩坑编译和兼容问题呢。 在Unity内可以直接完成吗? 而且这个是多个流程:SplashActivity作为默认Activity启动 其中代码里有启动, 启动 MainActivity。 我们重写这两个Activity,java文件放在unity内就好。 YoyoMainActivity.java YoyoSplashActivity.java 然后AndroidManifest.xml需要吧默认启动的SplashActivity改为我们YoyoMainActivity。 即完全在外部控制Acivity流程: 原: ``` <activity android:name="com.qk.game.SplashActivity" android:configChanges="mnc|keyboardHidden|screenSize|orientation|keyboard" android:exported="true" android:screenOrientation="landscape" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.qk.game.MainActivity" android:configChanges="mnc|keyboardHidden|screenSize|orientation|keyboard" android:screenOrientation="landscape" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" > </activity> ``` 修改unity内的然后AndroidManifest ``` <activity android:name="com.qk.game.YoyoSplashActivity" 。。。。 </activity> <activity android:name="com.qk.game.YoyoMainActivity" 。。。。 </activity> ``` YoyoSplashActivity.java ``` public class YoyoSplashActivity extends QuickSdkSplashActivity { //。。。。其他代码 @Override public void onSplashStop() { Intent intent = new Intent(this, com.qk.game.YoyoMainActivity.class);// 修改这里:从 MainActivity 改为 YoyoMainActivity startActivity(intent); finish(); } //。。。。其他代码 } ``` YoyoMainActivity.java ``` public class YoyoMainActivity extends QuickUnityPlayerproxyActivity { //。。。。其他代码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activity = this; // 添加 requestInit() 调用 Log.i("YoyoMainActivity", "Calling requestInit() in onCreate"); doInit(); //requestInit(); } //。。。。其他代码 } ``` ### 好!至此 java逻辑和Activity在unity这边完全控制已经做到了 ok,但是现在奇怪的问题发生了。 apk安装完成之后 ,桌面上有2个图标。 哈??(是卸载之后,2个一起消失的那种) 原因就是,AndroidManifest.xml中 有多个Acitivity 都标记为LAUNCHER,所以就有多个图标。 解压apk中的AndroidManifest.xml 用工具查看发现 ``` java -jar AXMLPrinter2.jar E:\AndroidManifest.xml ``` 解密后发现,最终apk结果的:UnityPlayerActivity 也是标记为LAUNCHER, 我自定义的也是 YoyoSplashActivity 我做了一些尝试,通过好几种tools:node remove去抑制unity合并 在Unity内的AndroidManifest.xml加入 ``` <activity android:name="com.unity3d.player.UnityPlayerActivity" tools:node="remove"> ``` 然而并不行。 貌似比较顽固 至少Unity2022 2023合并的时候 是特别强行的 要给你加入。 那咋办? shift 诶? unity打包 不是先自己unity编译完自己这部分之后,生成Gradle项目 再扔给androidsdk 有没有可能,再这一步做手脚 有的,构建管线中,IPostGenerateGradleAndroidProject 接口提供的OnPostGenerateGradleAndroidProject 刚好就是生成Gradle项目 还么有提交给androidsdk之前 的回调 用这里来给他割掉吧 ### 通过管线,控制最终的AndroidManifest.xml内容。 ``` public override void OnPostGenerateGradleAndroidProject(PackageInfo packageInfo, string path) { base.OnPostGenerateGradleAndroidProject(packageInfo, path); string manifestPath = Path.Combine(path, "src", "main", "AndroidManifest.xml"); if (!File.Exists(manifestPath)) { Debug.LogError("[QuickSDK] 找不到合并后的 AndroidManifest.xml"); return; } Debug.Log("[QuickSDK] 开始处理合并后的 Manifest: " + manifestPath); try { XmlDocument doc = new XmlDocument(); doc.Load(manifestPath); XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("android", "http://schemas.android.com/apk/res/android"); XmlNode applicationNode = doc.SelectSingleNode("/manifest/application"); if (applicationNode == null) { Debug.LogError("[QuickSDK] 找不到 application 节点"); return; } // 1. 移除 UnityPlayerActivity 的 Launcher RemoveUnityLauncher(doc, applicationNode, nsmgr); // 2. 保存修改 doc.Save(manifestPath); Debug.Log("[QuickSDK] ✅ Manifest 处理完成!只保留一个桌面图标"); } catch (System.Exception e) { Debug.LogError("[QuickSDK] 处理 Manifest 失败: " + e.Message); } } private void RemoveUnityLauncher(XmlDocument doc, XmlNode applicationNode, XmlNamespaceManager nsmgr) { XmlNode unityActivity = applicationNode.SelectSingleNode( "activity[@android:name='com.unity3d.player.UnityPlayerActivity']", nsmgr); if (unityActivity != null) { XmlNode intentFilter = unityActivity.SelectSingleNode("intent-filter"); if (intentFilter != null) { unityActivity.RemoveChild(intentFilter); Debug.Log("[QuickSDK] 已移除 UnityPlayerActivity 的 LAUNCHER intent-filter"); } SetAttribute(unityActivity, "exported", "false"); } } private void SetAttribute(XmlNode node, string localName, string value) { if (node == null) return; XmlAttribute attr = node.Attributes[localName]; if (attr == null) { attr = node.OwnerDocument.CreateAttribute(localName); node.Attributes.Append(attr); } attr.Value = value; } ```
Pre: No Post
Next:
0
likes
6
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Submit
Sign in
to leave a comment.
No Leanote account?
Sign up now.
0
comments
More...
Table of content
No Leanote account? Sign up now.