在启用了Proguard和一些特定规则的情况下,使用Android Studio 3.2中的Android项目进行工作,我无法确定以下内容:
客户端代码使用的库模块中的特定程序包(及其子程序包)通过以下规则保留:
-keep public class com.mylib.mypackage.** {
public protected *;
}
现在,在此软件包中,还有许多软件包专用类,该类不应选择这些类。这些类中有一些被有效地混淆了,无论是它们自己的名称还是其成员名称,这都很好。
相反,有些类实现了公共接口,它们的类名没有被混淆,而我希望它们可以。为了完整起见,它们的成员名称(如果不是接口的一部分)将被有效地混淆。
示例:
/* package */ class InternalComponent implements ExternalInterface {
// ExternalInterface is kept: Ok
// InternalComponent is kept: don't like, I'd like it renamed
@Override
public void ExternalMethod() {
// this is kept: Ok
}
public void InternalMethod() {
// this is renamed: Ok
}
}
我想强调一点,InternalComponent
是在其他(保留的)类中创建的,并且仅通过ExternalInterface
返回到客户端代码。
如果可能的话,我还如何混淆它们的类名?
编辑#1
在对Proguard输出文件进行@emandt回答后,我仔细检查了com.mylib.mypackage.InternalComponent
并列在seeds.txt
中,internal
根据this blog post列出了与keep规则匹配的所有项目。因此,出于某种原因,上面的规则也选择了包私有类,这对我来说仍然是错误的。
编辑#2
同时,我最终采用了@shizhen提出的完全相同的方法。为了完整起见,为了将排除范围扩展到名为-keep public class !com.mylib.mypackage.**.internal.*, com.mylib.mypackage.** {
public protected *;
}
的 any 包,我将proguard规则修改为:
!
(请注意逗号前面的第一部分,以<VirtualHost *:443>
ServerName mobile.betyetu.co.mz
DocumentRoot "/var/www/betyetu"
ErrorLog "logs/betyetu-error_log"
TransferLog "logs/betyetu-access_log"
#
# SSL defintions
#
# SSLEngine on
# SSLCertificateFile "/etc/ssl/certs/server.crt"
# SSLCertificateKeyFile "/etc/ssl/certs/server.key"
#
# define an external output filter for translation of English to Portuguese
#
ExtFilterDefine filtEN2PT mode=output intype=text/html outtype=text/html cmd="
/var/www/betyetu/notAlice.sh"
AddOutputFilter filtEN2PT html
#
# Enable Reverse Proxy
#
ProxyPass "/" "http://www.alice-in-wonderland.net/"
ProxyPassReverse "/" "http://www.alice-in-wonderland.net/"
</VirtualHost>
为前缀)
我会标出@shizhen的答案,尽管我想知道为什么原来的规则也选择了包私有的组件。
答案 0 :(得分:0)
在“ / build / outputs / mapping / release /”文件夹中,只有很少的文件(“ usage.txt”,“ seeds.txt”等)包含原因以及哪些类/变量/方法的原因/ etc ..未通过ProGuard实用程序进行处理/未缩小/无法混淆。
答案 1 :(得分:0)
您正在从事 Android库项目吗?可能是。
为了实现您的目的,恐怕您需要将软件包重新组织为如下所示:
公共界面
com.my.package.apiforusers
私有/内部实现
com.my.package.apiforusers.internal
然后根据混淆规则,如下所示:
-keep public class com.my.package.apiforusers.* { public *; }
这样,将仅保留在公共类/接口中,并且com.my.package.apiforusers.internal
中所有那些公共类/接口都将被混淆。