本章主要介绍在Android系统上集成开发的操作。

编译设置

  1. 设置DPS-SDK。
    针对Android设备的编译环境,将SDK目录用软链接ln -s的方式放入Android源代码的external目录下,并修改platform/device目录的相应产品目录下的device.mk,增加如下一行:
    $(call inherit-product-if-exists,external/dps-sdk/dps_sdk.mk)
  2. 部署安全策略。
    需要手动加入 DPS 对部分原生 Android 服务的 sepolicy 和 seccomp 补丁,具体方法为手动执行external/dps-sdk/policy/update_sepolicy.sh [android_home]external/dps-sdk/policy/update_seccomp_policy.sh [android_home]

    其中,[android_home]代表Android源码跟路径。

    如果在集成开发环境当中出现因为SELinux Policy阻碍编译以及在编译之后运行过程中产生SELinux permissive审计日志,请根据external/dps-sdk/policy/sepolicy/当中的dps_file_contextsdps.te文件进行SELinux策略的补充和调整。

  3. 编译镜像。
    准备就绪之后,对Android产品镜像进行正常编译,DPS就可以随产品镜像一同生成了。

    高阶的DPS配置可以在external/dps-sdk/dps_sdk.mk中进行具体的控制。

内核配置

开发者如果需要为目标设备编译Linux Kernel,请确保Linux Kernel版本在3.15及以上。并且需要检查在Kernel编译的defconfig选项中使能了以下项目。

  • 开启AUDIT和NETLINKE
    CONFIG_AUDIT_ARCH=y
    CONFIG_AUDIT=y
    CONFIG_HAVE_ARCH_AUDITSYSCALL=y
    CONFIG_AUDITSYSCALL=y
    CONFIG_AUDIT_WATCH=y
    CONFIG_AUDIT_TREE=y
    CONFIG_NF_CT_NETLINK=y
    CONFIG_NF_CT_NETLINK_TIMEOUT=y
    CONFIG_NETFILTER_NETLINK_GLUE_CT=y
  • 开启NETFILTER和IPTABLES
    CONFIG_NETFILTER=y
    CONFIG_NETFILTER_NETLINK=y
    CONFIG_NETFILTER_NETLINK_ACCT=y
    CONFIG_NETFILTER_NETLINK_QUEUE=y
    CONFIG_NETFILTER_NETLINK_LOG=y
    CONFIG_IP_NF_IPTABLES=y
  • 开启XTABLES及相关选项
    CONFIG_NETFILTER_XTABLES=y
    
    #
    # Xtables combined modules
    #
    CONFIG_NETFILTER_XT_MARK=y
    ...
    
    #
    # Xtables targets
    #
    CONFIG_NETFILTER_XT_TARGET_AUDIT=y
    ...
    
    #
    # Xtables matches
    #
    CONFIG_NETFILTER_XT_MATCH_BPF=y
    ...

编译示例

DPS模块提供头文件和静态库供设备应用集成使用。AppSample为实现参考。

  • external/dps/client/inc/DPSClient.h

    DPS client header file

  • libdspclient.a

    DPS client static library

  • libiotx.a

    Link MQTT static library

Android.bp示例:

cc_binary {
  name: "AppSample",
  include_dirs: [
    "external/dps/client/inc",
    ...
  ],
  srcs: [
    "AppSample.cpp",
    ...
  ],
  static_libs: [
    "libiotx",
    "libdpsclient",
    ...
  ],
}

启动设置

对于Android 7以上版本,目前DPS在Android设备上通过集成编译即可自启动,无需额外配置。

对于Android 5,需要在系统的init.rc或者厂商自定义的init.<vendor>.rc当中声名DPS服务。声名方式如下。

service dpsd /system/bin/dps/bin/dpsd
    class main