uni-app 通过uts插件引入facebook-android-sdk打自定义基座后,无法找到sdk中对应分享相关的类进行调用

uni-app 通过uts插件引入facebook-android-sdk打自定义基座后,无法找到sdk中对应分享相关的类进行调用

开发环境 版本号 项目创建方式
Windows 10 专业版 22H2 3.99 HBuilderX

示例代码:

uts的config.json示例代码如下

{
  "minSdkVersion": "21",
  "dependencies": [
        {
            "id":"com.facebook.android:facebook-android-sdk",
            "source": "implementation ('com.facebook.android:facebook-android-sdk:16.3.0') {exclude group:'androidx.core', module:'core-ktx' exclude group:'org.jetbrains.kotlin', module:'kotlin-stdlib-jdk7'}"
        },
    ]

除此之外,还尝试过

{
  "minSdkVersion": "21",
  "dependencies": [
        {
            "id":"com.facebook.android:facebook-android-sdk",
            "source": "implementation ('com.facebook.android:facebook-share:latest.release') {exclude group:'androidx.core', module:'core-ktx' exclude group:'org.jetbrains.kotlin', module:'kotlin-stdlib-jdk7'}"
        },
    ]

以及

{
  "minSdkVersion": "21",
  "dependencies": [
        {
            "id":"com.facebook.android:facebook-android-sdk",
            "source": "api ('com.facebook.android:facebook-share:latest.release') {exclude group:'androidx.core', module:'core-ktx' exclude group:'org.jetbrains.kotlin', module:'kotlin-stdlib-jdk7'}"
        },
    ]

直接使用

{
  "minSdkVersion": "21",
  "dependencies": [
        “com.facebook.android:facebook-share:latest.release”
    ]
}

则会报androidx.core:core-ktx 和 org.jetbrains.kotlin:kotlin-stdlib-jdk7依赖冲突错误

插件中 index.uts 相关代码如下

import ShareLinkContent from 'com.facebook.share.model.ShareLinkContent';
import MessageDialog from 'com.facebook.share.widget.MessageDialog';
import { Uri } from 'android.net'

export type Share = () => void

export const messengerShare:Share = () => {
    const context = UTSAndroid.getUniActivity()
    const content = new ShareLinkContent.Builder().setContentUrl(Uri.parse('https://www.baidu.com')).build();
    MessageDialog.show(context, content)
}

AndroidManifest.xml代码如下

<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="io.dcloud.uni_modules.xxxxxxxxTest001" >

  // 注意:这里是插件的包名而不是应用的包名

   // 配置权限
    <!--创建前台服务权限-->
    <uses-permission android:name="android.permission.INTERNET"/>

    <queries>
        <provider android:authorities="com.facebook.katana.provider.PlatformProvider" />
    </queries>

    <application>
       // 配置service / activity
        <activity android:name="com.facebook.FacebookActivity" />
        <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="xxxxxxxx"/>
        <meta-data android:name="com.facebook.sdk.ClientToken" android:value="xxxxxxxx"/>
        <provider android:authorities="com.facebook.app.FacebookContentProviderxxxxxxxx" android:name="com.facebook.FacebookContentProvider" android:exported="true"/>
    </application>
</manifest>

nvue页面中调用代码如下

import {messengerShare} from "@/uni_modules/xxxxxxxx-test001"
const testshare =() =>{
    messengerShare()
}

最终调用日志一直报这个错误

12:59:21.939 [JS Framework] Failed to invoke the event handler of "click" on u-text (120):  
 Error: targetMethod error::java.lang.NoClassDefFoundError: com.facebook.share.widget.MessageDialog
12:59:21.949 reportJSException >>> exception function:__WEEX_CALL_JAVASCRIPT__, exception:JavaScript execute error!Uncaught Error: targetMethod error::java.lang.NoClassDefFoundError: com.facebook.share.widget.MessageDialog

# 操作步骤:


用以上代码示例即可复现

预期结果:

能够成功调用函数,并拉起分享界面


# 实际结果:


报以下错误

```bash
12:59:21.939 [JS Framework] Failed to invoke the event handler of "click" on u-text (120):  
 Error: targetMethod error::java.lang.NoClassDefFoundError: com.facebook.share.widget.MessageDialog
12:59:21.949 reportJSException >>> exception function:__WEEX_CALL_JAVASCRIPT__, exception:JavaScript execute error!Uncaught Error: targetMethod error::java.lang.NoClassDefFoundError: com.facebook.share.widget.MessageDialog

并且我在打包的基座,使用LibChecker查看 app引入的nativelibrary的文件中,也没有对应的facebook-sdk,但在activities, boardcast receivers, content provider中都能看到引入的facebook SDK


更多关于uni-app 通过uts插件引入facebook-android-sdk打自定义基座后,无法找到sdk中对应分享相关的类进行调用的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

已在QQ联系,发一下复现问题的示例工程

更多关于uni-app 通过uts插件引入facebook-android-sdk打自定义基座后,无法找到sdk中对应分享相关的类进行调用的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在使用 uni-app 的 UTS 插件引入 facebook-android-sdk 并打自定义基座后,如果无法找到 SDK 中与分享相关的类进行调用,可能的原因和解决方案如下:


1. 确保 facebook-android-sdk 正确引入

  • 检查 build.gradle 文件中是否正确引入了 facebook-android-sdk 依赖。
  • 示例:
    dependencies {
        implementation 'com.facebook.android:facebook-share:latest.version'
    }
    
  • 确保依赖的版本是最新的,或者是你需要的版本。

2. 检查 UTS 插件的配置

  • 确认 UTS 插件在 uts.json 或相关配置文件中正确声明了 facebook-android-sdk 的包名和类。
  • 示例:
    {
      "android": {
        "dependencies": {
          "facebook-share": "com.facebook.android:facebook-share:latest.version"
        }
      }
    }
    

3. 在 UTS 中正确调用 SDK 的类

  • 确保你在 UTS 代码中正确导入了 facebook-android-sdk 的类。
  • 示例:
    import { ShareContent } from 'com.facebook.share.model';
    import { ShareDialog } from 'com.facebook.share.widget';
    
  • 如果出现无法找到类的错误,检查类名是否正确,或者尝试使用完整的包路径。

4. 检查自定义基座是否包含 SDK

  • 确保在打自定义基座时,facebook-android-sdk 已经被正确打包到 APK 中。
  • 可以通过解压 APK 文件,检查 lib 目录下是否有相关的 .so 文件,或者检查 classes.dex 中是否包含 Facebook 的类。

5. 解决混淆问题

  • 如果使用了 ProGuard 或 R8 进行代码混淆,确保在 proguard-rules.pro 中添加了 Facebook SDK 的混淆规则。
  • 示例:
    -keep class com.facebook.** { *; }
    -dontwarn com.facebook.**
    

6. 调试与日志

  • 在代码中添加日志,确认是否成功加载了 facebook-android-sdk 的类。
  • 示例:
    console.log('ShareDialog:', ShareDialog);
    
  • 如果日志输出为 undefined,说明类未正确加载。

7. 检查 SDK 的初始化

  • 确保在调用分享功能之前,已经正确初始化了 Facebook SDK。
  • 示例:
    import { FacebookSdk } from 'com.facebook.FacebookSdk';
    FacebookSdk.sdkInitialize(context);
回到顶部