ndroid程序基本上都是java语言很容易被反编译,这里呢google在android2.3的时候就加入了ProGuard代码混淆工具。
这里呢,要分两部分说。一部分是2.3时代,一部分是4.0时代,他们的混淆是不一样的,但也大同小异。
先说2.3时代:在自动生成项目时sdk会自动生成两个文件,一个是proguard.cfg 一个是project.properties ,他们就是反编译用的关键。
首先,在project.properties 中加入一行代码 proguard.config = proguard.cfg 这样proguard的配合就指向了proguard.cfg这个文件。 如果不加这句就不会进行混淆编译
之后进入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 *;
}
这里也可以根据你的需求增加命令行 具体请自行查阅文档或百度
这个就是进行反编译的配置语句了。此时再生成的APK程序反编译后就是混淆后的代码了。
注意:当有第三方jar包引入时,可能需要在proguard.cfg中添加 -dontwarn 指令。
例子1:ADT2.0后SDK自动生成项目会自动添加一个叫 android-support-v4.jar的jar包 这时进行反编译会报错,说
Proguard returned with error code 1. 云云。这就是找不到这个jar包的原因。
这时加入 -dontwarn android.support.v4.** 这句就OK了
例子2:这是关于百度地图api的,引入百度地图的jar包baidumapapi_v2_1_1.jar。也是出现和上面差不多的错误都是
Proguard returned with error code 1. 云云。这就是找不到这个jar包的原因。
这时加入 -dontwarn com.baidu.** 就OK了
细心的读者应该发现了混淆指令都是多个单词的合写,例如:
-keepclassmembers 是keep class member ,-dontwarn 是don't warn
关于第三方jar包的指令就很好了解了 -dontwarn (jar包的主题目录).**(全匹配) 所以刚才的指令就是 com.baidu下所有类的匹配共同混淆 这样反编译出来连里面百度api的内容也是混淆的。
下面来说说android4.0的混淆编译
这个时候项目自动生成的两个文件分别是 project.properties 和 proguard-project.txt
在project.properties中能看到以下代码
这些#都是用来注释的
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt ←就这行去掉#
# Project target.
target=android-17
只要去掉倒数第三行的#就可以了,将这句proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 释放出来 这也是个指向性语句将配置指向proguard-project.txt
进入proguard-project.txt看到以下代码:
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# 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 ProGuard
# include property in project.properties.
#
# For more details, see
# 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 *; ←反注释 将语句释放出来
#} ←反注释 将语句释放出来
最后3行都是混淆指令 亦可以根据需求添加混淆指令
这里暂时没发现对第三方jar包的不支持 如果读者发现了请留言,或者发现了错误请大神指正。