# 常见问题

## Q：神策分析收费吗？收费标准如何？

* A：神策分析不依靠数据本身获取商业价值，而是通过给客户提供的产品和服务收费。在使用时，主要收取两方面费用，具体费用咨询可以直接和我们联系：
  * 技术服务费用：包括数据采集建议、数据模型建设、核心指标分解等技术服务的费用；基于需求的复杂程度，按年收费；需求越复杂，需要进行的技术服务越多，则费用越多；
  * 产品授权使用费用：包括系统使用授权和使用过程中的相应的技术支持和维护费用；基于事件的数量，按年收费；接入的事件数量越多，则收费越多。

## Q：神策分析单机版对机器配置的要求？

* A：单机版对机器的配置有如下要求：
  * CPU: 4 核或更高（不含超线程），支持 SSSE3 和 AVX 指令集；
  * 内存: 16G 或更高；
  * 操作系统: 建议使用 CentOS 7.x 或 RHEL 7.x, 也支持满足内核版本要求的 CentOS 6.x 或 RHEL 6.x
  * 内核版本：>= 2.6.32-674
  * 文件系统：ext4/xfs
  * 硬盘：每台机器 home 分区可用空间大于 30G，数据盘容量大于 500G，要求如下&#x20;

    以下是一个典型的 centos6 单机版环境磁盘分布。

    ```
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1        50G   13G   36G  26% /            # /home 所在分区有 36G 可用空间
    tmpfs            14G     0   14G   0% /dev/shm
    /dev/sdb1       985G   52M  985G   1% /data        # 数据盘可用空间 985G
    cm_processes     14G   22M   14G   1% /var/run/cloudera-scm-agent/process
    ```

    以下是一个典型的 centos7 单机版环境磁盘分布

    ```
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vda1        50G  7.7G   43G  15% /            # /home 所在分区有 43G 可用空间
    devtmpfs        7.8G     0  7.8G   0% /dev
    tmpfs           7.8G     0  7.8G   0% /dev/shm
    tmpfs           7.8G  185M  7.6G   3% /run
    tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
    /dev/vdb        985G   52M  985G   1% /data        # 数据盘可用空间 985G
    tmpfs           1.6G     0  1.6G   0% /run/user/1000
    tmpfs           1.6G     0  1.6G   0% /run/user/0
    cm_processes    7.8G  101M  7.7G   2% /run/cloudera-scm-agent/process
    ```

    * 如果是物理磁盘，做 RAID1 或更高级别的配置，以保证数据安全；
    * 如果是云磁盘，需要 SSD 云盘或者其它吞吐在 150MB/s 以上的磁盘；
  * 不支持与其它服务混合部署；
  * 安装需要 root 权限。

## Q：神策分析集群版对机器配置的要求？

* A：集群版对于机器的配置有如下要求：
  * 最少 3 个节点；
  * CPU: 16 核或更高（不含超线程，测试用可降至 8 核），支持 SSSE3 和 AVX 指令集；
  * 内存: 64G 或更高（测试可降至 32G）；
  * 硬盘: 每台机器 home 分区可用空间大于 30G，数据盘要求如下&#x20;

    以下是一个典型的 centos6 集群版环境磁盘分布。

    ```
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1        50G   13G   36G  26% /            # /home 所在分区有 36G 可用空间
    tmpfs            14G     0   14G   0% /dev/shm
    /dev/sdb1       985G   52M  985G   1% /data        # 元数据盘可用空间 985G
    cm_processes     14G   22M   14G   1% /var/run/cloudera-scm-agent/process
    /dev/sdc1       5.3T  2.1T  3.0T  42% /data1       # 数据盘(共4块 第1块)
    /dev/sdd1       5.3T  2.2T  2.9T  44% /data2       # 数据盘(共4块 第2块)
    /dev/sde1       5.3T  2.6T  2.5T  51% /data3       # 数据盘(共4块 第3块)
    /dev/sdf1       5.3T  2.6T  2.5T  51% /data4       # 数据盘(共4块 第4块)
    ```

    以下是一个典型的 centos7 集群版环境磁盘分布

    ```
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vda1        50G  7.7G   43G  15% /            # /home 所在分区有 43G 可用空间
    devtmpfs        7.8G     0  7.8G   0% /dev
    tmpfs           7.8G     0  7.8G   0% /dev/shm
    tmpfs           7.8G  185M  7.6G   3% /run
    tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
    /dev/vdb        985G   52M  985G   1% /data        # 元数据盘可用空间 985G
    tmpfs           1.6G     0  1.6G   0% /run/user/1000
    tmpfs           1.6G     0  1.6G   0% /run/user/0
    cm_processes    7.8G  101M  7.7G   2% /run/cloudera-scm-agent/process
    /dev/vdc        5.5T  1.3T  4.3T  22% /data1       # 数据盘(共3块 第1块)
    /dev/vdd        5.5T  1.3T  4.2T  22% /data2       # 数据盘(共3块 第2块)
    /dev/vde        5.5T  1.2T  4.3T  21% /data3       # 数据盘(共3块 第3块)
    ```

    * 如果是物理磁盘：
      * **2 块系统盘/元数据盘**：采用 RAID1 或更高级别，单盘容量 600G 以上，建议 SSD 或 SAS 盘；
      * **4 块或以上数据盘**：不做 RAID 或 LVM，单盘容量 2T 以上，建议 SATA 盘；
    * 如果是云磁盘：
      * **1 块元数据盘**：SSD 云盘，或其它 IOPS 在 1000 以上的磁盘，容量 600G 以上；
      * **多块数据盘**：SSD 云盘，或其它总吞吐在 600MB/s 以上的磁盘，单盘容量 1TB 以上；
  * 操作系统: 建议使用 CentOS 7.x 或 RHEL 7.x, 也支持满足内核版本要求的 CentOS 6.x 或 RHEL 6.x
  * 内核版本：>= 2.6.32-674
  * 文件系统: ext4/xfs
  * 网络：千兆（>= 5 个节点，需使用万兆），所有机器在一个交换机下，并且可以互相 ssh 登录。如果是云服务器尽量开启网络优化。
  * 负载均衡：需要提供独立的前置负载均衡系统。
  * 不支持与其它服务混合部署；
  * 安装需要 root 权限。

## Q: 神策分析中存储用户行为数据需要多大磁盘？

* A: 按经验，1 亿条用户行为数据，在压缩前约 40GB，压缩后约 10GB。特别地，在集群版中默认使用三副本，则 1 亿条数据压缩前约 120GB，压缩后约 30GB。

## Q: 使用神策分析采集用户行为数据，需要多大带宽？

* A: 服务器带宽主要受峰值在线用户数影响，数据采集服务对服务器下行带宽要求远高于上行带宽。对于 App 采集数据，默认每 15 秒压缩并上报一次，按经验，每个用户平均每 5 秒产生一条事

  件，则服务器 10Mbps 下行带宽／1Mbps 上行带宽能支持约 5 万峰值在线；对于 JavaScript 采集，由于数据实时上报且无压缩，服务器 10Mbps 下行带宽／1Mbps 上行带宽能支持约 2 万峰值在>线。

## Q：我们应该如何接入数据？

* A：我们提供了多种不同的数据接入方式：使用批量导入工具 batch\_importer 导入历史数据；使用 log\_agent 监控日志文件增量实时导入数据；或者使用各个 SDK 来实时导入数据。可以根据不同的阶段和不同的需要来选择。具体可以参考这部分的[说明](https://54td.gitbook.io/shence/technical_guide/data_import)。

## Q：是否还可以提供数据方面的技术服务？

* A：我们在提供产品以外，还有偿提供如下的技术服务：帮助客户分解数据需求，确定核心指标；帮助客户根据数据需求理清数据源，生成规范的日志数据；帮助客户基于我们的产品产生 Dashboard，监控各个核心指标；应客户需求，协助完成一些具体的数据分析工作。

## Q：你们的产品非常强大，那么除了分析用户数据以外，还可以分析哪些其它类型的数据呢？

* A：神策分析提供的 event 和 profile 模型中，用户除了可以是互联网用户以外，还可以是其他类型的实体。例如，对于一个上门服务类型的产品来说，除了关心用户的行为，也会关心提供服务的技师的行为。那么，对于这一类需求，可以单独部署一套神策分析，或者在已有的系统内创建一部分单独的事件，这些事件的“用户”就是技师，而这些事件记录技师接受订单，上门服务等信息，然后据此也可以创建一系列分析技师的核心指标和转化漏斗等。

## Q：我调试的时候程序写得有bug，数据导入错了，能不能把导错的这些数据给删掉？

* A：我们并不建议使用者因为这种原因而频繁地删除数据，当然，如果真有删除数据的需要，可以联系 Sensors Data 的技术支持人员进行操作。同时，为了帮助用户顺利地完成数据导入，神策分析提供了以下一系列的手段：
  * [批量导入工具](https://54td.gitbook.io/shence/technical_guide/import_tool/batch_importer)提供格式校验功能； &#x20;
  * 产品界面上也提供了格式校验，并且可以根据校验的结果来创建元数据；
  * 可以申请短时间的云版试用环境，用于调试导入程序，在试用环境使用过程中，界面上会显示导入的进度，同时也会对导入数据的错误进行提示。因此，我们建议客户可以在云版试用环境上完成调试后，再在私有的生成环境中进行数据接入；
  * 如果由于业务发展，导致以前有意义的事件现在不需要了，则一方面可以停止导入这类事件，另一方面可以通过神策分析提供的隐藏事件功能，将之隐藏。

## Q：我们在使用时，想帮助不同的同事配置不同的报表，应该如何实现？

* A：神策分析目前提供了比较完整的权限模型，其中的管理员可以配置好数据概览并且共享给其他人。具体来说，帐号一共分为三类，分别具有如下功能：
  * 管理员：
    * 权限管理：有“帐号管理”功能，也可以进行“报表授权”；
    * 数据分析：所有的数据分析功能都可以使用；
    * 概览：可以察看自己和别人共享而来的概览，创建概览，编辑自己所创建的概览；并且可以通过“概览授权”功能将概览共享给其他用户；
    * 漏斗：管理员可以创建漏斗和删除自己的漏斗，创建的漏斗全局可见；
  * 分析师：
    * 数据分析：所有的数据分析功能都可以使用；
    * 概览：可以察看自己和别人共享而来的概览，创建概览，编辑自己所创建的概览；由于没有“权限管理”功能中的“概览授权”功能，所以概览只能自用；
    * 漏斗：分析师可以创建漏斗和删除自己的漏斗，创建的漏斗只有自己可见；
  * 普通用户：
    * 概览：可以察看别人共享而来的概览；并且，概览点击进去后，只能调整时间区间，不能做其它筛选和分组的调整。

## Q：有些分析和查询，我们想集成到自己的后台系统中，应该如何实现？

* A：神策分析是客户完全私有的数据分析系统，因此，专门开放了[查询 API](https://54td.gitbook.io/shence/technical_guide/secondary_development/api)，使用者可以在任何需要的地方获得数据，然后进行任意形式的展现和集成。除此之外， 神策分析实质上也帮助客户搭建了一个完全私有的数据平台，客户传入的任何数据都完全开放给客户，可以通过批量和流式两种方式进行使用，具体可以联系 Sensors Data 的技术支持人员。

## Q：神策分析后台是怎么实现的？查询层用得啥？

* A：神策分析主要用到了一些主流的开源社区技术，例如 Hadoop/Impala/Kafka/MySQL/Redis/jQuery/ECharts/Kudu/Parquet 等，以及一些我们自己开发的核心组件。

## Q：你们的 Demo 为啥不能导入数据？

* A：Demo 环境主要是给大家展示神策分析的查询、可视化、分析等方面的信息，导入的数据是我们后台模拟生成自动导入的数据。如果想尝试导入自己的数据进行查询和分析，可以联系我们获取相应的试用环境。

## Q：[删除数据](https://54td.gitbook.io/shence/technical_guide/other_tools/sa_clean)和[隐藏事件](https://54td.gitbook.io/shence/use_steps/features/accessibility/data_management)有什么区别？

* A：删除数据是真正地将数据删除了，而隐藏事件，只是在界面上将数据隐藏，并且在计算“任意事件”时，不统计这个事件。

## Q：神策分析如何保证客户数据的可靠性？

* A：神策分析的集群版和单机版，都采用了各种方案，保证数据的高可靠性：
  * 集群版：
    * 神策分析的集群版采用了分布式的存储方案，每份数据都有三倍冗余存储，保证了数据的高可靠性；
  * 单机版：
    * 对于采用云主机的客户，我们推荐客户使用 IaaS 提供的云磁盘（例如 UCloud 的云 SSD 盘）保证磁盘的高可靠性；
    * 对于使用物理机器的客户，我们也建议客户采用至少 RAID10 的底层存储方案，来保证磁盘的高可靠性；
    * 神策分析也建议，客户在应用层能够对短期的数据进行打包和备份；
  * 结合以上的种种方案，可以相信我们为客户的数据提供了很高的可靠性。

## Q：神策分析如何保证客户数据的安全性？

* A：我们从私有部署和云版两种部署来回答这个问题：
  * 私有部署：
    * 从数据存储上，这部分数据是存储在客户自己的机器上，不存在安全顾虑；
    * 从查询接口上，可以只对内网提供查询服务，并且也是有登录权限认证的；
    * 从数据传输上，如果选择后端传输数据，则是内网到内网的传输，不存在安全顾虑，如果是前端埋点，我们支持 [https 上报数据然后再内网转发](https://54td.gitbook.io/shence/technical_guide/secondary_development/data_import_https)；
  * 云版：
    * 从数据存储上，我们提供的是单租户的部署方案，不同客户之间数据是完全物理隔离的；
    * 从查询接口上，不同客户是不同的权限账号体系，也有不同的查询 token；
    * 从数据传输上，不同客户使用不同数据上报 token，我们也支持 [https 上报数据](https://54td.gitbook.io/shence/technical_guide/secondary_development/data_import_https)。

## Q：神策分析主要使用了哪些开发语言？

* A：神策分析开发主要用到了 Java、C++、Python、JavaScript 等主流语言。

## Q：神策分析主要使用了哪些存储和计算方案？

* A：神策分析主要用到了 Hadoop、Impala 等开源的分布式存储和计算套件，并结合业务的具体场景，对他们的代码做了很多针对性的修改和优化。

## Q：如何识别用户是通过百度的具体哪个关键词过来的？

* A：用户通过百度的搜索结果跳转到自己的网站主要有两种情形：
  * 一种是通过自己购买的关键词点击推广结果（一般被称为 sem）过来，对于这种场景，我们建议在做关键词投放的时候，对于不同的关键词，在投放的 URL 上做一个区分，例如，网站首页是`http://www.example.com`，那么，对于关键词 keyword1，则投放的 URL 是`http://www.example.com/?utm_source=baidu&utm_term=keyword1`，在实际展现页面的时候，依然是展现首页，但是却可以从 URL 中知道用户是通过哪个关键词过来的了；
  * 另一种，是通过自然搜索结果（一般被称为 seo）过来，由于百度在 2015 年，已经去掉了 referer 中的关键词显示，所以目前第三方并没有好的方式获得具体跳转过来的关键词。

## Q：神策分析的数据是否支持修改/更新/Update？

* A：神策分析中的数据分为两类：
  * 对于 Profile 类数据，由于它描述的是用户的状态，是可能发生改变的，所以我们通过 profile\_set、profile\_unset、profile\_delete 等接口，提供了完整的数据修改和删除的功能；
  * 对于 Event 类数据，由于它描述的是用户在过去所做的事情，从语义上它应该是在发生后就不能够改变的，同时为了保证最好的查询性能，目前不支持对 Event 数据的修改；
  * 如果使用者担心由于代码错误或者数据传输错误等原因，导致传入数据有误，我们提供了如下方案来解决此类问题：
    * 我们的数据分析师会根据客户的需求帮助客户制定完善的数据接入方案，我们的技术人员会在客户数据接入过程中提供完善的技术支持；
    * 我们所有的 SDK 和导入工具都提供了 debug 模式，用于数据接入过程中的调试；
    * 我们可以为客户提供测试环境，事实上在神策分析 1.5 多 Project 功能上线后，客户可以自己开一个 Project 来进行测试；
  * 如果在以上方案之下，依然由于某些原因导致有错误数据进入，则我们建议客户按照如下步骤先删除数据再重新导入数据：
    * 使用 sa\_clean 工具删除出错的那些 Event 在出错的时间段内的数据；
    * 在之前出错的原始数据的基础上，完成对数据的修改，修改后再重新导入；
    * 如果之前出错的原始数据客户没有备份，我们可以酌情协助从系统中还原导出。

## Q：导入到神策分析中的属性，在导入后是否可以修改类型：

* A：为了保证导入到神策分析中数据的正确性以及相应的最优的存储方案，神策分析是坚持强类型校验的，导入到神策分析中的属性类型不能修改，但是，使用者可以按照如下方式来解决类似的需求：
  * 首先在测试的时候应该使用单独的测试项目，尽量避免测试数据导致的类型错误。而对于测试项目则可以通过直接重置项目来还原所有类型定义；
  * 如果已经是正式项目了，那么可以导入一个新的属性，使用正确的类型，在属性命名上与旧的属性区分，显示名上，新属性可以使用旧属性原本的显示名，同时隐藏旧的属性；
  * 如果真的有非常强烈的需求，可以寻求神策分析技术支持人员的帮助，在不修改属性名的情况下进行属性类型的修改，但是无法保留该属性的历史数据，且需要停止导入。

## Q：私有部署版的神策分析应该如何选择服务器的配置：

* A：神策分析支持在不同配置、不同规模的服务器上运行，而影响服务器配置选择的因素其实是非常复杂的，包括但不限于以下这些：

  * 每天导入的数据量：例如每天约需要导入 1000w 用户行为，且往后每月约增长 20%。
  * 历史积累的数据量：例如已经有 3 年，累计 100 亿的历史数据，且希望在一周之内完成导入。
  * 查询分析场景：例如大部分查询分析都使用最近一个月的数据，希望能够在 10 秒内得出结果；少数查询分析使用几个月或更长的数据，希望在一分钟内得出结果；可以接受在一些场景下使用抽样查询。
  * 平台使用场景：例如需要和 CRM、营销推送系统等进行对接，或者需要基于神策分析的数据进行离线数据挖掘等。

  神策分析的咨询顾问会根据以上信息为使用者进行详细的评估并给出最合适的服务器配置建议，而如果使用者暂时不能提供足够的信息，我们会按照典型的使用场景来进行推荐。由于神策分析可以非常容易的支持数百万至数千亿数据规模的平滑扩容，因此我们通常会建议先用较低的配置开始部署，之后再根据系统实际的使用情况按需随时进行调整，以最大限度的节约使用者的成本。

## Q：神策分析的查询性能是由哪些因素影响的？如何提升查询性能？

* A：神策分析的查询性能，是由以下一些因素影响的：

  * 单次查询所扫描的数据量越少，查询会越快。需要注意的是，系统里面存储的总的数据量，并不会影响神策分析的查询速度，查询速度只与该次查询所涉及的数据量有关。一般而言，一个时间横跨 40 天，涉及到 6 个事件的漏斗分析，要比只横跨 7 天，涉及 1 个事件的事件分析要慢得多。
  * 机器的磁盘读性能越好，查询也会越快。在不考虑应用层 cache 的情况下，神策分析的每次查询都需要从磁盘中扫描数据，因此，磁盘的扫描性能会直接影响查询速度。
  * 机器的 CPU 性能越好，查询也会越快。一个完整的查询，在磁盘中读取数据以后，还需要完成一些聚合类型的计算，因此，CPU 性能越好，查询也会越快。
  * 集群版机器数量越多，查询也会越快。在其它硬件相同的情况下，机器数量增多，相当于直接提升了磁盘的读取以及 CPU 的计算性能，因此也会让查询更快。

  而如果需要提升神策分析的查询性能，可以从以下几种方案入手：
* 使用抽样查询，减少单次查询扫描的数据量。可以通过抽样查询快速发现和验证一些问题，然后在需要的时候，再关闭抽样获取最准确的数据。
* 提升机器性能。这个包括更换更好的磁盘，换更好的 CPU，以及在集群版中直接增加机器节点数量，对于查询性能，都会有立竿见影的效果。

## Q: 神策分析 iOS、Android SDK 如何发送数据？是否会影响 App 的用户体验？

* A: 默认情况下，iOS、Android SDK 都采用非常保守的发送策略，以保证用户体验为核心，具体策略如下：
  * 普通模式 (非 Debug)
    1. 除 `login` 外，所有 `track` / `profile_set` / `profile_append` 等操作，均先缓存在本地，当缓存的数据量满足以下任一条件，且当前网络为 3G/4G/Wifi 时，发送数据；
    2. 本地缓存的数据量积累到一定数目（默认为 100 条）；
    3. 离上次发送间隔了一定时间（默认为 15 秒）；
    4. 对于 `login` 操作，当网络为 3G/4G/Wifi 时立即发送所有数据，否则缓存在本地；
    5. 当 App 进入后台时，会尝试发送数据；
    6. Android SDK 在 `onPause` 中尝试发送；
    7. iOS SDK 在 `didEnterBackground` 中尝试发送；
  * Debug 模式
    1. 对于任何操作，无论什么网络条件，都会立即发送数据，并校验返回的验证结果。

用户可以在任何时候，调用 `flush` 发送数据。当数据发送失败时，会继续缓存在本地，直到发送成功。当缓存数据量过多时，会删除最旧的 100 条数据，然后再存入新的数据。其中 Android 默认缓存数据量阈值为 32MB，iOS 为 10000 条。

在 iOS 或 Android SDK 初始化后，用户可以调用 API 修改发送条件，如设定缓存累积条目数、发送时间间隔以及是否在 App 进入后台时发送数据，具体请参考 iOS、Android SDK 的文档。

## Q: 神策分析 iOS SDK 如何获取匿名 ID？

* A: 在集成了神策分析 SDK 的 App 中，SDK 会为每个设备分配一个匿名 ID，用于标记产生事件的未登录用户，并以此进行用户相关分析，如留存率、事件漏斗等。如果项目中导入了 `AdSupport` 库，并且 SDK 配置开启 IDFA，则 SDK 尝试获取 IDFA 作为匿名 ID；如果没有配置使用 IDFA 或者获取 IDFA 失败，则 SDK 尝试获取 IDFV 作为匿名 ID；如果获取 IDFV 失败，则会生成 UUID 作为匿名 ID。

  使用 IDFV 或 UUID 作为匿名 ID，当用户重新安装 App 时，如使用 1.9.10 之前的 SDK，匿名 ID 可能会发生变化。 1.9.10 之后的 iOS SDK，将匿名 ID 和 trackInstallation 标记位存储到 Keychain 上，解决卸载重装后，匿名 ID 可能变化及重复发送 trackInstallation 的问题。

```objectivec
+ (NSString *)getUniqueHardwareId:(BOOL *)isReal {
    NSString *distinctId = NULL;

    // 宏 SENSORS_ANALYTICS_IDFA 定义时，优先使用IDFA
#if defined(SENSORS_ANALYTICS_IDFA)
    Class ASIdentifierManagerClass = NSClassFromString(@"ASIdentifierManager");
    if (ASIdentifierManagerClass) {
        SEL sharedManagerSelector = NSSelectorFromString(@"sharedManager");
        id sharedManager = ((id (*)(id, SEL))[ASIdentifierManagerClass methodForSelector:sharedManagerSelector])(ASIdentifierManagerClass, sharedManagerSelector);
        SEL advertisingIdentifierSelector = NSSelectorFromString(@"advertisingIdentifier");
        NSUUID *uuid = ((NSUUID* (*)(id, SEL))[sharedManager methodForSelector:advertisingIdentifierSelector])(sharedManager, advertisingIdentifierSelector);
        distinctId = [uuid UUIDString];
        // 在 iOS 10.0 以后，当用户开启限制广告跟踪，advertisingIdentifier 的值将是全零
        // 00000000-0000-0000-0000-000000000000
        if (distinctId && ![distinctId hasPrefix:@"00000000"]) {
            *isReal = YES;
        } else{
            distinctId = NULL;
        }
    }
#endif

    // 没有IDFA，则使用IDFV
    if (!distinctId && NSClassFromString(@"UIDevice")) {
        distinctId = [[UIDevice currentDevice].identifierForVendor UUIDString];
        *isReal = YES;
    }

    // 没有IDFV，则使用UUID
    if (!distinctId) {
        SADebug(@"%@ error getting device identifier: falling back to uuid", self);
        distinctId = [[NSUUID UUID] UUIDString];
        *isReal = NO;
    }

    return distinctId;
}
```

## Q: 神策分析 Android SDK 如何获取匿名 ID？

* A: 神策分析 Android SDK 优先使用 Android ID 作为匿名ID，如果无法获取将使用 UUID 为用户生成随机匿名 DistinctID，使用 UUID 时，用户重新安装 App 时，神策分析会重新分配的 DistinctID。

```java
return UUID.randomUUID().toString()
```

## Q: 为什么没有提供某种语言的 SDK？

* A: 目前我们主要针对常见的语言和客户端提供了 SDK，但是，我们的基于 HTTP 协议的数据接入 API 是完全开放的，我们没有提供 SDK 的语言，可以直接通过 API 进行导入。

​
