facebook sdk 的 Proguard 配置。剥离除分析之外的所有内容
Proguard config for facebook sdk. Strip everything except analytics
我只想使用 facebook sdk 进行分析,是否有优化的 proguard 配置可用于去除其余部分?
ProGuard config included in the Facebook SDK 已更新,因此它将正确删除您的应用未使用的所有 类(例如,不在 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'
当涉及到巨大的规模时,它主要是关于资源而不是担心最小化 java 代码本身。所以你实际上可以尝试下面提到的一些事情。
- Proguard 适用于 Java 代码。不幸的是,它不适用于资源文件夹。因此,如果未使用 res/drawable 中的图像 my_image,Proguard 只会在 R class 中删除它的引用,但会保留相关图像。
- Lint 是一个静态代码分析器,可帮助您通过简单调用 ./gradlew lint 来检测所有未使用的资源。它会生成一个 HTML 报告,并在“UnusedResources:未使用的资源”部分为您提供看起来未使用的资源的详尽列表。只要您不通过代码中的反射访问这些资源,就可以安全地删除它们。
但是 Lint 可以告诉您未使用的资源在哪里,但是使用 fb sdk 很难删除资源,因为它来自 maven 存储库。
最小化资源配置(build.gradle)
例如,Fb sdk 提供了对您可能不需要的所有语言的支持,或者对您可能没有用的所有文件夹图像(如 mdpi)。
defaultConfig {
resConfigs "en", "de", "fr", "it"
resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
}
如果所有这些都不起作用,则意味着本机代码使您的 apk 膨胀,其中应用程序二进制接口拆分可能有助于减小您的 apk 大小。
ABI 拆分:-
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'}
它可以从最终的 fat jar 中删除,因为你可能已经在你的项目中使用了太多不同或冲突的支持依赖项..所以你可以理想地根据你的要求排除传递依赖项,如下所示
compile ('com.facebook.android:facebook-android-sdk:4.+') {
exclude group: 'com.android.support' //by group
}
-keep class com.facebook.** {
*;
}
-keepattributes Signature
我使用这两行并且一切正常
我的问题是错误的,没有办法去除 proguard 中的代码,可能可以在 gradle 中使用排除来完成,但我认为仅使用 proguard
是行不通的]
无论如何,facebook 终于模块化了他们的 sdk,所以对于像我这样只对分析感兴趣的人来说,facebook-core 是我们唯一需要导入的依赖项
我只想使用 facebook sdk 进行分析,是否有优化的 proguard 配置可用于去除其余部分?
ProGuard config included in the Facebook SDK 已更新,因此它将正确删除您的应用未使用的所有 类(例如,不在 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'
当涉及到巨大的规模时,它主要是关于资源而不是担心最小化 java 代码本身。所以你实际上可以尝试下面提到的一些事情。
- Proguard 适用于 Java 代码。不幸的是,它不适用于资源文件夹。因此,如果未使用 res/drawable 中的图像 my_image,Proguard 只会在 R class 中删除它的引用,但会保留相关图像。
- Lint 是一个静态代码分析器,可帮助您通过简单调用 ./gradlew lint 来检测所有未使用的资源。它会生成一个 HTML 报告,并在“UnusedResources:未使用的资源”部分为您提供看起来未使用的资源的详尽列表。只要您不通过代码中的反射访问这些资源,就可以安全地删除它们。
但是 Lint 可以告诉您未使用的资源在哪里,但是使用 fb sdk 很难删除资源,因为它来自 maven 存储库。
最小化资源配置(build.gradle) 例如,Fb sdk 提供了对您可能不需要的所有语言的支持,或者对您可能没有用的所有文件夹图像(如 mdpi)。
defaultConfig {
resConfigs "en", "de", "fr", "it"
resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
}
如果所有这些都不起作用,则意味着本机代码使您的 apk 膨胀,其中应用程序二进制接口拆分可能有助于减小您的 apk 大小。
ABI 拆分:-
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'}
它可以从最终的 fat jar 中删除,因为你可能已经在你的项目中使用了太多不同或冲突的支持依赖项..所以你可以理想地根据你的要求排除传递依赖项,如下所示
compile ('com.facebook.android:facebook-android-sdk:4.+') {
exclude group: 'com.android.support' //by group
}
-keep class com.facebook.** {
*;
}
-keepattributes Signature
我使用这两行并且一切正常
我的问题是错误的,没有办法去除 proguard 中的代码,可能可以在 gradle 中使用排除来完成,但我认为仅使用 proguard
是行不通的]无论如何,facebook 终于模块化了他们的 sdk,所以对于像我这样只对分析感兴趣的人来说,facebook-core 是我们唯一需要导入的依赖项