从代码被盗到aar混淆打包

日防夜防,家贼难防

Posted by Alee on July 13, 2018

背景

我们公司从17年10月份开始规划的考研一对多平台项目锐跨考,在经过不到2个月的时间,从无到有开发完成,就在年后大家上班没多久,意外发现了一款名为橙啦的App简直就是我们锐跨考的复制版,除了替换了logo外,别的界面简直一模一样,最关键的是在我们平台注册的用户可以直接在橙啦app上登录。天呐,我还是第一次遇到这样的事情。无容置疑,这肯定是公司出现了内鬼,一锅端。

随便放上几张对比图:

橙啦首页

锐跨考首页

橙啦个人中心

锐跨考个人中心

防范

项目一开始就注重了代码安全,既混淆了源码,在发布时又进行了加壳加固处理。可是万万没想到有内鬼的出现,

既然出现了内鬼,那这个代码肯定是完全被copy走了。但是项目不止这一个,后期新开发的项目不得不考虑代码安全,尤其是对应内鬼的出现。如何防止别人即使拿到源码也不是那么轻易的能简单修改就能上线,我们想到了以下两种方案:

  1. 远端依赖

    即把主要工程全部做一个lib库的形式,上传到私有的代码托管平台上,本地新建一个项目然后做一个启动页,启动完成后就启动远程lib库的主界面。然后只提交本地这个项目到公司的git上。

  2. 本地aar依赖

    即新建一个lib工程,把项目中的一些主要网络请求和工具类等抽取到这个lib里面,然后混淆打包后生成aar文件,导入到项目中使用。然后把lib库单独一个人维护,上传到私有代码托管平台。项目继续提交到公司的git上。

最终我们选择了第二种。

为什么不用第一种方案?

第一种方案有几个不方便的地方

  • 上传到公司的git上的项目就一个启动页,后续基本上就不会有提交了,这样公司高层也能察觉有问题
  • 项目不是一个人开发,需要多人协作,如果后续开发都在远端私有平台上进行,也保不齐会有人泄漏的风险

于是采用了第二种方案。

操作

那就开搞吧。

  1. 在项目中新建一个Module,然后在application的Module下配置gradle依赖这个lib库的Module,方便测试提取代码是否有问题。

  2. 测试完成没有问题,则新建一个工程,然后导入这个lib库的module到新的工程里面,删除项目工程中的lib模块。

  3. 在lib工程下,配置lib module的gradle的签名,签名文件放在项目的跟目录下

    signingConfigs {
            mConfig {
                storeFile file('kuakao.keystore')
                storePassword "********"
                keyAlias "kuakao"
                keyPassword "********"
            }
        }
    
  4. 然后再配置buildTypes

     buildTypes {
            release {
                minifyEnabled true     //混淆打包
                signingConfig signingConfigs.mConfig  //签名
                // 混淆文件的位置
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    
  5. 不要忘记配置混淆文件proguard-rules.pro

  6. 然后在studio的右侧边栏点击Gradle,找到并双击assembleRelease

  7. 等待几秒看控制台输出,如果出现BUILD SUCCESSFUL in …s就表示打包aar文件成功

  8. 然后可以在lib模块下build/outputs/aar目录下找到生成的aar,这样就可以把aar依赖到工程里面使用了。

当你lib库修改重新打包aar替换到项目中时,会有不生效的问题

解决办法:切换左侧工程视图到Project,然后找到并删除.idea/libraries/Gradle_lib_aar.xml文件,再同步一下工程即可。