您的位置:首页 > 移动开发 > Android开发

[Android初级]关于Android使用Proguard混淆打包的那些事

2014-04-03 14:30 393 查看
我在业余时间想看看android是如何混淆打包的,现在的android SDK都是带有Proguard工具的,这个工具的作用个人感觉其实就是为了时别人反编译你的apk文件后,无法轻松的阅读你的代码而使用的障眼法,功能有限,但是总比没有的好,哈哈。

现在开始正题吧。

(1)在Eclipse开发的项目下,会自动生成一个project.properties文件,里面的内容加上这么一句:

proguard.config=proguard.cfg这个proguard.cfg文件是在sdk2.3之前的版本中会自带的,2.3以后就是叫proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
这个其实是差不多的,不要在意,内容和性质一致。

(2)在相同的路径下修改(或者创建)这个配置文件proguard.cfg,大概可以写成如下形式:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-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 * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
native <methods>;
}

-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}

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

-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}

-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}

-libraryjars libs/android-support-v4.jar
-dontwarn android.support.**


以上的很多命令都来自我们的Proguard工具,大概有以下的意思,先大概了解一下:

-injars  androidtest.jar【jar包所在地址】

-outjars  out【输出地址】

-libraryjars    'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的库的jar,用于解析injars所指定的jar类】

-optimizationpasses 5

-dontusemixedcaseclassnames 【混淆时不会产生形形色色的类名 】

-dontskipnonpubliclibraryclasses 【指定不去忽略非公共的库类。 】

-dontpreverify 【不预校验】

-verbose

-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 * extends android.app.backup.BackupAgentHelper

-keep public class * extends android.preference.Preference

-keep public class com.android.vending.licensing.ILicensingService

-keep public abstract interface com.asqw.android.Listener{

public protected <methods>;  【所有方法不进行混淆】

}

-keep public class com.asqw.android{

public void Start(java.lang.String); 【对该方法不进行混淆】

}

-keepclasseswithmembernames class * { 【保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)】

native <methods>;

}

-keepclasseswithmembers class * { 【保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。】

public <init>(android.content.Context, android.util.AttributeSet);

}

-keepclasseswithmembers class * {

public <init>(android.content.Context, android.util.AttributeSet, int);

}

-keepclassmembers class * extends android.app.Activity {【保护指定类的成员,如果此类受到保护他们会保护的更好 】

public void *(android.view.View);

}

-keepclassmembers enum * {

public static **[] values();

public static ** valueOf(java.lang.String);

}

-keep class * implements android.os.Parcelable {【保护指定的类文件和类的成员】

public static final android.os.Parcelable$Creator *;

}
===================================这是分割线==========================================
(3)现在有个问题,如果项目中存在第三方jar文件,如果被混淆的话,肯定是会出问题,可能在生成apk文件时报错,或者是无法安装和运行程序等等奇怪的错误。

通常上的方法,第三方jar文件,你可以在proguard.cfg文件中如下类似的配置:

-libraryjars /libs/nineoldandroids-2.4.0.jar
-dontwarn com.nineoldandroids.**
-keep class com.nineoldandroids.** { *;}

特使的,如果存在谷歌的gson包,要这样写:
-ibraryjars libs/gson-2.2.2.jar
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.* { ; }
-keep class com.google.gson.examples.android.model.* { ; }
-keep class com.google.gson.* { *;}

如果你还有依赖项目
android.library.reference.1=../projectNamex1跟第三方jar的处理很相似,在配置文件中增加
-libraryjars ../projectNamex1
-dontwarn com.projectNamex1.**
-keep class com.projectNamex1.** { *;}

以上可总结,用以下的方式处理第三方的jar.

-libraryjars ..\第三方库的工程名--------引入的第三方库

-dontwarn  包名.**  --------告诉ProGuard不要警告找不到包名.**这个包里面的类的相关引用

-keep class 包名.** { *;}      --------对这个包里面的所有类和所有方法不进行混淆


接下来,你可用用eclipse的android tools 打包了。

。。。。。。

。。。。

。。。

。。



经测试,使用proguard混淆后,我再反编译看源代码就有点难懂了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android proguard