Version: 1.7
语言 : 中文
URAS 中的 AssetBundle 和 Addressable
HMI Android 构建与交付

Android App View 【Experimental】

Android App View 支持将安卓应用(包括第三方应用)以 App View 2D 或 App View 3D 的形式直接嵌入场景中。 从 Tuanjie 1.5.0 版本开始,Tuanjie Editor 中支持直接创建 Android App View 2D 和 Android App View 3D 组件,并提供了接入安卓应用的完整工作流,具体使用方法和注意事项请参考下文。

  • 注意
    • Android App View 目前为 Experimental 版本。若有任何问题及反馈欢迎至 Tuanjie 官方社区提问交流;
    • Tuanjie 1.5.0 - 1.5.2 版本中,Android App View 仅支持 UAAL,Tuanjie 1.5.3 及以上版本开始,Android App View 同样支持 URAS
    • Android App View 当前仅支持 OpenGLES,对于 Vulkan 的支持将在后续版本中释放;
    • Android App View 当前仅支持在 HMI Android 平台运行,请确认完整 Android App 嵌入 3D 场景中;从 Tuanjie 1.5.3 开始,Android App View 同样支持 Android View 嵌入场景中。

组件及功能

Android App View 在 Tuanjie Editor 中包含一个 Settings 和两个 Component:

Android App View Settings

Android App View Settings

  • 用于设置需要嵌入的 Android App 的包名、宽、高和 Render Scale,或设置需要嵌入的 Android View 的Token、宽、高和 Render Scale;
  • 支持安卓应用以 Android App 或 Android View 两种形式嵌入,可在 Presentation Type 中切换;
  • 默认位于 Assets 中, 在 Assets 中新建。新建时,Tuanjie 会自动创建并关联一张 Render Texture,用于承接安卓应用的内容,同时,Tuanjie 会自动创建并关联一个 AppView2D Default Material 和一个 AppView3D Default Material;
  • 可拖动并绑定到 Android App View 2D 或 Android App View 3D 上;
  • 一个 Android App View Settings 允许被绑定到多个 Android App View 2D 或 Android App View 3D 上;
  • 同一个工程中,建议一个安卓应用对应一个 Android App View Settings,若一个安卓应用对应了多个 Android App View Settings,则仅一个 Android App View Settings 生效。

Android App View 2D

Android App View 2D

  • 用于绘制接入的安卓应用;
  • 默认以 Canvas 的形式存在于场景中,支持在场景中新建,新建后,自动添加一个 Android App View 2D 组件,可在 Inspector 中修改相关参数;
  • 可调整参数如下:
    • Android App View Settings: 绑定并绘制的安卓应用,通过放置 Android App View Settings 完成绑定,绑定后,Material 可自动切换为 Android App View Settings 自带的 AppView2D Default Material;
    • 其他可调整参数及效果同 Raw Image;
  • 一个 Android App View 2D 组件默认只允许设置一个Android App View Settings(即绑定一个安卓应用),且不支持再次添加 Raw Image;
  • 一个场景中支持放置多个 Android App View 2D.

Android App View 3D

Android App View 3D

  • 用于绘制接入的安卓应用;
  • 默认以 Plane 的形式存在于场景中,可自行修改为其他 3D Object,支持在场景中新建,新建后,自动添加一个 Android App View 3D 组件,可在 Inspector 中修改相关参数;
  • 可调整参数如下:
    • Android App View Settings: 绑定并绘制的安卓应用,通过放置 Android App View Settings 完成绑定,绑定后,Material 可自动切换为 Android App View Settings 自带的 AppView3D Default Material;
    • Target Renderer: 默认 Mesh Renderer,自动绑定,不建议修改;
    • Target Input Collider: 默认 Mesh Collider,自动绑定,不建议修改;
  • 一个 Android App View 3D 组件默认只允许设置一个Android App View Settings(即绑定一个安卓应用);
  • 一个场景中支持放置多个 Android App View 3D.

推荐使用流程

Android App View 推荐使用流程如下:

  1. 打开 Tuanjie Editor 1.5.0 版本及以上;

  2. 切换至 HMI Android 平台;

  3. 勾选 Enable Android App View;

    Android App View Settings Check

  4. Tuanjie 1.5.0 及以上版本均支持安卓应用以一个完整的 Android App 的形式嵌入场景中:
    • 在 Asset 中,右键 >> Create >> Android App View Settings,创建 Android App View Settings;
    • 点击创建好的 Android App View Settings,在 Inspector 中,Presentation Type 选择 Android App,选择后,填写安卓应用包名、默认宽高、调整 Render Scale;
    • Tuanjie 会自动生成并绑定一张 Render Texture,无特殊需求无需修改。

    Android App View Settings Detail

  5. Tuanjie 1.5.3 及以上版本除支持安卓应用以一个完整的 Android App 的形式嵌入场景中之外,同时支持仅安卓应用的 Android View 嵌入场景中:
    • 在 Asset 中,右键 >> Create >> Android App View Settings,创建 Android App View Settings;
    • 点击创建好的 Android App View Settings,在 Inspector 中,Presentation Type 选择 Android View,选择后,填写 Android View Token(View 和 Texture 绑定唯一 id,Android 侧通过调用 AppViewClient.getInstance().showView(token, view) 函数将 View 传给 Tuanjie)、默认宽高、调整 Render Scale;
    • Tuanjie 会自动生成并绑定一张 Render Texture,无特殊需求无需修改。

    Android App View Settings Detail

  6. 在场景中新建 Android App View 组件并绑定:
    • 顶部菜单栏 GameObject / Component >> Android App View (Experimental) >> Android App View 2D / Android App View 3D,或直接在场景列表中右键 >> Android App View (Experimental) >> Android App View 2D / Android App View 3D, 创建 2D 或 3D 组件;

    Android App View Create

    • 在场景列表中,选中创建的 2D 或 3D 组件,打开 Inspector,将 Asset 中的 Android App View Settings 拖动至 Android App View Settings 框,即可完成绑定。

    Android App View Inspector

  7. 调整其余参数,导出工程或直接打包在真机运行(真机需确保已安装对应保包名的安卓应用)。

权限签名及安装启动

安卓权限及签名

为了接入安卓应用并在安卓设备上正常运行,安卓工程中需对权限进行说明,需要在 AndroidManifest.xml 文件中增加如下内容(Tuanjie 导出工程中已自动新增,无需额外修改):

  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.INJECT_EVENTS" />
  <uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" />
  <uses-permission android:name="android.permission.CAPTURE_SECURE_VIDEO_OUTPUT" />
  <uses-permission android:name="android.permission.GET_PACKAGES" />
  <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
  <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />

  android:sharedUserId="android.uid.system"

同时,需要使用系统签名,为应用设置签名可查看:Application signing

安装及启动

需要将接入了安卓应用的 App 设置为系统应用,因此,需要在安装和启动时按照下列操作进行设置,或编写脚本启动:

1. adb root
2. adb remount
3. adb push %apk本地路径%  /system/app/appview/
4. 解压缩app拿到so
5. 如果是 ARM 64 位,则:adb push %so本地路径%  /system/app/appview/lib/arm64/
6. 如果是 ARM 32 位,则:adb push %so本地路径%  /system/app/appview/lib/arm/
7. adb reboot

输入系统支持

Android App View 3D 当前不支持 New Input System,请检查 Edit >> Project Settings >> Player >> Other Settings >> Active Input Handling,确保选择的是 “Input Manager (Old)” 或 “Both”。

如果必须使用 New Input System,请添加如下脚本:

using UnityEngine;
using UnityEngine.Experimental.Android.AppView;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem.EnhancedTouch;
using UnityEngine.UI;
using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch;
using TouchPhase = UnityEngine.InputSystem.TouchPhase;
#endif

public class NewBehaviourScript : MonoBehaviour
{
    public AndroidAppViewSettings settings;

    private void Awake()
    {
#if ENABLE_INPUT_SYSTEM
        EnhancedTouchSupport.Enable();
#endif
        AndroidAppViewManager.view3DTouchInputDelegate = (() =>
        {
            AndroidAppViewTouchRawData data = null;
#if ENABLE_INPUT_SYSTEM
            if (Touch.activeTouches.Count < 1)
                return null;
            Touch touch = Touch.activeTouches[0];
            data = new AndroidAppViewTouchRawData(touch.screenPosition, TransferTouchPhase(touch.phase), touch.displayIndex);
#endif
            return data;
        });
    }

#if ENABLE_INPUT_SYSTEM
    UnityEngine.TouchPhase TransferTouchPhase(TouchPhase phase)
    {
        UnityEngine.TouchPhase ret = UnityEngine.TouchPhase.Ended;
        switch (phase)
        {
            case TouchPhase.Began:
                ret = UnityEngine.TouchPhase.Began;
                break;
            case TouchPhase.Moved:
                ret = UnityEngine.TouchPhase.Moved;
                break;
            case TouchPhase.Stationary:
                ret = UnityEngine.TouchPhase.Stationary;
                break;
            case TouchPhase.Ended:
                ret = UnityEngine.TouchPhase.Ended;
                break;
            case TouchPhase.Canceled:
                ret = UnityEngine.TouchPhase.Canceled;
                break;
            default:
                break;
        }
        return ret;
    }
#endif
}

Java API 说明

Android App View 新增了如下 Java API:

public void showView(String tokenName,View view)
public void init(Context context, String serverPackageName)

注意

  • 在 Java 侧调用 showView() 前:
    • 需要调用 AppViewClient.getInstance().init(Context context, String serverPackageName)
    • 需要在 C# 侧的 onClientShowViewCallback() 中调用 StartPresentation(),参考代码如下:
using UnityEngine;
using UnityEngine.Experimental.Android.AppView;
using UnityEngine.UI;

public class NewBehaviourScript : MonoBehaviour
{
    public AndroidAppView2D view2d;
    public AndroidAppView3D view3d;

    // Start is called before the first frame update
    void Start()
    {
        AndroidAppViewManager.onClientShowViewCallback += (string token) =>
        {
            // this token related to specific view2d
            view2d.androidAppViewController.StartPresentation();
        };

        AndroidAppViewManager.onClientShowViewCallback += (string token) =>
        {
            // this token related to specific view3d
            view3d.androidAppViewController.StartPresentation();
        };
    }
}

C# API 可在直接在本文档脚本 API 页面搜索 App View 查看。

URAS 中的 AssetBundle 和 Addressable
HMI Android 构建与交付