You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native集成CI360 SDK时Release包缺失SASCollector类问题求助

React Native Release打包时CI360 SDK(SASCollector类)缺失问题排查与解决

问题描述

在React Native应用中集成CI360 SDK时,Debug模式下本地运行或打包一切正常,所有SDK依赖均能被正确包含,但Release打包后,APK中缺失核心的SASCollector类及大量SDK相关文件。

安卓端集成步骤:

  • 将SASCollector.jar放入android/app/libs目录
  • 将SASCollector.properties放入android/app/src/main/assets目录
  • 自定义Native模块实现JS与Java方法的调用

项目中另一同类原生库DialMyApp配置方式相似,但Release打包无异常。已尝试调整SDK存放路径、更换Gradle版本,问题仍未解决。

相关配置

项目根目录build.gradle

buildscript {
    ext {
        buildToolsVersion = "33.0.0"
        minSdkVersion = 21
        compileSdkVersion = 33
        targetSdkVersion = 33
        ndkVersion = "25.1.8937393"
    }
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath("com.android.tools.build:gradle:7.3.1")
        classpath("com.facebook.react:react-native-gradle-plugin")
    }
}

allprojects {
    repositories {
        mavenCentral()
        maven {
            url("$rootDir/../node_modules/react-native/android")
        }
        maven {
            url("$rootDir/../node_modules/jsc-android/dist")
        }
        google()
        maven { url 'https://www.jitpack.io' }
    }
}

android/app/build.gradle

plugins {
    id("com.android.application")
    id("com.facebook.react")
}

android {
    namespace "com.yourprojectname"
    compileSdkVersion rootProject.ext.compileSdkVersion

    defaultConfig {
        applicationId "com.yourprojectname"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
        }
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "com.facebook.react:react-native:+"
}

package.json

{
  "name": "YourProject",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "android": "react-native run-android",
    "ios": "react-native run-ios",
    "start": "react-native start",
    "test": "jest",
    "lint": "eslint ."
  },
  "dependencies": {
    "react": "18.2.0",
    "react-native": "0.72.0"
  },
  "devDependencies": {
    "@babel/core": "^7.20.0",
    "@babel/preset-env": "^7.20.0",
    "@babel/runtime": "^7.20.0",
    "@react-native/eslint-config": "^0.72.0",
    "@react-native/metro-config": "^0.72.0",
    "@tsconfig/react-native": "^3.0.0",
    "@types/react": "^18.0.24",
    "@types/react-test-renderer": "^18.0.0",
    "babel-jest": "^29.2.1",
    "eslint": "^8.19.0",
    "jest": "^29.2.1",
    "metro-react-native-babel-preset": "0.76.5",
    "prettier": "^2.4.1",
    "react-test-renderer": "18.2.0"
  },
  "jest": {
    "preset": "react-native"
  }
}

解决方案

1. 修复ProGuard混淆规则

Release模式开启minifyEnabled true后,ProGuard可能误判SDK类为无用代码并移除。在android/app/proguard-rules.pro中添加以下规则:

# 保留CI360 SDK所有类与方法
-keep class com.sas.android.analytics.collector.** { *; }
# 保留SDK反射所需属性
-keepattributes Signature
-keepattributes *Annotation*

2. 确保jar包被正确引入

检查android/app/build.gradle的dependencies块,明确引入SDK的jar包:

// 方式1:引入libs下所有jar
implementation fileTree(dir: "libs", include: ["*.jar"])
// 方式2:直接指定SASCollector.jar(更稳妥)
implementation files("libs/SASCollector.jar")

3. 确认资源打包配置

保证SASCollector.properties在Release模式下被打包到assets目录,在android/app/build.gradle的android块中添加:

android {
    sourceSets {
        main {
            assets.srcDirs = ['src/main/assets']
        }
        release {
            assets.srcDirs = ['src/main/assets']
        }
    }
}

4. 对比DialMyApp配置差异

逐一对比DialMyApp的配置细节:

  • 查看其jar包引入方式(本地libs/maven依赖)
  • 检查对应的ProGuard规则是否有特殊保留配置
  • 确认其Native模块的注册逻辑是否在Release模式下未被混淆

5. 临时禁用R8混淆测试

在gradle.properties中添加以下配置,关闭R8混淆后重新打包:

android.enableR8=false

若SDK类恢复正常,说明问题根源在混淆规则,需进一步完善ProGuard配置。

6. 保留Native模块注册类

确保自定义Native模块未被ProGuard移除,在proguard-rules.pro中添加:

# 保留自定义Native模块类
-keep class com.yourprojectname.modules.** { *; }
# 保留React Native Native模块构造方法
-keepclassmembers class * implements com.facebook.react.bridge.NativeModule {
    public <init>(com.facebook.react.bridge.ReactApplicationContext);
}

内容的提问来源于stack exchange,提问作者Lucas Acuña

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:22:37