使用 Android Studio 签署 APK 时出现 Proguard 错误

Posted

技术标签:

【中文标题】使用 Android Studio 签署 APK 时出现 Proguard 错误【英文标题】:Proguard error while signing APK with Android Studio 【发布时间】:2019-02-14 09:12:32 【问题描述】:

我正在尝试使用 Proguard 调试我的错误。我的项目在调试时运行良好,但在 Proguard 上运行良好。任何帮助将不胜感激。

    我已经尝试在 Proguard 中使用 ignore warning。但是,应用程序在生成 APK 时会崩溃。 当前的 Proguard 设置不起作用。我已上传到Gist 的消息控制台 Build.gradle 如下所示

    Prodguard-project.txt 在gist

    buildscript 
      repositories 
        jcenter()
      
    
      dependencies 
        classpath 'com.android.tools.build:gradle:2.2.3'
      
    
    

build.gradle

    apply plugin: 'com.android.application'
    apply from: rootProject.file('gradle/codequality.gradle')
    android 
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig 
      versionCode 49
      versionName "1.8.8"

      minSdkVersion 14
      targetSdkVersion 22

      buildConfigField 'String', 'BUILD_TAG', '"' + getBuildTag() + '"'
      buildConfigField 'String', 'OWM_API_KEY', '"' + getOpenWeatherMapApiKey() + '"'
      buildConfigField 'boolean', 'ENABLE_WEATHER', 'true'

      def buildSuffix = getBuildSuffix(versionName, versionCode)
      applicationVariants.all  variant ->
        def file = variant.outputs[0].outputFile
        variant.outputs[0].outputFile = new File(file.parent, file.name.replace(".apk", "-" + buildSuffix + ".apk"))
      
    

    if (project.hasProperty('signingKeyStoreFile')) 
      signingConfigs 
        release 
            storeFile     file(signingKeyStoreFile)
            storePassword signingKeyStorePassword
            keyAlias      signingKeyAlias
            keyPassword   signingKeyPassword
        
      
    

    buildTypes 
      release 
         minifyEnabled true
         proguardFile 'proguard-project.txt'
         if (project.hasProperty('signingKeyStoreFile')) 
            signingConfig signingConfigs.release
         
       
    

    lintOptions 
        abortOnError false
        checkReleaseBuilds false
        disable 'MissingTranslation'
    
    compileOptions 
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    
  

  def getBuildSuffix(versionName, versionCode) 
    def suffix = versionName + '-' + versionCode
    if (System.getenv()['BUILD_NUMBER'] != null) 
        suffix += '-b' + System.getenv()['BUILD_NUMBER']
    
    return suffix
  

  def getBuildTag() 
    def tag = ''
    if (System.getenv()['BUILD_NUMBER'] != null) 
        tag += 'b' + System.getenv()['BUILD_NUMBER']
     else 
        tag += 'l'
    
    tag += '@' + new Date().format('yyyyMMdd')
    return tag
  

  def getOpenWeatherMapApiKey() 
    if (project.hasProperty('owmApiKey')) 
        return owmApiKey
     else 
        def apiKeyFile = file('default_owm_api_key');
        if (apiKeyFile.isFile()) 
          return apiKeyFile.text.trim()
        
    
    return 'NOKEY'
  

  ///////////////////////////////////////////////////
  // Dependencies

  repositories 
    mavenCentral()
  

  dependencies 

    //compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
    //compile 'com.android.support:support-v4:19.1.0'
    compile 'com.google.code.gson:gson:2.3.1'
    compile 'net.danlew:android.joda:2.9.4.1'
    compile 'com.google.android.gms:play-services-ads:9.8.0'
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile 'com.google.android.gms:play-services-appindexing:9.8.0'
  
  configurations 
    all*.exclude group: 'com.google.firebase', module: 'firebase-core'
    all*.exclude group: 'com.google.firebase', module: 'firebase-iid'
  

  ///////////////////////////////////////////////////
  // Checkstyle

  task checkstyleDebug(type: Checkstyle, dependsOn: 'compileDebugSources') 
    source = fileTree('src/main/java/')
    classpath = files('build/intermediates/classes/debug')
  
check.dependsOn checkstyleDebug

  ///////////////////////////////////////////////////
  // Findbugs

  task findbugsDebug(type: FindBugs, dependsOn: 'compileDebugSources') 
    source = fileTree('src/main/java/')
    classes = fileTree('build/intermediates/classes/debug')
    classpath = files() // empty classpath!
    effort = 'max'
    excludeFilter = rootProject.file('config/findbugs/androidExcludeFilter.xml')
  
  check.dependsOn findbugsDebug

  ///////////////////////////////////////////////////
  // PMD

  task pmd(type: Pmd) 
    source = fileTree('src/main/java/')
    ruleSets = ['java-basic', 'java-braces', 'java-android']
  
  check.dependsOn 'pmd'

【问题讨论】:

【参考方案1】:

尝试将getDefaultProguardFile('proguard-android.txt') 添加到proguardFile 'proguard-project.txt',以获得下一行:

proguardFile getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' 或者开始从您的 proguard-project.txt 中搜索问题,例如:

    添加规则-keepattributes SourceFile,LineNumberTable,InnerClasses,Signature,Exceptions

    添加规则-dontwarn com.google.** 依此类推,由你的 proguard 失败日志

【讨论】:

如果我采用提到的第一种方法,是否需要明确添加'proguard-android.txt'文件。@LifeStyle 不,尝试不使用或尝试使用 getDefaultProguardFile(proguard-android-optimize.txt) 但使用上面提到的固定 proguard 规则 1.我是否需要明确添加 proguard-android-optimize.txt 文件,因为它目前不存在。 2. 用 getDefaultProguardFile(proguard-android-optimize.txt) 改变 proguardFile 'proguard-project.txt'。请纠正我。我必须在没有 prodguard 的情况下发布。 您可以尝试使用或不使用。 proguard-android.txt 和 proguard-android-optimize.txt 是默认的 proguard android 规则。您可以添加或不添加它们,但如果您在自己的 proguard 文件中有优化标志并添加了 proguard-android.txt,则不会执行优化。因此,使用什么以及是否使用完全由您决定。但是对于开始尝试不使用 proguard getDefaultProguardFile(proguard-android-optimize.txt). 仅使用您的 proguard-project.txt

以上是关于使用 Android Studio 签署 APK 时出现 Proguard 错误的主要内容,如果未能解决你的问题,请参考以下文章

您必须使用与您要验证的应用程序相同的签名签署一个 apk - blockchainds.com:如何通过 Android Studio 签署 apk 文件?

如何在没有 android studio 的情况下签署 android apk

最新的 Android Studio 2020.3.1 在签名 APK 时未显示签名版本选项

在 Android Studio 中签署 Android apk 文件的最简单方法是啥? [复制]

android studio更新之后打包遇到V1(Jar Signature) V2(Full APK Signature)问题

对签署 android APK 感到困惑?