一、apk签名(必须)
1.apk签名(数字签名)
apk签名:开发者(开发商)通过数字证书(也可以叫签名文件),给apk应用打上带有个人(公司)信息的标记,以表示自己是该应用的开发者或拥有者。签名后的apk解压后能看到META-INF文件夹,并且里面会有3个签名相关的文件(MANIFEST.MF,CERT.SF,CERT.RSA)
数字签名: 哈希算法(sha1, md5) + 私钥加密
查看apk的拥有者
keytool -printcert -file CERT.RSA
关于Android数字签名相关事项:
所有的应用都必须进行签名,android系统不会安装没有签名的应用;
使用不同数字证书签名的两个apk,无法实现覆盖安装。所以,应用在版本升级打包时必须使用同一个数字证书(keystore文件)进行签名; 这一点,也保证了用户手机上已安装的应用,不会被原作者外的第三者开发的假冒应用安装替换,因为第三者不可能持有原作者的数字证书(签名文件)
应用上线需要release签名(或者叫正式签名:指使用个人或公司的签名文件签名),不能用debug签名(开发调试签名:指使用sdk自带的签名文件签名)
数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常使用,一般开启99年就好了
apk签名可以使用自签名的数字证书(自己创建的keystore签名文件),不需要使用CA机构认证的数字证书(需要给CA机构付费);
2.生成签名文件的两种方式
通过IDE(AndroidStudio, Eclipse)生成
通过命令行keytool命令生成
keytool -genkeypair -validity [签名文件的有效期,单位为天] -keystore [keystore签名文件(数字证书)] -storepass [store密码] -alias [密钥对的别名] -keypass [密钥密码]
列表出所有的密钥对:
keytool -list -v -keystore itheima.keystore
参考: https://www.chinassl.net/?f=faq&a=view&r=457
3.AndroidStudio中导出正式签名包
android {
// 定义签名用到的数字证书
signingConfigs {
config {
keyAlias 'itheima'
keyPassword '123456'
storeFile file('E:/_GZ05/_code/01.ProGuardDemo_AS/itheima.jks')
storePassword '123456'
}
}
...
buildTypes {
// debug签名, 直接运行使用
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
// 打正式包
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config // 使用上面配置的签名文件进行签名
}
}
}
二、Android代码混淆(非必须)
1. 混淆简介
Android代码混淆是一种应用源代码保护技术,用来防止别人对apk进行逆向分析;
从Android2.3开始,Google在SDK中加入了一个叫ProGuard的工具,使用它来进行代码混淆。
proguard是一个压缩、优化和混淆java字节码文件的免费工具,其作用:
删除代码中的注释;
删除代码中没有用到的类、字段、方法和属性;
会把代码中的包名、类名、方法名变量名等修改为abcd...这种没有意义的名字,使得反编译出来的代码难以阅读,从而达到防止apk被破解和逆向分析的目的;
经过ProGuard混淆后apk安装包会变小
2. 如何使用Proguard进行代码混淆?
buildTypes {
release {
// 修改此参数为true,表示要进行混淆
minifyEnabled true
// 表示要使用sdk中的proguard-android.txt和当前项目中的proguard-rules.pro指定混淆规则
// 通常只需修改后者就可以了
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
// 指定jdk为1.7
compileOptions {
targetCompatibility 1.7
sourceCompatibility 1.7
}
}
在app下的proguard-rules.pro文件中配置混淆规则
打开gradle窗口,双击如下操作菜单项(assembleRelease: 打正式的发布包,installRelease: 安装正式的发布包), 生成出来的apk就是经过混淆的
3. 混淆规则配置[重点]
【注意】:有些java类是不能进行混淆,需要配置混淆规则。
1.所有的第三方包jar/库, 都不进行混淆。 对于每一个第三方的jar或库都需要配置如下两行,其中#号为注释,
#com.umeng.analytics:是要配置的第三方库的包名,配置成包名前缀com.umeng也可以
-dontwarn com.umeng.analytics.** # 不要提示警告
-keep class com.umeng.analytics.** { *; } # 对指定的类不进行混淆
2.注意:如果你使用的proguard的版本比较低, 对于每一个jar或第三方依赖, 还需要配置如下一行,不加可能会出现“类1 can't find referenced class 类2”这样的错。
-libraryjars libs/umeng-analytics-v5.6.1.jar
只要用到反射的类都不能进行混淆
3.如果使用了Gson解析json字符串,如果需要