这几天在网上寻寻觅觅终于成功将自己的项目打包成一个经过混淆加密的APK!!!
不容易啊~网上很多技能都是不适用的,不是版本不对就是路不通……不知道其他程序猿是怎么解决的,我先记录下我自己的方法啦~
PS: 本文参考了广大网友共享的部分技能。
参考自:http://blog.csdn.net/fhy_2008/article/details/7196451
http://lhq1013.iteye.com/blog/1198556
http://blog.csdn.net/tmj2014/article/details/34107861
我的eclipse环境是这样的:
项目版本是:
ok,开始!
△ 普及知识时间 △
① 首先,讲讲混淆器。 ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。这样做的结果是更小的jar、apk……,并且更难被反编译。
Android的编译环境中已默认集成了Proguard,但只有在release模式下编译才会运行。此状态下,它会在用到ant release或是Eclipse的导出向导时,自动检查proguard.config属性是否已设置,如果设置了,ProGuard就会在打成包之前,自动处理程序的字节码。Debug模式下,之所以不触发,是因为混淆后的代码会使得调试变得更加累赘。
② release 和debug 的 APK 的区别。
release 版APK 会比 debug 版要大一点,据说是因为release 时做了优化,(包括混淆器)。
(⊙o⊙)……原谅我菜鸟只看出这一点~~~更多的差异希望大家多多补充哈~
③ 关于如何生成 release 和 debug 的 APK。
平时 Eclipse 默认生成在 Bin 里的 APK 是 debug 版的,eclipse会自动给签名所以我们不需要做其他操作。
如果要生成 release 版,需要开发者先创建keystore (签名用),然后导出 APK。
△ 操作时间 △
步骤一. 配置Proguard
网上查到的都讲到proguard.cfg ,什么添加proguard.cfg什么修改proguard.cfg啊试了下都不行。原来真相是:自2.3版本后,新生成的项目中,没有proguard.cfg文件,只有proguard-project.txt 。
好吧。这样在新版本中我们只需要做这两步:
1、在proguard-project.txt 加入以往在proguard.cfg的混淆文件配置就好了。混淆文件配置很简单,在网上可以找到很多的。
像我引用了android.support.v4是这样写的
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment
-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
-keepclasseswithmember class * {
native <methods>;
}
-keepclasseswithmember class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmember class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
2、 在project.properties文件中,写入proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt。
(在2.3版本前,等同于,在project.properties文件中写入proguard.config=proguard.cfg。)
混淆器配置搞定!各种说法搞得我走了很多弯路啊魂淡。~~~~(>_<)~~~~
步骤二. 通过java自带的keytool工具,创建release版的keystore
Cmd 打开命令提示符(要以管理员身份运行,否则会无权限)输入:
1、 cd\ 回到跟目录;
2、 cd C:\Program Files\Java\jre1.8.0_31\bin 跳转到java安装目录bin文件夹(里面有keytool.exe文件);
3、 C:\Users\sunny.chen> keytool -genkey -v -keystore mykey.keystore -alias mykey -keyalg RSA -validity 5000 生成命名为 mykey 的key 。
tip:
-keystore:要创建的release版keystore的文件名(这里我起了名字“mykey”)
-alias:别名。(这里我起了名字“mykey”)
-keyalg:通过RSA算法生成
-validity:有效期,单位是天(这里我写了5000天的有效期)
如果java环境配置正常,输入命令后会出现下列信息(口令是不可见的,不管它只管输入就好了)
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: SunnyChan
您的组织单位名称是什么?
[Unknown]: FlowerKingdom
您的组织名称是什么?
[Unknown]: FlowerKingdom
您所在的城市或区域名称是什么?
[Unknown]: FlowerKingdom
您所在的省/市/自治区名称是什么?
[Unknown]: FlowerKingdom
该单位的双字母国家/地区代码是什么?
[Unknown]: FK
CN=SunnyChan, OU=FlowerKingdom,O=FlowerKingdom, L=FlowerKingdom, ST=FlowerKingd
om, C=FK是否正确?
[否]: y
正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 5,000
天):
CN=SunnyChan, OU=FlowerKingdom, O=FlowerKingdom, L=FlowerKingdom, ST=Fl
owerKingdom, C=FK
输入 <t> 的密钥口令
(如果和密钥库口令相同, 按回车):
[正在存储mykey.keystore]
这样就生成了一个keystore我的是放在了C:\Users\sunny.chen路径下。
步骤三. 创建release版的apk文件
导出 release 版的apk有下面三种方法:
1、右击工程-> Android Tools->Export signed android package生成签名的包;
2、右击工程-> Export ->Export Android Application;
3、ant release。(这种我没试过……)
然后就是step-by-step 了,选择刚才生成的release版keystore,输入密码,选择alias,输入alias密码,生成release版的apk。
PS:导出APK的时候可能会提示错误。一般这时候我是clean下项目再来一次就好了,或者删掉项目目录下的proguard 文件夹再来一次。
最后就是安装了。
由于使用了新的签名,必须先卸载原来安装的程序才可以安装。
好吧,先记录到这里。谢谢大家提出不同见解~