代码之家  ›  专栏  ›  技术社区  ›  user4813855

android studio 3.1.2中的Proguard

  •  0
  • user4813855  · 技术社区  · 6 年前

    我有一个 apk 具有 31MB 我使用的尺寸 proguard 确实如此 30MB 现在

    问题: 当我上传时 apk公司 在google上播放的大小 apk公司 增加至 57MB

    我能做什么?

    这是我的 gradle :

    plugins {
        id 'com.onesignal.androidsdk.onesignal-gradle-plugin' version '0.7.0'
    }
    apply plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin'
    
    repositories {
        maven { url 'https://maven.google.com' }
    }
    apply plugin: 'com.android.application'
    
    repositories {
        jcenter()
    }
    
    android {
        compileSdkVersion 27
        buildToolsVersion '27.0.3'
        defaultConfig {
            applicationId "ss.sss.sss"
            manifestPlaceholders = [onesignal_app_id               : "41b72f81-0a8b-4ebd-86be-539e2e65113d",
                                    // Project number pulled from dashboard, local value is ignored.
                                    onesignal_google_project_number: "160823840785"]
            minSdkVersion 16
            targetSdkVersion 27
            versionCode 3
            versionName "1"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            vectorDrawables.useSupportLibrary = true
            multiDexEnabled true
        }
        dataBinding {
            enabled = true
        }
        buildTypes {
            release {
                lintOptions {
                    disable 'MissingTranslation'
                    checkReleaseBuilds false
                    // Or, if you prefer, you can continue to check for errors in release builds,
                    // but continue the build even when errors are found:
                    abortOnError false
                }
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
            debug {
                applicationIdSuffix '.debug'
            }
        }
    
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }
    
    dependencies {
        implementation fileTree(include: ['*.jar'], dir: 'libs')
        androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        implementation 'com.android.support.constraint:constraint-layout:1.0.2'
        implementation 'com.android.support:exifinterface:27.1.1'
        implementation 'com.android.support:appcompat-v7:27.1.1'
        implementation 'com.android.support:recyclerview-v7:27.1.1'
        implementation 'com.android.support:cardview-v7:27.1.1'
        implementation 'com.android.support:design:27.1.1'
        implementation 'com.android.support:support-vector-drawable:27.1.1'
        implementation 'com.github.bumptech.glide:glide:3.8.0'
        implementation 'com.google.code.gson:gson:2.8.2'
        implementation 'com.squareup.okhttp3:okhttp:3.10.0'
        implementation 'com.squareup.retrofit2:retrofit:2.4.0'
        implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
        implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
        implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
        implementation 'com.squareup.picasso:picasso:2.5.2'
        //implementation 'com.nineoldandroids:library:2.4.0'
        implementation 'com.android.volley:volley:1.0.0'
        implementation 'io.reactivex.rxjava2:rxjava:2.1.3'
        implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
        implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
        //implementation 'com.netflix.rxjava:rxjava-android:0.16.1'
        implementation 'com.netflix.rxjava:rxjava-android:0.20.3'
        implementation 'com.joanzapata.iconify:android-iconify-fontawesome:2.2.2'
        implementation 'com.joanzapata.iconify:android-iconify-material:2.2.2'
        implementation 'com.joanzapata.iconify:android-iconify-material-community:2.2.2'
        implementation 'com.jakewharton:butterknife:8.8.1'
        implementation 'com.onesignal:OneSignal:[3.6.5, 3.99.99]'
        implementation 'com.google.firebase:firebase-core:11.8.0'
        implementation 'com.google.firebase:firebase-crash:11.8.0'
        testImplementation 'junit:junit:4.12'
        annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
        implementation 'com.github.barteksc:android-pdf-viewer:2.8.1'
        implementation 'org.greenrobot:eventbus:3.0.0'
        implementation 'com.android.support:support-compat:27.1.1'
        implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
        implementation 'com.android.support:multidex:1.0.3'
    }
    
    apply plugin: 'com.google.gms.google-services'
    

    这是我的 proguard-rules.pro :

    #For eventBus
    -keepattributes *Annotation*
    -keepclassmembers class * {
        @org.greenrobot.eventbus.Subscribe <methods>;
    }
    -keep enum org.greenrobot.eventbus.ThreadMode { *; }
    
    # Only required if you use AsyncExecutor
    -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
        <init>(java.lang.Throwable);
    }
    #For sqliteassethelper
    -keepclassmembers class fqcn.of.javascript.interface.for.webview {
       public *;
    }
    #For proguard-support-v7-appcompat
    -keep public class android.support.v7.widget.** { *; }
    -keep public class android.support.v7.internal.widget.** { *; }
    -keep public class android.support.v7.internal.view.menu.** { *; }
    
    -keep public class * extends android.support.v4.view.ActionProvider {
        public <init>(android.content.Context);
    }
    #For com.github.barteksc:android-pdf-viewer:2.8.1
    -keep class com.shockwave.**
    #For butterknife
    -keep public class * implements butterknife.Unbinder { public <init>(**, android.view.View); }
    
    # Prevent obfuscation of types which use ButterKnife annotations since the simple name
    # is used to reflectively look up the generated ViewBinding.
    -keep class butterknife.*
    -keepclasseswithmembernames class * { @butterknife.* <methods>; }
    -keepclasseswithmembernames class * { @butterknife.* <fields>; }
    #For OneSignal
    -dontwarn com.onesignal.**
    
    # These 2 methods are called with reflection.
    -keep class com.google.android.gms.common.api.GoogleApiClient {
        void connect();
        void disconnect();
    }
    
    
    -keep class com.onesignal.ActivityLifecycleListenerCompat** {*;}
    
    
    # Observer backcall methods are called with reflection
    -keep class com.onesignal.OSSubscriptionState {
        void changed(com.onesignal.OSPermissionState);
    }
    
    -keep class com.onesignal.OSPermissionChangedInternalObserver {
        void changed(com.onesignal.OSPermissionState);
    }
    
    -keep class com.onesignal.OSSubscriptionChangedInternalObserver {
        void changed(com.onesignal.OSSubscriptionState);
    }
    
    -keep class ** implements com.onesignal.OSPermissionObserver {
        void onOSPermissionChanged(com.onesignal.OSPermissionStateChanges);
    }
    
    -keep class ** implements com.onesignal.OSSubscriptionObserver {
        void onOSSubscriptionChanged(com.onesignal.OSSubscriptionStateChanges);
    }
    
    -keep class com.onesignal.shortcutbadger.impl.AdwHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.ApexHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.AsusHomeLauncher { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.DefaultBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.EverythingMeHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.HuaweiHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.LGHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.NewHtcHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.NovaHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.OPPOHomeBader { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.SamsungHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.SonyHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.VivoHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.XiaomiHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.ZukHomeBadger { <init>(...); }
    
    
    -dontwarn com.amazon.**
    
    # Proguard ends up removing this class even if it is used in AndroidManifest.xml so force keeping it.
    -keep public class com.onesignal.ADMMessageHandler {*;}
    
    -keep class com.onesignal.JobIntentService$* {*;}
    
    -keep class com.onesignal.OneSignalUnityProxy {*;}
    
    #For iconify
    -keep class com.joanzapata.iconify.** { *; }
    ########--------Retrofit + RxJava--------#########
    -dontwarn retrofit2.Platform$Java8
    -dontwarn retrofit.**
    -keep class retrofit.** { *; }
    -dontwarn sun.misc.Unsafe
    -dontwarn com.octo.android.robospice.retrofit.RetrofitJackson**
    -dontwarn retrofit.appengine.UrlFetchClient
    -keepattributes Signature
    -keepattributes Exceptions
    -keepclasseswithmembers class * {
        @retrofit.http.* <methods>;
    }
    -keep class com.google.gson.** { *; }
    -keep class com.google.inject.** { *; }
    -keep class org.apache.http.** { *; }
    -keep class org.apache.james.mime4j.** { *; }
    -keep class javax.inject.** { *; }
    -keep class retrofit.** { *; }
    -dontwarn org.apache.http.**
    -dontwarn android.net.http.AndroidHttpClient
    -dontwarn retrofit.**
    
    -dontwarn sun.misc.**
    
    -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
       long producerIndex;
       long consumerIndex;
    }
    
    -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
       long producerNode;
       long consumerNode;
    }
    
    
    # ALSO REMEMBER KEEPING YOUR MODEL CLASSES
    -keep class com.your.package.model.** { *; }
    #For volley
    -keepclassmembers,allowshrinking,allowobfuscation class com.android.volley.NetworkDispatcher {
        void processRequest();
    }
    -keepclassmembers,allowshrinking,allowobfuscation class com.android.volley.CacheDispatcher {
        void processRequest();
    }
    #For piccaso and okHttp
    -dontwarn com.squareup.okhttp.**
    -dontwarn okhttp3.**
    -dontwarn okio.**
    -dontwarn javax.annotation.**
    -dontwarn org.conscrypt.**
    # A resource is loaded with a relative path so the package of this class must be preserved.
    -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
    
    ##---------------Begin: proguard configuration for Gson  ----------
    # Gson uses generic type information stored in a class file when working with fields. Proguard
    # removes such information by default, so configure it to keep all of it.
    -keepattributes Signature
    
    # For using GSON @Expose annotation
    -keepattributes *Annotation*
    
    # Gson specific classes
    -dontwarn sun.misc.**
    #-keep class com.google.gson.stream.** { *; }
    
    # Prevent proguard from stripping interface information from TypeAdapterFactory,
    # JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
    -keep class * implements com.google.gson.TypeAdapterFactory
    -keep class * implements com.google.gson.JsonSerializer
    -keep class * implements com.google.gson.JsonDeserializer
    #For glide
    -keep public class * implements com.bumptech.glide.module.GlideModule
    -keep public class * extends com.bumptech.glide.module.AppGlideModule
    -keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
      **[] $VALUES;
      public *;
    }
    
    # for DexGuard only
    #-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
    
    #For support-vector-drawable
    -keep class VectorPlay.** { *; }
    -keep interface VectorPlay.**
    -keep enum VectorPlay.**
    
    #For android.support:design
    -dontwarn android.support.design.**
    -keep class android.support.design.** { *; }
    -keep interface android.support.design.** { *; }
    -keep public class android.support.design.R$* { *; }
    
    #For cardview-v7
    -keep class android.support.v7.widget.RoundRectDrawable { *; }
    
    #For recyclerview-v7
    -keep public class * extends android.support.v7.widget.RecyclerView$LayoutManager {
        public <init>(...);
    }
    # For constraint
    -dontwarn android.support.constraint.**
    -keep class android.support.constraint.** { *; }
    -keep interface android.support.constraint.** { *; }
    -keep public class android.support.constraint.R$* { *; }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   terencey    6 年前

    在发布版本类型下,确保 shrinkResources 设置为true。 minifyEnabled 这还不够。

    你包括格莱德和毕加索。使用其中一个,而不是两个。

    你包括截击和改装。使用其中一个,而不是两个。

    android-pdf-viewer 是出了名的大。请参阅位于的解释和解决方法 https://github.com/barteksc/AndroidPdfViewer#why-resulting-apk-is-so-big 这是你的apk如此巨大的最大原因。

    proguard内部:

    # ALSO REMEMBER KEEPING YOUR MODEL CLASSES
    -keep class com.your.package.model.** { *; }
    

    不需要上述内容。

    谷歌的图书馆通常附带自己的嵌入式proguard规则;您可能不需要cardview的proguard规则、android支持设计库等。

    同时检查您的抽绳。尽可能使用xml可绘制文件,对不需要透明度的背景使用JPEG。也可以尝试webP格式。