2.4 使用加固工具

除了对脚本、图片等资源进行加密之外,还可以使用360加固保、腾讯乐固等第三方工具对生成的安卓安装包进行加固,可以提高应用的安全性,在一定程度上防止应用被破解。

❑ 360加固保http://jiagu.360.cn/

❑ 腾讯乐固http://legu.qcloud.com/

这两款加固产品比较类似,这里就简单介绍一下360加固保的使用。使用360加固保能有效防止应用被破解、反编译、二次打包、恶意篡改,保护应用数据信息不会被黑客窃取,而且操作简单快捷,既不增加包体的体积,也不影响程序的性能。可以直接在加固保的网站上传应用进行加固,也可以下载加固助手对应用进行加固

2.4.1 360加固保加固步骤

在网站上选择要加固的已签名应用,然后上传到360加固保的网站。如果是使用加固助手,则可以设置签名和密码,直接进行加固,如图2-8所示,填上keystore的路径和密码以及别名密码(一般和keystore密码一致),然后单击左下角的“添加”按钮即可。

360加固保为开发者提供加固基础服务和可选增强服务,开发者根据使用需求选择增强服务,选好后,再选择上传的apk签名为正式签名还是测试签名,完成后,单击“开始加固”按钮进行加固。

如果使用加固助手,则可以在“加固选项”选项卡中根据使用需求选择增强服务,如图2-9所示,选好后将apk直接拖入或单击加固应用并选择要加固的apk,加固助手会自动加固。

图2-8 360加固保设置签名和密码

下载应用后,需要对该apk进行再次签名,且保证与加固前的签名一致,否则加固后的应用无法在手机上运行。如果是使用加固助手,加固完之后会弹出加固成功的对话框,在对话框中可以打开加固后apk的存放目录,可以直接使用加固后的apk,如图2-10所示。

如果使用了增强服务,包体大概会增加几百KB,加固之后再解压我们的apk,可以发现AndroidManifest.xml文件已经无法用文本格式阅读了,但图片等资源并没有被加密

2.4.2 Android应用签名

360加固保和乐固对安卓应用进行加固时,都需要我们提供签名后的apk,只有经过签名的apk才可以在手机或模拟器上安装,由于我们打出的调试apk包会自动进行debug签名,所以没有对apk进行签名也可以在手机或模拟器上安装。这里说的签名与前面介绍的数字签名是一个意思。那么为什么要对apk进行签名呢?这是为了区别apk的合法开发者,因为Android可以通过应用的包名和签名来区分应用,如果腾讯的QQ手机应用直接使用了调试签名,那么只需要做一个包名相同的QQ给用户安装,就可以覆盖正版的QQ软件,所以通过签名就可以区分出这是谁开发的应用。我们应该使用同一个证书对开发的多个apk进行签名,这样可以带来很多好处。

图2-9 360加固保的加固选项

图2-10 360加固助手的加固列表

❑ App升级时,使用相同签名的升级软件可以正常覆盖老版本的软件,签名不一致是无法覆盖安装的,这也是最关键的一点。

❑ 可以实现App模块化,Android系统允许具有相同签名的App运行在同一个进程中,就像是一个App一样,但是可以单独对其中的某个App升级更新。

❑ 可以在App之间共享代码和数据,Android中提供了一个基于签名的Permission标签。设置该标签可以实现对不同App之间的访问和共享,Google并不建议使用这个标签。

❑ 可以使用ADK自带的zipalign工具对apk文件进行字节对齐优化,可以提升App的性能,但会略微增加包体的大小。

如何为我们的应用签名呢?首先需要生成一个证书,使用Java自带的keytool工具即可生成证书(位于Java的bin目录下),将keytool工具所在的目录配置到环境变量中,或直接进入该目录,执行keytool -genkey -alias test -keystore test.keystore -keyalg RSA -validity 100000命令可以生成证书:

❑ -genkey参数表示生成证书。

❑ -alias参数表示证书的别名(使用证书时需要用到)。

❑ -keystore参数表示证书存储的路径。

❑ -keyalg参数表示使用的算法,一般是RSA。

❑ -validity参数表示证书的有效期。

按Enter键执行上述命令之后,控制台会让输入一些信息,如密码、姓名、单位、国家、地区等信息,全部输入完成之后会生成证书,如图2-11所示。

图2-11 使用keytool生成证书

使用Java自带的jarsigner工具结合我们的证书可以对应用进行签名,但在Eclipse中自动生成的调试apk是不能进行签名的,需要在Eclipse的工程上右击,然后选择Android Tools-Export Unsigned Application Package导出未签名的apk。输入jarsigner -verbose-keystore test.keystore -signedjar testsigned.apk test.apk test指令可以对apk进行签名,如图2-12所示。

图2-12 使用jarsigner对应用签名

❑ -keystore参数表示证书的位置。

❑ -signedjar参数表示签名,需要传入签名后、签名前以及证书的别名作为参数。

实际上Eclipse、AndroidStudio、IntelliJ IDEA等开发工具都支持直接导出签名后的apk。

Eclipse通过对项目右击Export,在弹出的快捷菜单中选择Android→Export Android Application命令,单击“下一步”按钮,出现如图2-13所示窗口中,可以选择已有的keystore或创建一个新的keystore,最后导出一个已签名的apk。

图2-13 AndroidStudio的keystore选择界面

AndroidStudio和IntelliJ IDEA都是通过选择上方的Build→Generate Signed APK命令,在弹出的窗口中选择keystore并导出已签名的apk。