如何仅对单个String字符串或整个Activity进行代码混淆
Android单String字符串混淆解决方案
方案1:手动异或加解密(最推荐,针对性最强无额外依赖)
这个方案可以实现100%仅对目标字符串做加密处理,完全不影响其他代码逻辑,反编译后看不到明文链接:
- 预先对目标字符串做加密处理
你可以本地先运行一次如下代码,得到加密后的字节数组:
// 本地运行一次拿到加密数组就可以删掉这段 String originUrl = "https://example.com/app_update/userdata.json"; byte key = (byte) 0x2F; // 自定义任意密钥 byte[] encrypted = originUrl.getBytes(); for (int i = 0; i < encrypted.length; i++) { encrypted[i] ^= key; } // 打印encrypted数组内容,复制下来备用
- 替换项目中原有的字符串声明
package x.y.z public class MainActivity extends AppCompatActivity { // 私有解密方法,仅当前类可用 private String getRealUrl(byte[] encrypted, byte key) { byte[] decrypted = new byte[encrypted.length]; for (int i = 0; i < encrypted.length; i++) { decrypted[i] = (byte) (encrypted[i] ^ key); } return new String(decrypted); } @Override protected Void doInBackground(Void... arg0) { // 这里填入你之前生成的加密字节数组 byte[] encryptedUrl = new byte[]{104, 116, 119, 57, 48, /* 剩余省略,替换成你自己的数组内容 */}; String url = getRealUrl(encryptedUrl, (byte) 0x2F); // 原有后续逻辑不变 . . . } }
- 可选优化:你也可以把解密逻辑直接写在doInBackground方法内部,不需要单独抽方法,隐蔽性更强。
方案2:字符串混淆插件定向配置
如果你不想手动写加解密逻辑,可以用Android常用的字符串混淆插件,在插件配置规则里排除所有其他类,仅将x.y.z.MainActivity纳入字符串混淆范围,即可实现仅混淆该类内部的字符串,如果你该类内只有这一个敏感字符串,刚好符合需求。
验证方式
打包Release混淆包后,用jadx等反编译工具打开apk,搜索原明文链接,如果搜索不到即代表混淆生效。
内容的提问来源于stack exchange,提问作者Shivendra Kr. Sahu
相关产品推荐
相关产品推荐

