Android 如何使用 Proguard 将我的所有类放在一个包中

Posted

技术标签:

【中文标题】Android 如何使用 Proguard 将我的所有类放在一个包中【英文标题】:Android how to place all my classes in one package using Proguard 【发布时间】:2016-01-13 12:45:23 【问题描述】:

我正在开发 SDK,我的环境有 SDK 库和一个使用它的测试项目。

我想保护我的库代码不受我的库用户的影响,因为我需要对其进行混淆,但只是它。

所以在我的库模块的 android Studio 中,我在 proguard-rules.pro 文件中添加了下一个脚本:

-dontpreverify
-optimizations !code/simplification/arithmetic

-keep class !com.example.** *; 
-keep public class com.example.sdk.Example*;
-keep public class com.example.sdk.IExampleCallback*;
-keep public class com.example.sdk.ui.ExampleActivity

-dontwarn android.util.Log

-repackageclasses 'com.example.security'
-allowaccessmodification

这些类被混淆了,但它们的包没有改变。我放弃了Eric Lafortune(Proguard 的作者)建议添加allowaccessmodification,但没有帮助。我也尝试使用flattenpackagehierarchy,但没有效果。

帮帮我,如何将我的所有课程放在一个包中?

【问题讨论】:

allowaccessmodification 解决了我的问题,谢谢 【参考方案1】:

解决了:添加这些行后,它就完成了工作

-useuniqueclassmembernames
-keeppackagenames doNotKeepAThing

这是我的完整脚本

-optimizationpasses 30
-mergeinterfacesaggressively
-dontpreverify
-optimizations !code/simplification/arithmetic

-repackageclasses 'com.example'
-allowaccessmodification
-useuniqueclassmembernames
-keeppackagenames doNotKeepAThing

-keep class !com.example.** *; 
-keep public class com.sdk.example
    *;

-keep public class com.sdk.IExampleCallback
    *;

-keepclasseswithmembernames public class com.sdk.ui.activity.ExampleActivity
    public <methods>;
    protected <methods>;

-keepclasseswithmembernames public class com.example.sdk.ExampleReciever
    public <methods>;


-assumenosideeffects class android.util.Log 
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);

【讨论】:

这真的很有帮助。谢谢。 30 次优化传递?我觉得5个就够了 @Inkognito from proguard manual: 如果优化通过后没有发现改进,则优化结束

以上是关于Android 如何使用 Proguard 将我的所有类放在一个包中的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio - Proguard“保留”规则被忽略?

如何在 android 中使用 ProGuard 和 OrmLite

如何使用 Eclipse + Proguard“运行”导出的 Android 应用程序?

评估指令时出现 Proguard 错误

使用 Android 库项目设置 ProGuard

如何在我的 Android 库 (AAR) 中包含 proguard 配置