第九章 竞品技术分析

简介: 开机速度 splash广告逻辑,首次加载的图片为应用放在res文件夹下面几个文件夹里面的图片,同时会去调用接口获取下一次打开的时候要显示的图片url,并缓存图片;下次进入该界面显示图片并继续访问接下来一次的图片,为了保证打开速度,这个网络请求务必异步处理。

开机速度

  1. splash广告逻辑,首次加载的图片为应用放在res文件夹下面几个文件夹里面的图片,同时会去调用接口获取下一次打开的时候要显示的图片url,并缓存图片;下次进入该界面显示图片并继续访问接下来一次的图片,为了保证打开速度,这个网络请求务必异步处理。
  2. 引导图,不要超过4页。动画可原生实现,可gif,可视频来实现。
  3. 进入首页之前进行地理位置的定位,保证进入首页显示的数据为当前城市的信息。
  4. app首页设计,尽可能多的将所有产品展示在首页,会有广告,搜索栏,滚动条。

  上面为用户可见的数据,一些不可见数据:

  1. umeng打点,统计激活数。
  2. 注册推送。
  3. 根据推送协议进行页面跳转。
  4. 初始化崩溃收集机制,比如崩溃信息上传等。

为了加快splash的加载速度建议客户端这边尽可能避免耗时间的任务操作

html5页面打开速度

  1. 将html5数据打包进zip包里面去,每次从本地zip解压文件里面加载html5数据;新增或者修改html5信息怎么办,进行版本控制,如果版本一致,加载本地解压数据,如果不是加载新的zip包的解压数据;其中公共的,不变化的html5数据压缩为公用的zip压缩包并下发,那么每次下载的时候只下载新增和修改的那部分html5文件的压缩包。在上个页面设置不可显示的webview加载html5数据,在下个webview加载的时候直接从本地缓存文件里面去加载。

安装包大小

  1. app安装包一定要小,或者实现增量更新,减少对用户流量的不必要耗费。 
  2. 图片,音频,视频文件应该在前期提供的时候就尽可能处理的体积足够小。

       我的观点:

  对于分享,推送,定位,地图等第三方服务集成的时候,能用微信官方,新浪官方自己去实现就尽可能自己去实现,因为团队里面有人为了实现分享集成umeng分享功能,导致应用大小增加4M知道,其中包括很多无用的代码和资源文件,请慎重。

png和jpg的使用场景

  1. 同背景图片,png加载速度大于jpg,手机会对png进行硬件加速。
  2. 网络图片采用jpg图片比较合适。
  3. 广告图,引导图采用jpg比较合适。

splash图片,引导图,背景图

  1. splash图片现在在300-500k之间。
  2. 引导图可以将背景图片和前景图片分开,实现背景图片或者前景图片的可重用性。
  3. 背景图限制在1M以内,并没必要png格式,jpg格式就行了。

表情包的方案同上面html5页面打开速度的论述,都是通过zip来进行增量更新。

清理无用代码和资源文件

  1. eclipse时代用undector可以实现无用代码的检测,android studio暂时没发现,无用资源文件可以通过link来实现无用资源文件,无用style等检测,但是还是需要手动进行删除。
  2. 通过使用proguard来配置混淆代码文件来清理无用的代码,减少apk的大小。

性能优化

  1. 网络请求优化:针对2G,3G,4G,wifi环境服务器端配置不同的服务器,分别接入移动,联通,电信的专线,并在客户端进行配置,app登录获取遍历访问2G,3G,4G,wifi的针对性域名并判断出最佳的访问素的的域名,并在一段时间内访问该域名。为了避免抢占同一服务器的资源,可以在服务器端设置针对的优先级。
  2. 抛弃使用http+json,转而使用tcp+protobuf。

 

页面跳转逻辑解耦

 我个人项目里面是写个路由类,所有的跳转逻辑都写在这个路由类里面,作为所有activity界面跳转中间控制层。

作者利用反射也提供了一个不错的思路:

import android.app.Activity;
import android.content.Intent;

public abstract class BaseActivity extends Activity {

    public void navigateTo(final String activityName, 
            final Intent intent) {
        
        //在这个位置执行页面打点的操作,这里可以利用到activityName
        
        Class<?> clazz = null;
        try {
            clazz = Class.forName(activityName);
            if (clazz != null) {
                intent.setClass(this, clazz);
                this.startActivity(intent);
            }
        } catch (final ClassNotFoundException e) {
            return;
        }
    }
}

activity的常量类:

public class ActivityNameConstants {
    public final static String SecondActivity 
        = "com.example.navigator.SecondActivity";
}

demo:

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends BaseActivity {

    Button btnNav1, btnNav2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnNav1 = (Button) findViewById(R.id.btnNav1);
        btnNav1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,
                        SecondActivity.class);
                startActivity(intent);
            }
        });

        btnNav2 = (Button) findViewById(R.id.btnNav2);
        btnNav2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("name", "Jianqiang");
                navigateTo(ActivityNameConstants.SecondActivity, intent);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

个人认为各有优缺点,还是看自己的偏好吧。

打点统计

页面打点:放在跳转逻辑代码前面;

事件打点:打点逻辑写在基类控件里面,比如写onclick等触发事件的基类,并在这些基类里面写事件打点的逻辑。

 多渠道打包

 我一般是上传到360,百度等加固平台惊醒加固打包,然后利用平台的多渠道打包工具进行批量多渠道打包,书里面讲的是python程序来实现,你可以去github找找,这类代码很多。

class.dex的拆与合

主要还是处理65536的问题,2种方案:

  1. 插件化:独立模块做成单独的apk,使用dexClassLoader来进行加载。
  2. dex分包:主要利用multidex来实现class.dex的拆分。

模块化拆分

android代码的模块化拆分:

  1. 将常用的工具类代码,封装代码,第三方代码单独封装为基础类库。
  2. 指定资源文件命名规范,并以模块名称作为前缀来进行命名。
  3. 模块间传递的数据以json或者单独拉出来公用的bean作为一个库引用。

版本策略:

一般情况下版本名称为3位:比如6.0.0

第一位为大版本更新,第二位用于小版本迭代,第三位作为紧急发版。

 

相关文章
|
4月前
|
人工智能 搜索推荐 安全
ChatGPT 盈利指南:第八章到第十章
ChatGPT 盈利指南:第八章到第十章
508 0
|
12月前
|
机器学习/深度学习 存储 人工智能
ChatGPT的各项超能力从哪儿来?万字拆解追溯技术路线图来了!(1)
ChatGPT的各项超能力从哪儿来?万字拆解追溯技术路线图来了!
120 0
|
12月前
|
机器学习/深度学习 存储 自然语言处理
ChatGPT的各项超能力从哪儿来?万字拆解追溯技术路线图来了!(2)
ChatGPT的各项超能力从哪儿来?万字拆解追溯技术路线图来了!
142 0
|
JSON 机器人 大数据
现货量化交易机器人开发原理丨现货量化交易机器人系统开发(开发案例及源码)
 For quantitative trading,the most important thing is the establishment of models.Generally speaking,it is to use modern statistics and mathematical methods,use computer technology to find laws that can bring excess returns from massive historical data to formulate strategies,and use mathematical mo
|
负载均衡 安全 搜索推荐
缺了这项功能,网站营销难上加难
缺了这项功能,网站营销难上加难
189 2
缺了这项功能,网站营销难上加难
|
自然语言处理
如何做竞品分析?
要做竞品分析,首先得明确,什么类型的产品是竞品?
229 0
如何做竞品分析?
直播带货系统有什么优越性
直播带货系统凭借其方便快捷的购物体验,在疫情期间讯速发展,给人们带来了许多便利,在这个多渠道去中心化的自媒体时代,直播带货系统掀起了一股网络购物新风潮,为消费者提供更完善的购物体验成为一个新的风口。直播带货系统的目的就是抓住商机,满足消费者需求。
|
数据可视化 数据挖掘 程序员
技术人最不该忽视可视化数据分析! | 9月2号栖夜读
今天的首篇文章,讲述了:在这个“人人都是数据分析师”的时代,阿里的同学几乎都在参与数据的采集、加工与消费。数据可视化作为连接“加工——消费”的重要一环,其质量至关重要。优秀的可视化能促成卓越洞见,糟糕的内容则让所有的努力失去意义。
3216 0