UE开发笔记:UPL在安卓中的应用实操记录「建议收藏」

UE开发笔记:UPL在安卓中的应用实操记录「建议收藏」虚幻安卓开发过程中大量用到UPL.xml来介入UE打包过程,实现aar库导入,GameActivity.java/GameApplication.java内容定制,AndroidManifest

UE开发笔记:UPL在安卓中的应用实操记录「建议收藏」"

0 引言

最近在开发封装第三方安卓类库的虚幻插件。开发过程中大量用到UPL.xml来介入UE打包过程,实现aar库导入,GameActivity.java/GameApplication.java内容定制,AndroidManifest.xml/build.gradle等配置修改等。

这里把所有用到的节点详细记录下来。

UPL全称 UnrealPluginLanguage,是一个基于xml的结构化语言。相关引擎源码可查看UEDeployAndroid.cs和UnrealPluginLanguage.cs,很多官方文档未提及的节点用法,通过分析这两个源文件,可以得到很多启发。

初始UPL.xml如下所示,后续的节点内容都是添加到<root> </root>标签块中。

<?xml version="1.0" encoding="utf-8"?>
<!--Unreal Plugin Example-->
<root xmlns:android="http://schemas.android.com/apk/res/android">

</root>

1 复制资源

$S(PluginDir)为xml所在目录,$S(BuildDir)为Intermediate/Android/APK

1.1复制目录

<resourceCopies>
    <copyDir src="$S(PluginDir)/ThirdParty/Android/libs/" dst="$S(BuildDir)/libs/" />
    <copyDir src="$S(PluginDir)/ThirdParty/Android/java/" dst="$S(BuildDir)" />	
</resourceCopies>	

1.2复制文件

<resourceCopies>
    <copyFile src="$S(PluginDir)/ThirdParty/Android/config/ChannelConfig.json" dst="$S(BuildDir)/assets/ChannelConfig.json" />
</resourceCopies>	

2 build.gradle配置

2.1添加安卓库依赖

打包过程中UE会将aar文件拷贝到虚拟磁盘的app/src/main/libs目录下,默认会在app/libs下查找aar文件,所以要指定查找库文件的位置为src/main/libs.

2.1.1导入本地aar库

<buildGradleAdditions>
    <insert>
        allprojects {
	        repositories {
		        flatDir {
		        	dirs 'src/main/libs'
	        	}
        	}
        }
        dependencies {			
			implementation(name: "test.sdk", ext: "aar")
        }
	</insert>
</buildGradleAdditions>

2.1.2导入在线库

<buildGradleAdditions>
    <insert>
        allprojects {
	        repositories {
		        flatDir {
		        	dirs 'src/main/libs'
	        	}
        	}
        }
        dependencies {				
            implementation "androidx.appcompat:appcompat:1.1.0"
        }
	</insert>
</buildGradleAdditions>

2.2 往androd{defaultConfig{}}添加AndroidManifest.xml占位符

<buildGradleAdditions>
    <insert>
        android {
            defaultConfig {                
				addManifestPlaceholders("analy_app_id": "@string/analytics_app_id")
            }
        }
    </insert>
</buildGradleAdditions>

2.3 将旧版support库改为在线androidX库

通过遍历将引用support库改为androidX库,需要配合useAndroidX属性使用。

<buildGradleAdditions>
	<insert>
        allprojects {			
				
			def classMap = [
				    'android.support.annotation': 'androidx.annotation',
				    'android.support.v4.app.ActivityCompat':                     
                    'androidx.core.app.ActivityCompat',
					'android.support.v4.app.NotificationCompat': 
                    'androidx.core.app.NotificationCompat',
					'android.support.v4.app.NotificationManagerCompat':             
                    'androidx.core.app.NotificationManagerCompat',
					'android.support.v4.content.ContextCompat':         
                    'androidx.core.content.ContextCompat',
					'android.support.v4.content.FileProvider': 
                    'androidx.core.content.FileProvider',
					'android.support.v13.app.FragmentCompat':                     
                    'androidx.legacy.app.FragmentCompat',
					'android.arch.lifecycle': 'androidx.lifecycle',
					'android.arch.lifecycle.Lifecycle': 'androidx.lifecycle.Lifecycle',
					'android.arch.lifecycle.LifecycleObserver':         
                    'androidx.lifecycle.LifecycleObserver',
					'android.arch.lifecycle.OnLifecycleEvent':         
                    'androidx.lifecycle.OnLifecycleEvent',
					'android.arch.lifecycle.ProcessLifecycleOwner':     
                    'androidx.lifecycle.ProcessLifecycleOwner',
				]
			afterEvaluate { project ->
				project.rootProject.projectDir.traverse(type: groovy.io.FileType.FILES, nameFilter: ~/.*\.java$/) { f ->
					classMap.each { entry ->
						if (f.getText('UTF-8').contains(entry.key)) {
							println "Change ${entry.key} to ${entry.value} in file ${f}"
							ant.replace(file: f, token: entry.key, value: entry.value)
						}
					}
				}
			}
		}
	</insert>
</buildGradleAdditions>
<gradleProperties>
    <insert> 
        android.useAndroidX=true
        android.enableJetifier=true
    </insert>
</gradleProperties>

3 AndroidManifest.xml配置

3.1 在指定标签中添加配置

3.1.1 在标签<application>中添加配置

<androidManifestUpdates>
    <addAttribute tag="application" name="android:usesCleartextTraffic" value="true"/>
</androidManifestUpdates>

3.1.2 在标签<activity>中添加配置

<androidManifestUpdates>
    <addAttribute tag="activity" name="android:exported" value="true"/>
</androidManifestUpdates>

3.2 修改权限

3.2.1 增加权限

<androidManifestUpdates>		
    <addPermission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
</androidManifestUpdates>

3.2.2 删除权限

<androidManifestUpdates>		
    <removePermission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</androidManifestUpdates>

3.3 在指定标签块中添加配置块

addElements默认会应用给所有匹配的标签,使用once = “true”则只应用于首次匹配的标签。

<androidManifestUpdates>		
    <addElements tag="activity" once="true">
        <intent-filter>
            xxx
        </intent-filter>
    </addElements>
</androidManifestUpdates>

4 gradle.properties配置

<gradleProperties>
    <insert> 
        android.useAndroidX=true
        android.enableJetifier=true
    </insert>
</gradleProperties>

5 GameActivity.java内容修改

5.1添加头文件引用

<gameActivityImportAdditions>
    <insert>
        import com.game.supersdk.Wrapper;
    </insert>
</gameActivityImportAdditions>

5.2 往GameActivity类体添加java代码

<gameActivityClassAdditions>
    <insert>
        public void Log()
        {
			System.out.println("调用成功");
		}
		public native static void nativeDoTester(String Msg);
	</insert>
</gameActivityClassAdditions>  

5.3 往指定函数添加代码

具体有哪些函数支持插入代码,可在引擎源码目录下的GameActivity.java.template中搜索例如//$${gameActivityOnCreateAdditions}$$的占位符。占位符位置即为代码插入位置。

<gameActivityOnCreateAdditions> 
	<insert> 
		TestSDK.onCreate(this, savedInstanceState);
	</insert> 
</gameActivityOnCreateAdditions>

6 GameApplication.java内容修改

6.1添加头文件引用

<gameApplicationImportAdditions>
	<insert>
		import com.company.test.*;
	</insert>
</gameApplicationImportAdditions>

6.2往指定函数添加代码

具体有哪些函数支持添加代码,可在引擎源码目录下的GameApplication.java.template中搜索例如//$${gameApplicationOnCreateAdditions}$$的占位符。占位符位置即为代码插入位置。

<gameApplicationOnCreateAdditions>
	<insert> 
		TestSDK.onAppCreate(this);
	</insert>
</gameApplicationOnCreateAdditions>

今天的文章UE开发笔记:UPL在安卓中的应用实操记录「建议收藏」分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87793.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注