生成签名的 APK:构建 APK Android Studio 时出错

Posted

技术标签:

【中文标题】生成签名的 APK:构建 APK Android Studio 时出错【英文标题】:Generate Signed APK: Errors while building APK Android Studio 【发布时间】:2017-05-10 11:36:10 【问题描述】:

我无法使用 minifyEnabled trueshrinkResources true 生成签名 APK

应用级别:build.gradle

buildscript 
    repositories 
        mavenCentral()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:2.1.0'
    

apply plugin: 'com.android.application'

repositories 
    mavenCentral()


android 
    compileSdkVersion 23
    buildToolsVersion '22.0.1'

    defaultConfig 
        applicationId "......."
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
    buildTypes 
        debug 
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        

        release 
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
    

    configurations 
        compile.exclude group: "org.apache.httpcomponents", module: "httpclient"
    


dependencies 
    compile 'com.android.support:design:23.0.1'
    compile 'com.android.support:cardview-v7:23.0.1'
    compile 'com.android.support:recyclerview-v7:23.0.1'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.google.apis:google-api-services-youtube:v3-rev149-1.20.0'
    compile 'com.google.http-client:google-http-client-android:1.20.0'
    compile 'com.google.api-client:google-api-client-android:1.20.0'
    compile 'com.google.api-client:google-api-client-gson:1.20.0'
    compile files('libs/YouTubeAndroidPlayerApi.jar')
    compile 'com.github.clans:fab:1.6.2'

消息视图

Information:Gradle tasks [:app:assembleRelease]
:app:preBuild UP-TO-DATE
:app:preReleaseBuild UP-TO-DATE
:app:checkReleaseManifest
:app:preDebugBuild UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72301Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72301Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2301Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72301Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42301Library UP-TO-DATE
:app:prepareComGithubClansFab162Library UP-TO-DATE
:app:prepareReleaseDependencies
:app:compileReleaseAidl
:app:compileReleaseRenderscript
:app:generateReleaseBuildConfig
:app:generateReleaseAssets UP-TO-DATE
:app:mergeReleaseAssets
:app:generateReleaseResValues UP-TO-DATE
:app:generateReleaseResources
:app:mergeReleaseResources
:app:processReleaseManifest
:app:processReleaseResources
:app:generateReleaseSources
:app:processReleaseJavaRes UP-TO-DATE
:app:compileReleaseJavaWithJavac
Note: .....YouTubeRecyclerViewFragment.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: ....GetPlaylistAsyncTask.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
:app:compileReleaseNdk UP-TO-DATE
:app:compileReleaseSources
:app:proguardRelease UP-TO-DATE
:app:dexRelease
:app:shrinkReleaseResources
Removed unused resources: Binary resource data reduced from 741KB to 402KB: Removed 45%
Note: If necessary, you can disable resource shrinking by adding
android 
    buildTypes 
        release 
            shrinkResources false
        
    

:app:validateExternalOverrideSigning
:app:packageRelease FAILED
Error:Execution failed for task ':app:packageRelease'.
> Unable to compute hash of ....\app\build\intermediates\classes-proguard\release\classes.jar
Information:BUILD FAILED
Information:Total time: 7.45 secs
Information:1 error
Information:0 warnings
Information:See complete output in console

【问题讨论】:

你能用YouTubeRecyclerViewFregment中的源代码编辑你的答案吗?似乎您正在使用一些已弃用的 API 【参考方案1】:

你得到了

Removed unused resources: Binary resource data reduced from 741KB to 402KB: Removed 45%
Note: If necessary, you can disable resource shrinking by adding
android 
    buildTypes 
        release 
            shrinkResources false
        
    

:app:validateExternalOverrideSigning
:app:packageRelease FAILED
Error:Execution failed for task ':app:packageRelease'.

资源收缩只能与代码收缩结合使用。

minifyEnabled 是一款 Android 工具,可在您构建应用程序时减小其大小。

android 

    buildTypes 
        release 
            shrinkResources true // This must be first 
            minifyEnabled true   // This must be after shrinkResources 
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        
    

如果您尚未使用 minifyEnabled 代码构建您的应用 收缩,然后在启用收缩资源之前尝试,因为你 可能需要编辑您的 proguard-rules.pro 文件以保留课程或 在您开始之前动态创建或调用的方法 删除资源。

请阅读关于Shrink Your Code and Resources

的官方指南

建议

使用最新版本

compileSdkVersion 25
buildToolsVersion '25.0.1'
targetSdkVersion 25
compile 'com.android.support:appcompat-v7:25.1.0' // set other 25.1.0

注意

YouTubeRecyclerViewFragment.java uses or overrides a deprecated API.

使用备用最新版本。

【讨论】:

【参考方案2】:

首先检查你是否真的需要使用shrinkResources

如果是这样,请按照 IntelliJ Amiya 上面提到的开发者链接 https://developer.android.com/studio/build/shrink-code.html#shrink-resources 中的建议进行操作,您必须像下面这样使用

安卓 构建类型 发布 shrinkResources true // -- 总是在 minifyEnabled 上面添加 -- 缩小启用真 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

【讨论】:

【参考方案3】:

尝试使用终端通过 gradle 命令生成签名的 APK,查看堆栈跟踪,这将为您提供详细的日志,哪里有问题。

在 Windows 中

$gradle clean

$  gradle --stacktrace assembleRelease

在 Ubuntu 中

$./gradlew clean

$./gradlew --stacktrace assembleRelease 

如果您仍然有问题,请在此处发布堆栈跟踪

【讨论】:

【参考方案4】:

清理项目并重新开始生成签名的 Build/Apk。 它对我来说工作正常。

【讨论】:

【参考方案5】:

这个:app:proguardRelease UP-TO-DATE .. 使这个日志不够完整,无法说明this answer 是否有帮助。

请再次执行 clean + build release 以获得包含所有步骤的完整日志,您可能还希望将 --info 添加到 gradle 选项,甚至添加 --debug 以在 gradle 构建日志中获取更多诊断消息。

Clean+build 还可以解决一些奇怪的问题,即 gradle/other-tool 无法正确更新某些文件并重用旧的不正确的文件 - 很少发生。

还尝试关闭缩小(不是解决方案,只是实验),是否有帮助(定位问题真正与 proguard 缩小而不是其他地方)。

当然,如果在缩小过程中出现与 proguard 相关的错误,请尝试遵循链接答案中的建议。

【讨论】:

【参考方案6】:

如果您无法在 Android Studio 中对 apk 进行签名,请手动对其进行签名

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

如果你没有密钥,用keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000生成它

您也可以手动签名为manual:

keytool -genkey -v -keystore my-release-key.jks-keyalg RSA -keysize 2048 -validity 10000 -alias app
zipalign -v -p 4 my-app-unaligned.apk my-app.apk
apksigner sign --ks my-release-key.jks my-app.apk

检查签名的apk

apksigner verify my-app.apk

【讨论】:

【参考方案7】:

R.raw.Keep(xml 文件)

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="strict" />

不要忘记从 .java 源文件中引用此资源。更多详情见https://developer.android.com/studio/build/shrink-code.html

如果您担心 apk 文件的大小,那么缩小图像文件也是一种好习惯。也就是将 RGB 通道转换为索引通道,最多可以节省 50% 的空间。

注意:.....YouTubeRecyclerViewFragment.java 使用或覆盖了已弃用的 API。

【讨论】:

【参考方案8】:

使用 Keytool 二进制或 exe 生成私有密钥库。以下链接中的说明。然后,您可以使用此密钥库为您的应用程序签名。安装 Java 时会安装 Keytool。

http://docs.oracle.com/cd/E19509-01/820-3503/ggfen/index.html

【讨论】:

【参考方案9】:

可能是您的某个库(尤其是可以使用网络的库(httpClientokHttp 等))发生冲突。尝试将所有库添加到新项目中(不要在项目中添加任何代码或组件).. 如果该项目中也发生错误,那么问题出在其中一个库中.. 尝试一一取消注释库..

【讨论】:

以上是关于生成签名的 APK:构建 APK Android Studio 时出错的主要内容,如果未能解决你的问题,请参考以下文章

Bamboo + Android + Gradle:如何生成签名的apk?

Android 错误构建签名 APK:未找到用于签名配置“externalOverride”的 keystore.jks

Android - 签名的 APK - Gradle 执行失败

为 android studio 项目生成签名 APK 时,通用包装器中没有匹配的架构

怎么用android studio生成apk文件

android如何生成签名apk文件