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