开发者社区 > 云原生 > 正文

应用研发平台EMAS中,Android热修复SDK在集成时,编译不通过。

在热修复SDK稳健接入文档中,按照步骤进行配置,编译项目时报错,com.android.tools.r8.internal.YI0: Different stack heights at jump target: 1 != 2,查询各个平台均未找到解决方法。
app下的build.gradle配置如下:
apply plugin: 'com.android.application'
apply plugin: 'com.huawei.agconnect'
apply plugin: "com.blankj.bus"
apply plugin: 'com.aliyun.ams.emas-services'
apply plugin: 'com.guardsquare.proguard'

android {
compileSdkVersion 31
defaultConfig {
applicationId "com.runtu.driver" //JPush 上注册的包名.
minSdkVersion 21
targetSdkVersion 31
versionCode 8
versionName "1.0.7"

    ndk {
        //选择要添加的对应cpu类型的.so库.
        abiFilters 'arm64-v8a', 'x86_64'
        moduleName "app"
    }

    manifestPlaceholders = [
            JPUSH_PKGNAME: applicationId,
            JPUSH_APPKEY : "", //JPush 上注册的包名对应的 Appkey.
            JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
    ]

    multiDexEnabled true

}

buildTypes {
    release {

// multiDexEnabled true
// 关闭 R8.
minifyEnabled false
shrinkResources false
applicationVariants.all { variant ->
variant.outputs.all {
def fileName = "runtudriver${defaultConfig.versionName}${releaseTime()}.apk"
outputFileName = fileName
}
}
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

    }
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

signingConfigs{
    debug{  
        storeFile file("../.jks") 
        storePassword ""  
        keyAlias ""              
        keyPassword ""     
    }
}

}

repositories {
maven {
url "https://maven.aliyun.com/nexus/content/repositories/releases"
}
}

proguard {
configurations {
release {
defaultConfiguration 'proguard-android.txt'
configuration 'proguard-rules.pro'
}
debug {
defaultConfiguration 'proguard-android-debug.txt'
configuration 'proguard-rules.pro'
}
}
}
项目级下的build.gradle配置如下:
buildscript {

repositories {
    google()
    jcenter()
    mavenCentral()
    maven { url 'https://maven.aliyun.com/repository/google' }
    maven { url 'https://maven.aliyun.com/repository/public' }
    maven { url 'https://developer.huawei.com/repo/' }
    maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases/' }
}
dependencies {
    classpath 'com.android.tools.build:gradle:7.1.2'
    classpath 'com.guardsquare:proguard-gradle:7.1.+'
    classpath 'com.huawei.agconnect:agcp:1.6.0.300'
    classpath 'com.blankj:bus-gradle-plugin:2.6'
    classpath 'com.aliyun.ams:emas-services:1.0.4'
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

}

allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
mavenCentral()
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://developer.huawei.com/repo/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases/' }
flatDir {
dirs 'libs'
}
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

展开
收起
dvvulbdncodjo 2024-02-19 16:03:32 200 0
2 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    根据您提供的信息,这个问题可能是由于ProGuard规则导致的。您可以尝试以下方法解决这个问题:

    1. 在app模块的build.gradle文件中,将minifyEnabled设置为true,然后运行构建命令。这将启用代码压缩和优化。
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources false
            applicationVariants.all { variant ->
                variant.outputs.all {
                    def fileName = "runtudriver${defaultConfig.versionName}${releaseTime()}.apk"
                    outputFileName = fileName
                }
            }
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    
    1. 如果问题仍然存在,您可以尝试在app模块的proguard-rules.pro文件中添加以下规则:
    -keepattributes *Annotation*,Signature,SourceFile,LineNumberTable
    -dontoptimize
    -dontobfuscate
    

    这些规则将保留注解、签名、源文件和行号表,并禁用优化和混淆。这可能有助于解决您遇到的问题。

    2024-02-22 13:59:05
    赞同 1 展开评论 打赏
  • 根据您提供的信息,报错“Different stack heights at jump target”通常与混淆工具(如R8或Proguard)处理字节码时遇到的问题有关。这个问题可能是由于混淆规则不正确或者某些库在混淆后产生了不兼容的字节码。针对这个特定问题,您可以尝试以下解决方案:

    1. 配置Proguard/R8规则:
      确保为所有使用的第三方库配置了正确的混淆规则,以避免混淆过程中出现问题。例如,对于JPush、AGC等库,它们可能提供了自己的混淆规则文件,需要在您的proguard-rules.pro中添加相应的规则。

    2. 禁用混淆:
      如果您在集成热修复SDK或其他特定功能时遇到混淆相关的问题,可以暂时关闭混淆进行测试,看看是否能编译通过。

    release {
        minifyEnabled false
    }
    
    1. 更新依赖版本:
      检查项目中的所有依赖库版本是否与当前Android Gradle插件(7.1.2)和Android SDK版本兼容。有时,过时的库可能会导致此类编译错误。

    2. 排查特定库冲突:
      逐个移除或替换项目中的第三方库,观察是否还存在此问题,以此来定位可能引发问题的具体库。

    2024-02-19 17:22:37
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载