用于facebook sdk的Proguard配置。剥离除分析之外的所有内容

时间:2017-07-17 08:16:29

标签: android facebook proguard

我想将facebook sdk用于分析,是否有一个优化的proguard配置,我可以用它去除其余部分?

4 个答案:

答案 0 :(得分:1)

当涉及到巨大的规模时,主要是关于资源而不是担心最小化java代码本身。所以你可以尝试下面提到的一些事情。

  1. Proguard使用Java代码。不幸的是,它不适用于资源文件夹。因此,如果不使用res / drawable中的图像my_image,Proguard只会在R类中删除它的引用,但会保留相关图像。
  2. Lint是一个静态代码分析器,可以通过简单调用./gradlew lint帮助您检测所有未使用的资源。它会生成一个HTML报告,并为您提供“UnusedResources:Unused resources”部分下未使用的资源的详尽列表。只要您不通过代码中的反射访问这些资源,就可以安全地删除这些资源。
  3. 然而,Lint可以告诉你未使用的资源在哪里,但是使用fb sdk将很难删除资源,因为它来自maven存储库。

    最小化资源配置(build.gradle) 例如,Fb sdk支持您可能不需要的所有语言,或者所有像mdpi这样的文件夹图片,这些图片可能对您没用。

    defaultConfig {
        resConfigs "en", "de", "fr", "it"
        resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
    }
    

    如果所有这些都不起作用,则意味着本机代码膨胀你的apk,其中应用程序二进制接口拆分可能有助于减少你的apk大小。

    ABI Split: -

     splits {
            density {
                enable true
                reset()
                include "ldpi", "mdpi"
            }
            abi {
    
                // Enables building multiple APKs per ABI.
                enable true
    
                // By default all ABIs are included, so use reset() and include to specify that we only
                // want APKs for x86, armeabi-v7a, and mips.
    
                // Resets the list of ABIs that Gradle should create APKs for to none.
                reset()
    
                // Specifies a list of ABIs that Gradle should create APKs for.
                include "x86", "armeabi-v7a", "mips"
    
                // Specifies that we do not want to also generate a universal APK that includes all ABIs.
                universalApk false
            }
        }
    

    我认为可以在这里完成一些事情,因为我打开了facebook sdk gradle文件...它几乎没有传递依赖,这是多余的,可能与您的支持版本冲突,因此您可以在文件中导入相同的文件

    dependencies {
        // Facebook Dependencies
        compile 'com.android.support:support-v4:25.3.1'
        compile 'com.android.support:appcompat-v7:25.3.1'
        compile 'com.android.support:cardview-v7:25.3.1'
        compile 'com.android.support:customtabs:25.3.1'}
    

    它可以从最终的胖jar中删除,因为您可能已经在项目中使用了太多不同或相互冲突的支持依赖项。所以您可以理想地根据您的需求排除传递依赖项,如下所示

    compile ('com.facebook.android:facebook-android-sdk:4.+') {
            exclude group: 'com.android.support' //by group
        }
    

答案 1 :(得分:0)

我的问题是错的,没有办法剥离proguard中的代码,可能可以在gradle中使用排除项进行,但我认为只使用proguard是不可行的

在任何情况下,facebook终于将他们的sdk模块化了,所以对于像我这样只对分析感兴趣的人来说,facebook-core是我们需要导入的唯一依赖

答案 2 :(得分:-1)

ProGuard config included in the Facebook SDK已更新,因此它会正确删除您的应用未使用的所有类(例如,不在Google Analytics中的所有内容)。

...除了Facebook认为删除不安全的任何Serializable之外......

现在看起来很像这里的旧答案:

-keepclassmembers class * implements java.io.Serializable {
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

(截至20 May 2016

这意味着我们不再需要我们自己的Facebook的ProGuard设置了。 Gradle将自动使用SDK提供的规则。

当然,这仍然要求您的build.gradle配置为运行ProGuard:

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

答案 3 :(得分:-1)

-keep class com.facebook.** {
 *;
} 
-keepattributes Signature

我使用这两行并正常工作