我想将facebook sdk用于分析,是否有一个优化的proguard配置,我可以用它去除其余部分?
答案 0 :(得分:1)
当涉及到巨大的规模时,主要是关于资源而不是担心最小化java代码本身。所以你可以尝试下面提到的一些事情。
然而,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
我使用这两行并正常工作