tencent cloud

文档反馈

Android 常见问题

最后更新时间:2024-06-27 16:41:36

    什么是同层渲染?

    小程序的内容大多是渲染在 WebView 上的,如果把 WebView 看成单独的一层,那么由系统自带的这些原生组件则位于另一个更高的层级。两个层级是完全独立的,因此无法简单地通过使用 z-index 控制原生组件和非原生组件之间的相对层级。正如下图所示,非原生组件位于 WebView 层,而原生组件及 cover-view 与 cover-image 则位于另一个较高的层级:
    
    那么「同层渲染」顾名思义则是指通过一定的技术手段把原生组件直接渲染到 WebView 层级上,此时「原生组件层」已经不存在,原生组件此时已被直接挂载到 WebView 节点上。你几乎可以像使用非原生组件一样去使用「同层渲染」的原生组件,比如使用 view、image 覆盖原生组件、使用 z-index 指定原生组件的层级、把原生组件放置在 scroll-view、swiper、movable-view 等容器内,通过 WXSS 设置原生组件的样式等等。启用「同层渲染」之后的界面层级如下图所示:
    

    同层渲染的实现原理?

    小程序在 Android 端采用 chromium 作为 WebView 渲染层,Android 端的 WebView 是单独进行渲染,经渲染后的 WebView 是一个完整的视图,因此需要采用其他的方案来实现「同层渲染」。经过我们的调研发现,chromium 支持 WebPlugin 机制,WebPlugin 是浏览器内核的一个插件机制,主要用来解析和描述 embed 标签。Android 端的同层渲染就是基于 embed 标签结合 chromium(x5内核定制) 内核扩展来实现的。
    
    Android 端「同层渲染」的大致流程如下:
    WebView 侧创建一个 embed DOM 节点并指定组件类型;
    chromium 内核会创建一个 WebPlugin 实例,并生成一个 RenderLayer;
    Android 客户端初始化一个对应的原生组件;
    Android 客户端将原生组件的画面绘制到步骤2创建的 RenderLayer 所绑定的 SurfaceTexture 上;
    通知 chromium 内核渲染该 RenderLayer;
    chromium 渲染该 embed 节点并上屏。
    
    
    
    通过这种方式可以用于 map、video、canvas、camera、textarea 和 input 等原生组件的渲染。

    小程序启动失败排查

    小程序启动失败,可能有如下几种原因:
    原因一:配置文件路径错误,configAssetName 设置的是 assets 目录下文件的完整路径,如果配置文件在子目录下需要追加目录路径,例如:server/tcmpp-android-configurations.json。
    原因二:不允许修改小程序配置文件内容,否则小程序无法正常运行。
    原因三:配置文件中的 packageName 必须与应用的 applicationId 保持一致,否则 App 运行失败,因为初始化时会校验配置文件中的 packageName,可以通过如下设置不进行包名校验。
    MiniInitConfig config = builder
    .verifyPkg(false)//忽略包名校验
    .build();
    
    
    原因四:确定上面初始化注解 @ProxyService 是否生成了如下类 ExtProxyServiceScope:
    
    
    

    SDK 如何确保隐私合规?

    小程序 SDK 的初始化是在开发者调用 TmfMiniSDK 类的方法时调用的,所以在用户同意隐私合规授权之后,再调用 TmfMiniSDK 类中提供的方法即可。

    自定义小程序 API 出现错误,怎么排查?

    在编译路径中,检查是否生成 XxxJsPluginScope,如下图:
    
    检查客户端定义的事件与小程序调用方法名是否一致,自定义小程序API的事件名称区分大小写

    小程序域名和隐私 API 校验逻辑

    小程序使用过程中会校验接口请求域名的合法性,以及如果在管理后台设置了隐私 API 也会进行授权校验,但在如下场景下不进行校验:
    运行小程序是非正式版本且小程序开启了小程序调试

    模块化工程支持

    当开发者在模块化工程中多个模块同时使用了注解 @JsPlugin 或 @ProxyService 时,Make Project 工程时会出现如下错误:
    
    需要按照如下配置支持多模块化工程:
    1. 在每个使用了 @JsPlugin 或 @ProxyService 注解的 module 的 build.gradle 中添加如下代码:
    android {
    defaultConfig {
    javaCompileOptions {
    annotationProcessorOptions {
    //配置模块名:开发者自己定义唯一名称,模块名遵循android类名定义规范
    arguments = [tcmppModuleName: "Demo"]
    }
    }
    }
    }
    2. 初始化代码中注册模块:
    @ProxyService(proxy = MiniConfigProxy.class)
    public class MiniConfigProxyImpl extends MiniConfigProxy {
    @Override
    public MiniInitConfig buildConfig() {
    MiniInitConfig.Builder builder = new MiniInitConfig.Builder();
    
    //将上面定义的所有module都进行注册,registerModule参数值与上面tcmppModuleName定义的保持一致
    return builder
    

    如何查看 SDK 日志输出?

    1. 开发者可以在开发工具上,通过关键字 TMF_MINI 过滤得到 SDK 日志。
    
    
    
    2. 查看小程序 JS 错误日志。
    方式一:开发者可以通过关键字 MINI_JS_LOG 过滤得到JS日志。
    
    方式二:chrome 调试小程序的 JS 是否有错误。
    

    如何打开小程序的调试模式?

    为了方便小程序调试查看 log 日志,客户端需要开启小程序调试入口,参考小程序宿主自定义-"自定义胶囊"getMoreItems 实现。
    /**
    * 返回胶囊更多面板的按钮,扩展按钮的ID需要设置为[100, 200]这个区间中的值,否则,添加无效
    * 注:此方法在小程序进程调用
    * @param builder
    * @return
    */
    public ArrayList<MoreItem> getMoreItems(MoreItemList.Builder builder){
    builder.addDebug("调试", icon)//设置控制面板调试按钮
    return builder.build();
    }
    设置后小程序控制面板会出现调试按钮,单击开启调试模式后,重启小程序进入调试模式。
    

    小程序 SDK 会主动清理小程序包缓存吗?

    不会,需要开发者自行调用小程序 SDK 提供的小程序删除方法进行清理(删除小程序);如果未主动清理,宿主应用的缓存会随着使用小程序数量的增大而增大。
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持