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
相关产品推荐
相关产品推荐

