背景
我们公司从17年10月份开始规划的考研一对多平台项目锐跨考,在经过不到2个月的时间,从无到有开发完成,就在年后大家上班没多久,意外发现了一款名为橙啦的App简直就是我们锐跨考的复制版,除了替换了logo外,别的界面简直一模一样,最关键的是在我们平台注册的用户可以直接在橙啦app上登录。天呐,我还是第一次遇到这样的事情。无容置疑,这肯定是公司出现了内鬼,一锅端。
随便放上几张对比图:
防范
项目一开始就注重了代码安全,既混淆了源码,在发布时又进行了加壳加固处理。可是万万没想到有内鬼的出现,
既然出现了内鬼,那这个代码肯定是完全被copy走了。但是项目不止这一个,后期新开发的项目不得不考虑代码安全,尤其是对应内鬼的出现。如何防止别人即使拿到源码也不是那么轻易的能简单修改就能上线,我们想到了以下两种方案:
-
远端依赖
即把主要工程全部做一个lib库的形式,上传到私有的代码托管平台上,本地新建一个项目然后做一个启动页,启动完成后就启动远程lib库的主界面。然后只提交本地这个项目到公司的git上。
-
本地aar依赖
即新建一个lib工程,把项目中的一些主要网络请求和工具类等抽取到这个lib里面,然后混淆打包后生成aar文件,导入到项目中使用。然后把lib库单独一个人维护,上传到私有代码托管平台。项目继续提交到公司的git上。
最终我们选择了第二种。
为什么不用第一种方案?
第一种方案有几个不方便的地方
- 上传到公司的git上的项目就一个启动页,后续基本上就不会有提交了,这样公司高层也能察觉有问题
- 项目不是一个人开发,需要多人协作,如果后续开发都在远端私有平台上进行,也保不齐会有人泄漏的风险
于是采用了第二种方案。
操作
那就开搞吧。
-
在项目中新建一个Module,然后在application的Module下配置gradle依赖这个lib库的Module,方便测试提取代码是否有问题。
-
测试完成没有问题,则新建一个工程,然后导入这个lib库的module到新的工程里面,删除项目工程中的lib模块。
-
在lib工程下,配置lib module的gradle的签名,签名文件放在项目的跟目录下
signingConfigs { mConfig { storeFile file('kuakao.keystore') storePassword "********" keyAlias "kuakao" keyPassword "********" } }
-
然后再配置buildTypes
buildTypes { release { minifyEnabled true //混淆打包 signingConfig signingConfigs.mConfig //签名 // 混淆文件的位置 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
-
不要忘记配置混淆文件proguard-rules.pro
-
然后在studio的右侧边栏点击Gradle,找到并双击assembleRelease
-
等待几秒看控制台输出,如果出现BUILD SUCCESSFUL in …s就表示打包aar文件成功
-
然后可以在lib模块下build/outputs/aar目录下找到生成的aar,这样就可以把aar依赖到工程里面使用了。
当你lib库修改重新打包aar替换到项目中时,会有不生效的问题
解决办法:切换左侧工程视图到Project,然后找到并删除.idea/libraries/Gradle_lib_aar.xml文件,再同步一下工程即可。