一个人工作之余 6 元上线一款 APP 的血泪史

4,326 阅读16分钟
原文链接: www.jianshu.com

码字不易,转载请注明:转自www.jianshu.com/p/21ae5a303… 

很久没有写博客了,一方面是前段时间工作项目太忙,再加上想完成自己的一个目标。还有就是写博客真的有点累....在一个技术群大概提了下,对这类文章的需求,我发现需求还是挺大的。因为自己也会经常学习关注,发现这类文章很少,不然自己也不会埋了很多坑,也填了不少。一个人从需求,Android开发,H5,后台,还得了解点产品,市场,运营几项功能集中在一个人身上,有4次马上上线了,,结果发现有重大的bug。你们可能无法了解那个时候内心的折腾与心酸。还放弃了周末和空余放松的时间.....

  好吧,容我吐槽下。吐槽完进入正题,我先谈谈阅读这篇文章可能带来的好处:

1.每个开发者都能上线一款自己独立开发设计的APP

2.从需求想法诞生到上线运营里面的过程和坑(很多)

3.分享自己优化整理的工具类

4.如何合理有效利用免费资源(我自己只花了6元,其实这6元还不是花在APP上面的,后面解释)

5.如何实现“全栈”工程师,我一个人如何从前端,客户端,到后台

6.兼容机型,自己找了270台机器做兼容

7.实战告诉你瘦身+保活+性能优化

对了忘记说了,我的app名字叫喵抢红包,这个是我弄的官网miaoqiang.bmob.cn/ ;喵抢红包是专门为安卓用户提供的超高性价比抢红包工具,可以帮你自动帮你抢微信红包,只要启动APP,息屏也可以实现抢红包的功能,并且消耗流量少,操作及其简单好上手。不是打广告哈,有些同学谈到微信自动抢红包的软件,可能会有印象,我以前提过。网上可能也有,但是你们有没有想过,为什么很少人把它上线做出来,因为自己做着玩的APP和给广大用户使用,这是完全两种不同的感受。还有些人会说,你这个是不是网上找一个改改界面就好了,我想说,下载体验你就会发现,完全是不同的感受。毕竟也是我花了不少时间在上面。

AccessibilityService(辅助服务)演示学习 - 腾讯视频

收起视频
转到视频页

一、盘古开天地(需求诞生)


关于想法,一开始是很多boss发大红包,自己的渣渣手机抢不赢,而且没有太多时间去关注微信群,错过大红包的感觉相信大家都有过体验,那个时候才知道,有抢红包的软件。刚好自己也在研究AccessibilityService,避免重复造轮子,那就先去网上找个轮子。轮子找到了,发现bug不少,然后自己修复完善改造下。轮子能走了,但是不能造车,勉勉强强够用。那个时候身边同事朋友都开始用,而且自己也用它抢了不少红包(偷笑),那个时候才真正体会到,技术创造财富,渣渣手机抢不赢你们,,那我就用科技来!最后搁浅,后面自己身边朋友和自己的一些兴趣,又开发了不少app。但是发现那些用的人并不多....当你辛辛苦苦开发一款app,你发现大家下载的不多,这个时候很落寞,不过也能理解,因为自己开发的时候,也是抱着周边人用。不想当将军的士兵,永远不是好士兵!你自己的出发点都是这样,怎么能要求别人不嫌弃你的app呢。我不清楚正在阅读的你是不是程序员,但是与我而言,做了Android开发也有不少时间了,总会有种遗憾,做着玩的app很多,但是拿出手的不多,上线的不多。那我能不能上线一款自己独立开发的app呢?

二、女娲造人(规划完成)


发现以前做的抢红包的app下载量有130多(没有对外推),而且马上过年过节,这一类型的可能受欢迎程度较高。另外我需要投入的精力也不会太多,因为我以前做过,只需要在上面的基础上优化改造。需求已经有了,就开始进行市场调研和竞品分析,然后把产品原型大概弄出来。虽然大学读书期间自学过图像,视频音频相关软件,如PS,AE,Premiere,Adobe Audition,然自己设计图还是硬伤,就找了一个以前合作过的一个学妹弄。阿里巴巴矢量图标库 通过这个可以满足程序猿和产品制作图标,很方便。一款产品的诞生,最小的标配就是一个开发,一个UI,一个产品,一个运营兼市场。角色齐了,产品模型出来,后面就是开发的事情了。我先从开发的角度来谈谈。

三、产品进化


1.后台搭建

首先做APP开发的人都清楚,app基本离不开数据,那么对于一个Android开发来说,搭建服务器,设计表,造数据库,这些都需要很多的学习成本,虽然以前是web后台转过来,很久没有碰了,再找人合作的话,自己也不是特别想,因为这些给我时间,我也可以弄出来。那么如何解决了?后面网上了解了下,市场上已经有很多后端云,专门针对移动端的开发者,开发者只需要关注客户端的开发就行,不用过多精力投入到后台,这正是我需要的!!移动开发必备的后端云服务,国内外比较知名的有StackMobParse,Kinvey,Sencha.io,Bmob,Amazon EC2。 这里我不详细介绍了,我从自身所需,对比了下,发现Bmob更加适合我。六大BaaS产品推荐:移动开发必备的后端云服务 这篇文章对后端云服务做了一个介绍。利用Bmob,我只需要集成SDK,然后在我的后台建立几张表,服务器就算搭好了。我使用了里面的数据服务和版本更新,本来也打算使用里面的支付功能,但是因为有个开发者利用bmob开发违法内容,被微信取消了支付能力。只能自己独立弄支付,后面了解到Ping++不错,有这方面的需求的同学,可以了解下。

2.搭建SVN

虽然是自己一个人写代码,但是也少不了版本控制,不可能用U盘拷贝,自己有没有服务器,那我是如何搭建自己的SVN呢?百度云盘建svn服务器步骤 通过百度提供的同步盘搭建,还有个好处就是很多资源,文本记录都可以放在里面,很方便同步。

3.APP端开发


查看竞品分析后,我发现它们都不需要用户注册,那么他们是怎么区分用户了,这个时候我想到了每个设备都有唯一标识码,这个时候你可能会提问,万一我更换设备怎么办,我的账户是不是就不存在了?这个我考虑过用户体验,在用户必须注册(方便我后期管理)和设备更改我重新导入数据,我选择后者,因为现在用户都有点反感注册,另外注册我还得设计登录注册界面,又是一大波工作量,用户设备更改不会特别频繁可以接受。那么如何区别设备唯一标识呢?这里我用了下黑科技。获取Android设备唯一标识码 这篇文章介绍的很详细,我用的是mac地址,如果Wifi没有打开过,是无法获取其Mac地址的。这个是缺陷,但是有黑科技可以解决。我收到的激活wifi,然后再关闭就可以解决,等会看代码。因为这个上线前发布前发现一个重点问题,那就是Android6.0的mac地址用通用的方法获取的都是02:00:00:00:00:00这个固定的值,原来Android6.0对硬件信息的访问,其管控更加严格。SD卡的读写,除了权限声明之外,还应该动态请求,否则就会被禁止。简书贴代码很不方便,我把获取唯一标识弄成了一个工具类,可以查看下。 oiw25nur4.bkt.clouddn.com/PhoneUtils.…

//黑科技:手动打开wifi,然后再关闭

if (!wifiMan.isWifiEnabled()) {

//必须先打开,才能获取到MAC地址

wifiMan.setWifiEnabled(true);

wifiMan.setWifiEnabled(false);

}

因为喵抢红包业务模块不是特别多,我前期第一个版本通过Android四大组件来区分。


4.APP优化

与时间赛跑挤时间的开发期这里技术细节就不提了,我只谈谈这个过程。功能开发完成,界面UI完善好。就到了后面的优化期,在打包的时候,我发现我的app有点大。通过Android Studio提供的AnalyzeAPK,工具栏中选择Build>AnalyzeAPK选中所要解析的APK。以前是发现res文件特别大,然后发现是几张图片导致的,通过tinypng.com/ 压缩下就OK了。因为app大小不是特别大,细节优化我就没有做。关于性能优化细节可以看下我写的APP淘宝,你为什么这么慢卡? APP性能优化从“娃娃”抓起 这两篇文字很详细。下面是我优化过后的。



抢红包注重的是速度,我对所有的网络请求,监听又重新梳理了下,在抢的过程中,能不进行网络请求,数据传输,就不用。把额外的逻辑判断简化。

保活,为了防止用户错过红包,需要保持服务一直开启着,网上关于保活的方式方法很多,比如守护进程,广播监听拉活,将服务设置为前台进程,设置服务的优先级等等。我本来想使用守护进程,但是由于是AccessibilityService,需要用户手动开启,我无法通过代码开启(有可能可以用代码开启,但是我不知道,如果有通过代码开启辅助服务,麻烦告知下)。

解决办法:

1.AndroidManifaset.xml  application节点下配置android:persistent="true"

2.AndroidManifaset.xml 中service节点的intent-filter设置服务优先级最高1000,android:priority="1000"

3.增加常驻通知栏,工具类代码:oiw25nur4.bkt.clouddn.com/WidgetUtils… 


四、埋坑与填坑


因为很多东西以前有过经验弄过,已经躺过很多坑,所以这里只列出我开发这个app遇到的坑

1.分享(使用Mob的社会化分享,本来想用友盟的,但是集成我看了下,有些有点繁琐,Mob我以前集成过,上手快)

申请的签名文件MD5,我当时通过cmd命令方式得到的包含冒号,结果发现不对,不能有冒号,平时项目开发都是直接产品给到一个key和id就行。所以说,不去亲自体验不会发现有坑。另外就是新浪微博平台的RedirectUrl需要和你微博开发者信息配置的url一致。


2.APP官网miaoqiang.bmob.cn/

去各个平台申请开发者账号和发布应用市场时需要一个官网,自己租服务器需要花钱,还得写前端的东西,各种样式结合时间人力成本,果断放弃,刚好发现Bmob也提供官网,但是前提是需要你集成他们的统计SDK.参照他们的文档一步步集成,然后申请,结果被告知被驳回,没有集成SDK,但是我明明按照步骤来集成的,这个时候只能自我怀疑,首先怀疑的对象是混淆,是不是我混淆掉了关键代码,然后发现Bmob文档关于混淆有些地方多了空格....开发者一般都是直接复制的,导致有些地方混淆出错,肉眼很难发现...希望后面可以改下。然后还是不行,直接打个debug包不行,重新申请一个appId不行,重新新建一个项目不行....为了一个官网和bmob的工作人员调了差不多两天,我又一遍遍检查,发现我这边真的没有问题,但是为什么审核那边还是检测不出来有统计信息呢?那个时候我真的快开始怀疑人生!!最后我这边没有问题了,那就是Bmob那边的问题,让工作人员换个手机再看看,怀疑缓存或者其他导致的。结果....可以了!!!(求那时我心里的阴影面积)。这里提这个,主要是想总结下解决问题的方式:

a.通用问题,如某个api忘记了,百度即可。并不是所有人能翻墙

b.疑难杂症,Google必备

c.出问题,要有怀疑一切的心,有时问题就出现在你认为没有问题的地方

d.二分查找,举个简单的例子,一段代码有问题,我不知道问题在哪,那我就先注释一半,然后看另外一半有没有问题。依次处理。

e.怀疑设备,A,B,C手机可以,D手机不行,就看是不是这种类型的手机的问题,这个就涉及到兼容性。A,B,C,D手机以前可以,现在不行了,我遇到过,当时周末还折腾到凌晨2,3点,发现好奇葩,已经怀疑人生了。后面怀疑是不是我的Service用的太久,因为经常在那几款手机上测试。然后尝试把Service改个名字。结果可以了......具体为什么我现在也不清楚。

f.出去走走,好好睡一觉,不要想现在手上的问题,过一会答案可能就在你的脑海里

3.充分合理利用第三方资源

a.监测崩溃集成Bugly

b.在Testin上面可以免费测试APP,一开始使用会提供200台设备,再加上自己账户的设备加起来大概270台,测下兼容性,这个强烈推荐下

c.第三方统计友盟,监测应用市场渠道取得PV,UV

d.第三方加固,以前一直用的是爱加密,然后发现对这类APP不支持,又去找了梆梆加固的客服了解,发现也不行,代码虽然混淆了,但是我还是不希望暴露太多代码。又继续去寻找新的第三方平台,还考虑深度混淆。踏破铁鞋无觅处,发现360加固可以解决我的问题。在此感谢下360的提供!!

e.资源内容存储,七牛云实名认证后,会提供很多空间。可以把自己的apk,资源配置文件都放在上面。少了一比服务器的投入。

4.多渠道打包

采用美团多渠道打包美团Android自动化之旅—生成渠道包优点是快,使用方便。

不过按照上面的打包方式在Android 7.0会有问题,通过下面方式解决:


5.兼容性

有个方法获取系统时间制在华为荣耀上面崩溃,感谢室友提供手机测试。时间处理工具类代码:

oiw25nur4.bkt.clouddn.com/DateUtils.t…

//华为荣耀 崩溃的方法

public static boolean is24HourFormat(Context context) {

//获得内容提供者

ContentResolver mResolver= context.getContentResolver();

//获得系统时间制

String timeFormat = android.provider.Settings.System.getString(mResolver,android.provider.Settings.System.TIME_12_24);

//判断时间制

if(timeFormat.equals("24"))

{

//24小时制

return true;

}else {

//12小时制

return false;

//获得日历

//            Calendar mCalendar=Calendar.getInstance();

//            if(mCalendar.get(Calendar.AM_PM)==0){

//                //白天

//            }else {

//                //晚上

//            }

}

}

//改进的方法:

public static booleanis24HourFormat(Context context) {

returnandroid.text.format.DateFormat.is24HourFormat(context);

}

6.兼容微信版本

正打算上线发版的时候,突然一个朋友说看不到红包的数据,,(前面已经出现3次上线前有影响大的bug),顿时心里那个无语。只能埋头解决,我发现我自己两个三星手机都是正常的,为什么oppo不行?我上传数据是通过获取微信id来的。难道是机型设备问题吗?通过android.os.Build.BRAND得到机型去处理,后面发现问题解决了。但是第二天又发现其他机型不行了。这个时候开始怀疑微信。原来微信每个版本的id会不同。我只能兼容最近的4个版本。魅族系统非原生不能用下面的api否则会崩溃。


7.前端

APP页面难免会涉及到前端,很久没有碰前端,怎么快速写前端代码呢?dreamweaver,不过它还有安装,比较麻烦,现在很多工具软件都有在线版的,直接一搜,通过图形化编辑就可以解决。然后放到七牛云里面,在原生APP通过webview.loadUrl()进行加载。这种方式时候随时会更改的功能内容。

8.坑爹的应用市场

APP已经准备齐全,接下来就是发布推广运营了,去各个市场注册账号发版。下面是我整理收集应用市场需要的相关资料。

如何发布一款Android应用到安卓市场

最全最新安卓主流市场首发/活动/换量联系人大全

最新免费推广App的十大方法

如何推广一个新的 app?

五、总结

还没提到标题的6元怎么花的,那个6元,是在腾讯企业邮箱那购买的域名miaoqiang.club花的。写到最后,我不知道我自己有没有表述清楚,里面可能会有些问题,欢迎大家指出。希望对遇到有相关问题的同学有个参考帮助。另外,可以帮忙推广宣传下,就帮忙下。码字真心不易啊!!

在2016完成了自己独立上线一款APP的目标,希望17年会更好,祝大家17年事业有成,一帆风顺,心想事成!