如何在使用minifyenabled构建签名apk时限制应用程序崩溃,意味着应用progurad?

时间:2016-07-15 11:58:24

标签: android mapping minify android-proguard

在我的应用程序中,我启用了 progurad by minifyEnabled true 和progurad规则我没有添加,我构建了登录的apk然后它崩溃了在lauching只有那时我想,我必须添加不必修改的类。然后我添加了诸如 -keep public class * extends android.app.Activity 之类的progurd规则,然后它也不起作用,我不知道为什么,因为它取决于其他文件,如视图和R文件全部。所以我的疑问是,当我启用progurad时,我必须在progurad规则中添加所有类和库,否则它将缩小其他类并使其无法工作。所以如何在不崩溃app的情况下添加所有类build登录apk 在添加proguard规则后,它也会崩溃应用程序在此处添加项目特定的ProGuard规则。

> -keep public class * extends android.app.Activity
> -keep public class * extends android.app.Application
> -keep public class * extends android.support.v7.app.AppCompatActivity
> -keep public class * extends android.content.BroadcastReceiver
> -keep public class * extends android.content.ContentProvider
> -keep public class * extends android.preference.Preference
> -keep public class android.os.AsyncTask
> -keep public class * extends android.view.View {
>     public <init>(android.content.Context);
>     public <init>(android.content.Context, android.util.AttributeSet);
>     public <init>(android.content.Context, android.util.AttributeSet, int); }
> -keepclasseswithmembers class * {
>     public <init>(android.content.Context, android.util.AttributeSet); }
> -keepclasseswithmembers class * {
>     public <init>(android.content.Context, android.util.AttributeSet, int); }
> -keepclassmembers class * extends android.content.Context {
>     public void *(android.view.View);
>     public void *(android.view.MenuItem); }
> # The official support library.
> -keep class android.support.v4.app.** { *; }
> -keep interface android.support.v4.app.** { *; }
> -keep class android.support.v7.app.** { *; }
> -keep interface android.support.v7.app.** { *; }
> -dontwarn android.support.**

如何使用 proguard发布版测试应用,有什么可以检查在apk上签名的direclty,或者我必须添加任何映射文件。如何测试直接释放apk或如果该apk上传到Playstore然后它将基于映射文件

工作

3 个答案:

答案 0 :(得分:0)

在我的proguard文件中,所有内容都已注释掉,并且 minifyEnabled true 可以正常工作。你尝试过这样的事情:

<强> proguard-rules.pro

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\<yourUser>\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

我的gradle看起来像:

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

修改 其他解决方案:https://stackoverflow.com/a/6492478

答案 1 :(得分:0)

这就是documentation对Proguard的简单说法。

要使您的APK文件尽可能小,您应该启用收缩以删除发布版本中未使用的代码和资源。此页面介绍了如何执行此操作以及如何指定在构建期间要保留或丢弃的代码和资源。

ProGuard提供代码缩减功能,它可以检测并删除打包应用中未使用的类,字段,方法和属性,包括来自附带代码库的内容,方法和属性(使其成为处理64k参考限制的有用工具) )。 ProGuard还优化字节码,删除未使用的代码指令,并使用短名称对剩余的类,字段和方法进行模糊处理。

我已经阅读了一篇很好的帖子,所以你也应该从here

阅读

如果您想知道如何实际使用它,那么this回答可能会对您有所帮助,如果您想了解何时使用它,请参阅this回答。

答案 2 :(得分:0)

我找到了一些解决方案,当我们直接安装直接发布apk时缩小然后代码将被缩小(混淆),所以应用程序将不知道这些代码是什么,所以它直接安装发布apk时会崩溃。

所以我的解决方案是在将apk上传发布到playstore并将build \ outputs \ mapping \ release \ mapping.txt 文件下的映射文件上传到playstore之后,从playstore下载应用程序然后它可能工作,在映射文件中所有的映射类都将在那里。那时它不会崩溃。将映射文件上传到playstore https://support.google.com/googleplay/android-developer/answer/6295281?hl=en我没有尝试过,但是如果有人尝试那么请告诉我编辑答案