前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Docker+Jenkins持续集成环境(5): android构建与apk发布

Docker+Jenkins持续集成环境(5): android构建与apk发布

作者头像
JadePeng
发布于 2018-03-28 05:07:02
发布于 2018-03-28 05:07:02
2K00
代码可运行
举报
运行总次数:0
代码可运行

项目组除了常规的java项目,还有不少android项目,如何使用jenkins来实现自动构建呢?本文会介绍安卓项目通过jenkins构建的方法,并设计开发一个类似蒲公英的app托管平台。

android 构建

安装android sdk:

  • 先下载sdk tools
  • 然后使用sdkmanager安装:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    ./sdkmanager "platforms;android-21" "platforms;android-22" "platforms;android-23" "platforms;android-24" "platforms;android-25" "build-tools;27.0.3" "build-tools;27.0.2" "build-tools;27.0.1" "build-tools;27.0.0" "build-tools;26.0.3" "build-tools;26.0.2" "build-tools;26.0.1" "build-tools;25.0.3" "platforms;android-26"

然后把把sdk拷贝到volume所在的目录。

jenkins 配置

jenkins需要安装gradle插件,构建的时候选择gradle构建,选择对应的版本即可。

构建也比较简单,输入clean build即可。

android 签名

修改build文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
android {

    signingConfigs {
        release {
            storeFile file("../keystore/keystore.jks")
            keyAlias "xxx"
            keyPassword "xxx"
            storePassword "xxx"
        }
    }

    buildTypes {
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
            applicationVariants.all { variant ->
                if (variant.buildType.name.equals('release')) {
                    variant.outputs.each {
                        output ->
                            def outputFile = output.outputFile
                            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                                def fileName = "${defaultConfig.applicationId}_${defaultConfig.versionName}_${releaseTime()}.apk"
                                output.outputFile = new File(outputFile.parent, fileName)
                            }
                    }
                }
            }
        }
    }
    lintOptions {
        abortOnError false
    }

}


def releaseTime() {
    new Date().format("yyyyMMdd_HH_mm_ss", TimeZone.getTimeZone("Asia/Chongqing"))
}

构建时自动生成版本号

android的版本号分为version Nubmer和version Name,我们可以把版本定义为 versionMajor.versionMinor.versionBuildNumber,其中versionMajor和versionMinor自己定义,versionBuildNumber可以从环境变量获取。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ext.versionMajor = 1
ext.versionMinor = 0

android {
    defaultConfig {
        compileSdkVersion rootProject.ext.compileSdkVersion
        buildToolsVersion rootProject.ext.buildToolsVersion
        applicationId "com.xxxx.xxxx"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionName computeVersionName()
        versionCode computeVersionCode()
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

// Will return "1.0.42"
def computeVersionName() {
    // Basic <major>.<minor> version name
    return String.format('%d.%d.%d', versionMajor, versionMinor,Integer.valueOf(System.env.BUILD_NUMBER ?: 0))
}

// Will return 100042 for Jenkins build #42
def computeVersionCode() {
    // Major + minor + Jenkins build number (where available)
    return (versionMajor * 100000)
             + (versionMinor * 10000)
             + Integer.valueOf(System.env.BUILD_NUMBER ?: 0)
}

apk发布

解决方案分析

jenkins构建的apk能自动发布吗? 国内已经有了fir.im,pgyer蒲公英等第三方的内测应用发布管理平台,对于小团队,注册使用即可。但是使用这类平台:

  • 需要实名认证,非常麻烦
  • 内部有些应用放上面不合适

如果只是简单的apk托管,功能并不复杂,无非是提供一个http接口提供上传,我们可以自己快速搭建一个,称之为apphosting。

大体的流程应该是这样的:

  • 开发人员commit代码到SVN
  • jenkins 从svn polling,如果有更新,jenkins启动自动构建
  • jenkins先gradle build,然后apk签名
  • jenkins将apk上传到apphosting
  • jenkins发送成功邮件,通知开发人员
  • 开发人员从apphosting获取最新的apk

apphosting 服务设计

首先,分析领域模型,两个核心对象,APP和app版本,其中app存储appid、appKey用来唯一标识一个app,app版本存储该app的每次build的结果。

再来分析下,apphosting系统的上下文

然后apphosting简单划分下模块:

我们需要开发一个apphosting,包含web和api,数据库采用mongdb,文件存储采用mongdb的grid fs。除此外,需要开发一个jenkins插件,上传apk到apphosting。

文件存储

文件可以存储到mongodb或者分布式文件系统里,这里内部测试使用mongdb gridfs即可,在spring boot里,可以使用GridFsTemplate来存储文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     *  存储文件到GridFs
     * @param fileName
     * @param mediaContent
     * @return fileid 文件id
     */
    public String saveFile(String fileName,byte[] mediaContent){
        DBObject metaData = new BasicDBObject();
        metaData.put("fileName", fileName);
        InputStream inputStream = new ByteArrayInputStream(mediaContent);
        GridFSFile file = gridFsTemplate.store(inputStream, metaData);
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file.getId().toString();
    }

存储文件成功的话会发挥一个fileid,通过这个id可以从gridfs获取文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * 读取文件
     * @param fileid
     * @return
     */
    public FileInfo getFile(String fileid){
        GridFSDBFile file = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(fileid)));
        if(file==null){
            return null;
        }

        FileInfo info = new FileInfo();
        info.setFileName(file.getMetaData().get("fileName").toString());
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            file.writeTo(bos);
            info.setContent(bos.toByteArray());
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return info;
    }

APK上传接口

处理上传使用MultipartFile,双穿接口需要检验下appid和appKey,上传成功会直接返回AppItem apk版本信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @RequestMapping(value = {"/api/app/upload/{appId}"},
            produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
            method = {RequestMethod.POST})
    @ResponseBody
    public String upload(@PathVariable("appId") String appId, String appKey, AppItem appItem, @RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return error("文件为空");
        }
        appItem.setAppId(appId);
        AppInfo appinfo = appRepository.findByAppId(appItem.getAppId());
        if (appinfo == null) {
            return error("无效appid");
        }

        if (!appinfo.getAppKey().equals(appKey)) {
            return error("appKey检验失败!");
        }

        if (saveUploadFile(file, appItem)) {
            appItem.setCreated(System.currentTimeMillis());
            appItemRepository.save(appItem);

            appinfo.setAppIcon(appItem.getIcon());
            appinfo.setAppUpdated(System.currentTimeMillis());
            appinfo.setAppDevVersion(appItem.getVesion());
            appRepository.save(appinfo);

            return successData(appItem);
        }

        return error("上传失败");
    }
    
  /**
     * 存储文件
     *
     * @param file    文件对象
     * @param appItem appitem对象
     * @return 上传成功与否
     */
    private boolean saveUploadFile(@RequestParam("file") MultipartFile file, AppItem appItem) {
        String fileName = file.getOriginalFilename();
        logger.info("上传的文件名为:" + fileName);

        String fileId = null;
        try {
            fileId = gridFSService.saveFile(fileName, file.getBytes());

            appItem.setFileId(fileId);
            appItem.setUrl("/api/app/download/" + fileId);
            appItem.setFileSize((int) file.getSize());
            appItem.setCreated(System.currentTimeMillis());
            appItem.setDownloadCount(0);

            if (fileName.endsWith(".apk")) {
                readVersionFromApk(file, appItem);
            }

            return true;
        } catch (IOException e) {
            logger.error(e.getMessage(),e);
        }

        return false;
    }

因为我们是apk,apphosting需要知道apk的版本、图标等数据,这里可以借助apk.parser库。先把文件保存到临时目录,然后使用apkFile类解析。注意这里把icon读取出来后,直接转换为base64的图片。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * 读取APK版本号、icon等数据
     *
     * @param file
     * @param appItem
     * @throws IOException
     */
    private void readVersionFromApk(@RequestParam("file") MultipartFile file, AppItem appItem) throws IOException {
        // apk 读取
        String tempFile =  System.getProperty("java.io.tmpdir") +File.separator + System.currentTimeMillis() + ".apk";
        file.transferTo(new File(tempFile));
        ApkFile apkFile = new ApkFile(tempFile);
        ApkMeta apkMeta = apkFile.getApkMeta();
        appItem.setVesion(apkMeta.getVersionName());

        // 读取icon
        byte[] iconData =  apkFile.getFileData(apkMeta.getIcon());
        BASE64Encoder encoder = new BASE64Encoder();
        String icon = "data:image/png;base64,"+encoder.encode(iconData);
        appItem.setIcon(icon);
        apkFile.close();
        new File(tempFile).delete();
    }

jenkins 上传插件

jenkins插件开发又是另外一个话题,这里不赘述,大概讲下:

  • 继承Recorder并实现SimpleBuildStep,实现发布插件
  • 定义jelly模板,让用户输入appid和appkey等参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">

  <f:entry title="appid" field="appid">
    <f:textbox />
  </f:entry>

  <f:entry title="appKey" field="appKey">
    <f:password />
  </f:entry>

  <f:entry title="扫描目录" field="scanDir">
    <f:textbox default="$${WORKSPACE}"/>
  </f:entry>

  <f:entry title="文件通配符" field="wildcard">
    <f:textbox />
  </f:entry>

  <f:advanced>
    <f:entry title="updateDescription(optional)" field="updateDescription">
      <f:textarea default="自动构建 "/>
    </f:entry>
  </f:advanced>

</j:jelly>
  • 在UploadPublisher定义jelly里定义的参数,实现绑定
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    private String appid;
    private String appKey;
    private String scanDir;
    private String wildcard;
    private String updateDescription;

    private String envVarsPath;

    Build build;

    @DataBoundConstructor
    public UploadPublisher(String appid, String appKey, String scanDir, String wildcard, String updateDescription,  String envVarsPath) {
        this.appid = appid;
        this.appKey = appKey;
        this.scanDir = scanDir;
        this.wildcard = wildcard;
        this.updateDescription = updateDescription;
        this.envVarsPath = envVarsPath;
    }
  • 然后在perfom里执行上传,先扫描到apk,再上传
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            Document document = Jsoup.connect(UPLOAD_URL +"/" + uploadBean.getAppId())
                    .ignoreContentType(true)
                    .data("appId", uploadBean.getAppId())
                    .data("appKey", uploadBean.getAppKey())
                    .data("env", uploadBean.getEnv())
                    .data("buildDescription", uploadBean.getUpdateDescription())
                    .data("buildNo","build #"+ uploadBean.getBuildNumber())
                    .data("file", uploadFile.getName(), fis)
                    .post();

插件开发好后,编译打包,然后上传到jenkins,最后在jenkins项目里构建后操作里,选择我们开发好的插件:

apphosting web

仿造蒲公英,编写一个app展示页面即可,参见下图:

还可以将历史版本返回,可以看到我们的版本号每次构建会自动变化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @GetMapping("/app/{appId}")
    public String appInfo(@PathVariable("appId") String appId, Map<String, Object> model) {
        model.put("app", appRepository.findByAppId(appId));

        Page<AppItem> appItems = appItemRepository.findByAppIdOrderByCreatedDesc(appId,new PageableQueryArgs());
        AppItem current  = appItems.getContent().get(0);
        model.put("items",appItems.getContent());
        model.put("currentItem",current);

        return "app";
    }

延伸阅读

Jenkins+Docker 搭建持续集成环境:


作者:Jadepeng 出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi 您的支持是对博主最大的鼓励,感谢您的认真阅读。 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【案例】Linkedin如何用大数据变现
导读:对Linkedin商业数据分析部门而言,大数据分析不是什么高高在上、复杂枯燥的工作,而是一门化繁为简、高效实用的艺术。 在大数据时代,商业数据分析部门对一个公司的重要意义不言而喻。目前,很多公司的数据分析部门采用的都是“分析放在报表之上”的分析方法,即每天产出非常繁琐、复杂、海量、事无巨细的分析报告,但这些分析报告的可理解性和可执行性并不强。而Linkedin作为一个典型的数据驱动的公司,在进行数据分析时却反其道而行之,采用了“报表放在分析之上”的方法,化繁为简,以最快的速度在大数据金矿中发掘出最
小莹莹
2018/04/20
9540
【案例】Linkedin如何用大数据变现
张溪梦:庙算者多胜-大数据发展战略
时间:2014年6月6日上午 地点:北京国际会议中心 会议:中美创新链接·大数据专题研讨会 主办:中美创新协会,北京市科协 演讲人: 张溪梦,LinkedIn商务分析高级总监 演讲题目:庙算者多胜-大数据发展战略 以下为演讲全文: 感谢大家听我做汇报,我希望把我的演讲尽量变的更简短一些。我名字叫张溪梦,在美国大约做工作做了不到十年。主要目的就是做大数据分析,我以前是脑外科医生,做分析和做医生没有本质性区别,就是通过不同的症状来诊断事物本身的基本的比如说疾病。然后采用不同的方法治愈病人,让病人身体更健康。
大数据文摘
2018/05/21
6070
互联网大数据背后的秘密 分析创造商业价值
今天很多是创业公司或者BAT公司,大家把时间花在下面,美国做了一个研究,大部分数据分析师和科学家花很多的时间,只有10%时间创造很多的价值。那么势必我们会产生更少的价值,用更多的资源,我觉得企业急需要解决的问题。不应该把时间浪费在下面,要做大规模自动化。
IT阅读排行榜
2018/08/14
7740
互联网大数据背后的秘密 分析创造商业价值
曝光:硅谷巨头们如何玩赚大数据
今天要跟大家分享的文章来自曾小苏 Clara的《硅谷观察之大数据篇》,该作者是36氪驻硅谷首席代表,水瓶座B型血爱吃肉,传说中是个美女。在硅谷的一个月,她在 startups demo days 和各种大公司一日游中度日,她以为会逃脱国内各种会上各种“大数据”和挖掘机的梗,但万万没想到那里更甚。所以,本文发自繁华程度仅次于五道口的宇宙中心硅谷(呵呵呵呵~),与国内小伙伴分享大数据在那片土地上的真实生长状况。在上篇她着重为大家介绍了硅谷“大数据公司”的类型,下篇讲了硅谷四大不同类型的公司如何玩转大数据。
IT阅读排行榜
2018/08/14
5270
硅谷观察之大数据篇(完整版)
作者: 曾小苏 Clara 摘自:36氪 【上篇:挖掘机和“改变世界的”大数据公司们】 硅谷的这一个月,我在 startups demo days 和各种大公司一日游中度日,以为会逃脱国内各种会上各种“大数据”和挖掘机的梗,但万万没想到这里更甚。Hi~ 本文发自仅次于五道口的宇宙中心硅谷,与你分享大数据在这片土地上的真实生长状况。 什么是“改变世界”的大数据公司 近两周硅谷两场规模比较大的 demo 大会上,就有十多家自称做大数据的 startups,有做消费者行为的,有做体育分析的,有做 NGO 融资的,
大数据文摘
2018/05/23
6320
为什么大数据如此重要?
大数据 大数据是一种现代云基础架构,它包含了多种与其他人连接和共享信息的方法。它推动了“物联网”的发展,如通过社交网站连接人、通过共享朋友或网络来寻找人们之间互相认识的可能性。大数据的背后运行着人工智
小莹莹
2018/04/20
7430
为什么大数据如此重要?
【学习】如何进行大数据的入门级学习?
大数据是眼下非常时髦的技术名词,自然也催生出了一些与大数据相关的职业,通过对数据的分析挖掘来影响企业的商业决策。   这群人被称做数据科学家(Data Scientist),这个头衔最早由D.J.Pati和Jeff Hammerbacher于2008年提出,他们后来分别成为了领英(LinkedIn)和Facebook数据科学团队的负责人。而数据科学家目前也已经在美国传统的电信、零售、金融、制造、物流、医疗、教育等行业里开始创造价值。   不过在国内,大数据的应用才处于萌芽状态,人才市场还不太成熟,每家公司对
小莹莹
2018/04/20
5940
【学习】如何进行大数据的入门级学习?
大数据时代八大热门IT岗位
新的想法诞生新的技术,从而造出许多新词,云计算、大数据、BYOD、社交媒体、3D打印机、物联网……在互联网时代,各种新词层出不穷,令人应接不暇。 这些新的技术、新兴应用和对应的IT发展趋势,使得IT人必须了解甚至掌握最新的IT技能。另一方面,云计算和大数据乃至其他助推各个行业发展的IT基础设施的新一轮部署与运维,都将带来更多的IT职位和相关技能技术的要求。 毫无疑问,这些新趋势的到来,会诞生一批新的工作岗位,比如数据挖掘专家、移动应用开发和测试、算法工程师,商业智能分析师等,同时,也会强化原有岗位的新生命力
小莹莹
2018/04/20
8090
【每天一个数据分析师】面对毫无基础的业务人员,好的分析师解释逻辑,而不是细节
论坛君 “每天一个数据分析师”在第七期有幸采访到谢宇先生,他是中国联通广西分公司的大数据负责人,有超过7年的电信行业数据挖掘经验,目前主要负责大数据应用规划、基础平台设计、大数据商业变现。下面进入正题
小莹莹
2018/04/20
7100
【每天一个数据分析师】面对毫无基础的业务人员,好的分析师解释逻辑,而不是细节
【大数据】世界沉醉在数据里
我在美国加州硅谷参加了第八届全球Hadoop技术峰会(Hadoop Summit 2015)。在短短的3天时间里我既见识到了Hortonwork, Cloudera, SAP, IBM,惠普,雅虎等25+数据服务技术提供商围绕大数据设计开发的产品,也聆听了Schlumberger(能源巨头),verizon(通信巨头),迪斯尼(娱乐巨头),Airbnb(共享经济代表企业),赛门铁克(信息安全巨头),Aetna(医疗保险巨头)这些各行各业的领军企业用数据产品为公司创造价值的真实案例。我最大的感受就是有这
小莹莹
2018/04/23
6850
【大数据】世界沉醉在数据里
大数据告诉你,移动互联网是如何吃掉整个世界的
Managershare:这个世界已经被移动互联网改变了。它大到世界,小到我们每个人的生活细节。 没错,我们正站在这样一个特别的历史拐点上。 第一次,技术被销售给每个普通人 1. 十几年前,我们被 1
小莹莹
2018/04/20
6370
大数据告诉你,移动互联网是如何吃掉整个世界的
【干货】一篇文章详解:大数据框架、大数据采集平台、数据产品创建
导 读: 大数据听得耳朵起茧了,但真正能深入了解吗?不一定。在此特分享三个主题,分别是:不一样的大数据框架、不一样的大数据采集平台、神一样的数据产品。整编成一篇文章,与大家一起分享! 一、数据从哪里来
小莹莹
2018/04/23
1.9K0
【干货】一篇文章详解:大数据框架、大数据采集平台、数据产品创建
未来是数据科学的时代,也是数据科学家的时代
无论是在国内还是国外,数据科学都是目前最炙手可热的研究领域,数据分析师、数据科学家也是最火爆的职业。据LinkedIn的最新投票结果显示,“统计分析和数据挖掘” 是2014年最热门的职业技能,美国招聘
小莹莹
2018/04/23
7190
未来是数据科学的时代,也是数据科学家的时代
大数据落地不妨从Call Center数据开始
  Hadoop、YARN、全数据分析、数据建模等这些大数据名词纷至沓来时,不由你漠视大数据的趋势。但趋势归趋势,当你着手大数据应用时,从何着手就成为了一个非常现实的问题。 99%被忽视的数据   所谓大数据,让我们抛开其4V的特性,思考一些究竟有哪些数据应该进行分析,很多人将大数据理解为微博、微信等非结构化数据,实际上,很多行业/企业并不拥有这些数据,这些数据通常掌握在互联网厂商手里,对于很多行业/企业来说,基于互联网的应用很多还都是一个尝试性的阶段,对于互联网大数据分析还不是一个急迫的需求。   行业
小莹莹
2018/04/23
8500
大数据落地不妨从Call Center数据开始
☞【观点】徐尽欢:我也说说大数据
一:在Oracle做了六年数据库销售的我从5月份开始内部转到新成立的大数据部门,虽然还没有转完但是已经到新部门上了一个月的班了,如果我说我是Oracle 数据库部门最懂大数据的销售应该没人会反对吧!本周二上班跟负责电信的各路工程师头脑风暴,最后的结论是很让人气馁的,但是昨天和今天跟负责制造业和金融的同事头脑风暴,我真的看到了希望应该说很大的希望,接下来容我一一道来! 二:现在都说大数据,每个行业都在建,但是应该分分类,一种大数据是需求驱动性的,本来就是数据量大,我就想解决现在的问题,这种大数据建设很务
小莹莹
2018/04/20
9680
大数据的痛点
大数据分析仍处于初级阶段,我们还没有深入应用数据驱动决策。在这里,我们讲讨论当前的痛点以及如何用更好的方式应用大数据。 大数据为企业提供了一个更好的提高生产力和收入的机会。然而,企业在大数据收集上就遇到了麻烦。2012年,通过对300位高管和经理们的调查,清楚的展示了企业在管理大数据过程中的挑战和困难。下面是调查的要点: 66%的受访者希望企业里可以有更多的人使用分析工具。 59%的受访者认为,现有的分析框架处理大数据太慢了。 57%的受访者认为他们的分析框架无法与大数据的流入网络的速度匹配。 55%的
小莹莹
2018/04/20
2K0
大数据的痛点
祝贺大数据创业机会研讨会圆满结束 附嘉宾分享PDF下载
由PPV课发起举办的数据创客活动之大数据创业机会研讨会于10月31日在天使岛创客中心圆满落幕。 大数据是继云计算和物联网之后有一大颠覆性技术变革,尤其是今年8月份国务院出台了《促进大数据发展的行动纲要》,随后又出台了具体落地的时间表,国内的大数据发展可以说进入了一个新的历史阶段。与此同时,我们也可以看到国内大数据成熟的案例和应用还较少,人才的缺乏也制约了企业的发展,理性决策、靠数据说话的数据思维方式也需要进一步的普及。 由PPV课、天使岛创客空间联合举办的“数据创客系列活动”之《大数据创业机会研讨会》的
小莹莹
2018/04/20
7370
祝贺大数据创业机会研讨会圆满结束 附嘉宾分享PDF下载
【聚焦】电信大数据变现带来的跨界效应
在这个世界上你最亲密的伙伴是谁?爱人、家人通通都不是,最亲密的伙伴其实是你们的手机。在你每次触控手机时都会产生数据,这些大量的数据都被存储在电信运营商的系统中。这时运营商在想,如何将这些数据“变废为宝
小莹莹
2018/04/23
7460
【聚焦】电信大数据变现带来的跨界效应
祝贺广东大数据青年人才培养计划优秀学员被企业录取
《广东大数据青年人才培养计划》第一期学员企业录用,正式名单如下表: 姓名职位单位杨征数据分析师广州泰迪智能科技有限公司施兴数据分析师广州泰迪智能科技有限公司 祝贺以上学员! 广州泰迪智能科技有限公司是一家专业从事大数据挖掘软件基础研究、培训、咨询服务及数据挖掘应用开发的高科技集团公司。公司开始运作于2005年,是国内目前具有较强实力的数据挖掘系统研发及咨询服务商之一。 公司主导成立的中国AI创业研发俱乐部,是国内具有较大影响力和知名度的人工智能专业组织,其旗下网站:智能中国网 (www.5iAI.com),
小莹莹
2018/04/20
6100
祝贺广东大数据青年人才培养计划优秀学员被企业录取
大数据公司挖掘数据价值的49个典型案例
本文力图从企业运营和管理的角度,梳理出发掘大数据价值的一般规律: 以数据驱动的决策,主要通过提高预测概率,来提高决策成功率; 以数据驱动的流程,主要是形成营销闭环战略,提高销售漏斗的转化率; 以数据驱动的产品,在产品设计阶段,强调个性化;在产品运营阶段,则强调迭代式创新。 从谷歌、亚马逊、Facebook、LinkedIn,到阿里、百度、腾讯,都因其拥有大量的用户注册和运营信息,成为天然的大数据公司。而像IBM、Oracle、EMC、惠普这类大型技术公司纷纷投身大数据,通过整合大数据的信息和应用,给其他公司
机器学习AI算法工程
2018/03/09
5K1
推荐阅读
相关推荐
【案例】Linkedin如何用大数据变现
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档