mPaaS Android 客户端开发的应用程序是通过 Java 代码编写而成,而 Java 代码易被反编码,因此为了保护 Java 源代码,需要使用 ProGuard 混淆 Android 文件。
ProGuard 是一个压缩、优化和混淆 Java 字节码文件的工具。
压缩 指检测以及删除没有用到的类、字段、方法以及属性。
优化 指分析以及优化方法的字节码。
混淆 指使用无意义的短变量,对类、变量、方法进行重命名。
使用 ProGuard 可以让代码更精简,更高效,也更难被逆向或破解。
前置条件
您已经配置 mPaaS 工程。
关于此任务
采用组件化方案的 mPaaS 工程,每一个 bundle 的编译产物都是一个已经混淆的 dex
文件,所以配置混淆文件是以 bundle 工程为单位而进行的。Portal 工程通常没有代码,不需要开启混淆。
代码示例
Gradle 配置
android { compileSdkVersion 23 buildToolsVersion "19.1.0" defaultConfig { applicationId "com.youedata.xionganmaster.launcher" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { // 混淆开关,是否混淆 minifyEnabled true // 混淆文件列表,混淆规则配置 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } lintOptions { checkReleaseBuilds false // Or, if you prefer, you can continue to check for errors in release builds, // but continue the build even when errors are found: abortOnError false } }
混淆文件示例
下列混淆是一个基本示例(如果要添加额外的第三方库,需要加入其它混淆,通常配置文件可在第三方库的官网中找到):
# Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in ${sdk.dir}/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the proguardFiles # directive in build.gradle. # For more details, see [Shrink your code and resources](http://developer.android.com/guide/developing/tools/proguard.html)。 # Add any project specific keep options here: # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: # -keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; # } -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -ignorewarnings -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class com.android.vending.licensing.ILicensingService -keep public class com.alipay.mobile.phonecashier.* -keepnames public class * -keepattributes SourceFile,LineNumberTable -keepattributes *Annotation* #-keep public class * extends com.alipay.mobile.framework.LauncherApplicationAgent { # *; #} #-keep public class * extends com.alipay.mobile.framework.LauncherActivityAgent { # *; #} -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * extends java.lang.annotation.Annotation { *; } -keep interface * extends java.lang.annotation.Annotation { *; } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keep public class * extends android.view.View{ !private <fields>; !private <methods>; } -keep class android.util.**{ public <fields>; public <methods>; } -keep public class com.squareup.javapoet.**{ !private <fields>; !private <methods>; } -keep public class javax.annotation.**{ !private <fields>; !private <methods>; } -keep public class javax.inject.**{ !private <fields>; !private <methods>; } -keep interface **{ !private <fields>; !private <methods>; } # for dagger -keep class * extends dagger.internal.Binding -keep class * extends dagger.internal.ModuleAdapter -keep class **$$ModuleAdapter -keep class **$$InjectAdapter -keep class **$$StaticInjection -keep class dagger.** { *; } -keep class javax.inject.**{ *; } -keep class * extends dagger.internal.Binding -keep class * extends dagger.internal.ModuleAdapter -keep class * extends dagger.internal.StaticInjection # for butterknife -keep class butterknife.* { *; } -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; }
说明如果在您的 bundle 工程中定义了框架类
LauncherApplicationAgent
和LauncherActivityAgent
,请注意进行防混淆设置避免混淆通用组件
如果在
metainfo.xml
中注册了通用组件,编译时会检查这些组件是否存在,请避免这些组件被混淆,否则会编译失败。例如注册了以下组件:<metainfo> <service> <className>com.mpaas.cq.bundleb.MyServiceImpl</className> <interfaceName>com.mpaas.cq.bundleb.api.MyService</interfaceName> <isLazy>true</isLazy> </service> </metainfo>
请在混淆配置中添加:
-keep class com.mpaas.cq.bundleb.MyServiceImpl -keep class com.mpaas.cq.bundleb.api.MyService
文档内容是否对您有帮助?