使用 Proguard 混淆 Cordova Android 应用程序似乎无济于事

Posted

技术标签:

【中文标题】使用 Proguard 混淆 Cordova Android 应用程序似乎无济于事【英文标题】:Obfuscating a Cordova Android app with Proguard appears to do nothing 【发布时间】:2019-05-16 21:40:42 【问题描述】:

我是第一次测试 Proguard 的混淆功能。为此,我做了以下操作

下载了 Cordova Hello World plugin 通过在它发出的问候消息中添加字符串" This is top secret"对其进行了修改 创建了一个简单的 Cordova Hello World 项目cordova create ... 添加了Cordova Proguard plugin 将本地来源的插件添加到该项目中 通过附加proguard.config=$sdk.dir/tools/proguard/proguard-android.txt:proguard-custom.txt 修改了platforms\android\project.properties 文件 自建apk cordova build --release

我几乎没有修改proguard-custom.txt 文件。其内容如下所示

-keepclassmembers class * @android.webkit.javascriptInterface <methods>;
#AddedThis 
-adaptresourcefilenames    **.json,**.gif,**.jpg 
-adaptresourcefilecontents **.json,META-INF/MANIFEST.MF

-keep class com.android.vending.licensing.ILicensingService
-keepattributes *Annotation*

-keepclassmembers enum * 
  public static **[] values();
  public static ** valueOf(java.lang.String);


-keepattributes InnerClasses
-keep class **.R
-keep class **.R$* <fields>;

-renamesourcefileattribute SourceFile    
-keepattributes SourceFile,LineNumberTable

-keep class org.apache.cordova.**  *; 
-keep public class * extends org.apache.cordova.CordovaPlugin

-keep class org.apache.cordova.CordovaBridge 
org.apache.cordova.PluginManager pluginManager; 
-keep class org.apache.cordova.CordovaInterfaceImpl 
org.apache.cordova.PluginManager pluginManager; 
-keep class org.apache.cordova.CordovaResourceApi
org.apache.cordova.PluginManager pluginManager; 
-keep class org.apache.cordova.CordovaWebViewImpl 
org.apache.cordova.PluginManager pluginManager; 
-keep class org.apache.cordova.ResumeCallback 
org.apache.cordova.PluginManager pluginManager; 
-keep class org.apache.cordova.engine.SystemWebViewEngine 
org.apache.cordova.PluginManager pluginManager; 

-keep class com.google.gson.internal.UnsafeAllocator  ** theUnsafe; 

-dontnote org.apache.harmony.xnet.provider.jsse.NativeCrypto
-dontnote sun.misc.Unsafe

-keep class com.worklight.androidgap.push.**  *; 
-keep class com.worklight.wlclient.push.**  *; 

-keep class com.google.**  *; 
-dontwarn com.google.common.**
-dontwarn com.google.ads.**

-optimizations 

!class/merging/vertical*,!class/merging/horizontal*,
!code/simplification/arithmetic,!field/*,!code/allocation/variable

-keep class net.sqlcipher.**  *; 
-dontwarn net.sqlcipher.**

-keep class org.codehaus.**  *; 
-keepattributes *Annotation*,EnclosingMethod

-keepclassmembers enum * 
 public static **[] values();
 public static ** valueOf(java.lang.String);


-assumenosideeffects class android.util.Log 
  public static *** d(...);


-dontwarn com.worklight.common.internal.WLTrusteerInternal*
-dontwarn com.worklight.jsonstore.**
-dontwarn org.codehaus.jackson.map.ext.*
-dontwarn com.worklight.androidgap.push.GCMIntentService
-dontwarn com.worklight.androidgap.plugin.WLInitializationPlugin

-dontwarn android.support.v4.**
-dontwarn android.net.SSLCertificateSocketFactory
-dontwarn android.net.http.*

Proguard 按预期完成所有动作。例如,我看到了

Obfuscating...
Printing mapping to 
[buildpath\outputs\mapping\release\mapping.txt]...
Preverifying...
Writing output...
Preparing output jar 
[buildpath\intermediates\transforms\proguard\release\0.jar]
Copying resources from program jar 
[buildpath\intermediates\transforms\desugar\release\0.jar] 
(filtered)
Copying resources from program directory 
[buildpath\intermediates\transforms\desugar\release\1] 
(filtered)
Copying resources from program jar 
[buildpath\intermediates\transforms\mergeJavaRes\release\0.jar] 
(filtered)

然后按预期生成 APK。我通过Java decompiler 运行了这个 APK 并下载了输出。浏览该下载中的Hello.java,我找到了完整的原始源代码

package com.example.plugin;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;

public class Hello extends CordovaPlugin 

 public boolean execute(String str,JSONArray jSONArray, 
 CallbackContext callbackContext) 
 
  if (!str.equals("greet")) return false;
  callbackContext.success("Hello, " + jSONArray.getString(0) + 
  " This is a secret!");
  return true;
 

就好像 Proguard 经历了所有的动作,但什么都没有。我显然错过了这里的一个关键步骤,但我不清楚那可能是什么。我将非常感谢任何能够让我走上正轨的人。

【问题讨论】:

ProGuard 不加密字符串常量 【参考方案1】:

proguard-custom.txt 文件中的这些行阻止 proguard 混淆该文件:

-keep class org.apache.cordova.**  *; 
-keep public class * extends org.apache.cordova.CordovaPlugin

如果您删除它们,您应该会看到文件被混淆了。但是,这可能会破坏您的应用程序,因为 Cordova 可能出于某种原因将它们包含在内(我对 Cordova 不是很熟悉)。

【讨论】:

以上是关于使用 Proguard 混淆 Cordova Android 应用程序似乎无济于事的主要内容,如果未能解决你的问题,请参考以下文章

Proguard 可以混淆 Android 库项目 (APKLIB) 吗?

Android 程序代码进行代码混淆

使用 Proguard 混淆 ActionBarSherlock

使用 ProGuard 进行文件混淆

防止 Proguard 使用注释混淆子类

使用 ProGuard 混淆私有字段