SDK接入指南(Android)
为确保安装成功,请按照以下步骤进行SDK安装1. 导入SDK
AndroidStudio 接入方案: 在您的app目录下 build.gradle 文件的对应位置添加 compile 字段
{
compileSdkVersion ...
buildToolsVersion ...
...
}
dependencies {
...
compile 'com.growingio.android:vds-android:latest.release@aar'
}
Eclipse 接入方案:
点击
下载最新版本的SDK,并将下载的最新的包放在您的libs目录下。在Eclipse中右键工程根目录,在弹出菜单中选择Properties->Java Build Path -> Libraries, 点击Add External JARs...选择您刚下载的jar文件,然后在
AndroidManifest.xml
文件中添加INTERNET
和ACCESS_NETWORK_STATE
权限。
2. 添加URL Scheme
把URL Scheme添加到您的项目,以便我们唤醒您的程序,进行圈选。
URL Scheme获取方式有两种
- 添加新产品:登录官网 -> 点击新建,选择添加新产品 -> 选择添加Android应用 -> 在第二段“添加URLScheme”中标黄字体。
- 现有产品:登录官网 -> 右上角点击用户头像 -> 点击“项目管理” -> 点击左侧的“应用管理” -> 找到对应产品的URL Scheme。
URL Scheme的格式是growing.xxxxxxxxxxxxxxxx
将该产品的URL Scheme添加到您的AndroidManifest.xml
中的LAUNCHER Activity
下
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<data android:scheme="growing.xxxxxxxxxxxxxxxx"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
请添加一整个intent-filter区块,并确保其中只有一个URL Scheme
3. 初始化SDK
请将以下 GrowingIO.startTracing
和GrowingIO.setScheme
加在您的Application
的 onCreate
函数中
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
GrowingIO.startTracing(this, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
GrowingIO.setScheme("growing.xxxxxxxxxxxxxxxx");
}
}
其中GrowingIO.startTracing
第一个参数为 Context 对象,第二个参数为对应的项目ID。GrowingIO.setScheme
的参数是您的URL Scheme。加入成功后您便可以进行编译了。
4. 代码混淆
如果您启用了代码混淆,请在您的 proguard-rules.pro 中添加以下代码
-keep class com.growingio.android.sdk.** {
public *;
}
-dontwarn com.growingio.android.sdk.**
5. 重要配置项
渠道来源统计
要加入渠道来源统计,请在AndroidManifest.xml
加入配置项
<meta-data
android:name="com.growingio.android.GConfig.Channel"
android:value="XXX应用商店"/>
或者调用
GrowingIO.getInstance().setChannel("XXX应用商店");
采集H5页面数据
如果您在App内嵌入了WebView,可以调用下面的接口来采集页面内数据:
GrowingIO.trackWebView(WebView view, WebChromeClient client);
请在第一次调用WebView.loadUrl()
之前调用,如果您没有自定义的WebChromeClient
第二个参数可以传空值。调用接口后请不要再使用WebView.setWebChromeClient
以免覆盖SDK的设置, SDK会负责调用您的WebChromeClient
。
如果您使用了X5内核的WebView,请使用以下接口:
GrowingIO.trackX5WebView(WebView view, WebChromeClient client);
采集Banner数据
如果您的应用通过ViewPager实现了Banner,请在ViewPager创建时(包括动态创建)调用下面的接口来采集数据。
GrowingIO.getInstance().trackBanner(View viewPager, List<String> bannerDescriptions)
其中List<String> bannerDescriptions
为所有banner的字符串描述。
至此集成完毕。您需要在【添加新产品】页面进行检测并安装。安装成功后您可以在您的App中激活SDK,进行数据定义。具体的激活和圈选教程请看 移动端直接圈选
6. 其他配置项
自定义维度
GrowingIO的数据分析工具提供了例如“应用版本”,“渠道”,“城市”,“设备型号”等等这些通用维度。但在使用过程中,有时无法满足用户对特定数据维度的分析要求。
为了能够让数据分析变得更加的灵活,我们提供了自定义维度的接口,使用者可以对各种对象设置属性。
这些属性在作图时,将表现为维度。
用户属性
用户属性只能用来表示登录用户本身的属性,至少包括用户ID。
根据需求,可以用来指定用户的各种属性
- 自然属性,比如性别、出生年月等。
- 账户属性,比如等级、类型标签等。
- 行为特征,比如是否有过购买记录之类。
用户属性被称为CS字段,最多支持十个,从CS1到CS10,接口如下:
GrowingIO growingIO = GrowingIO.getInstance();
growingIO.setCS1("CS1的key", "CS1的value");
growingIO.setCS2("CS2的key", "CS2的value");
...
growingIO.setCS10("CS10的key", "CS10的value");
在下面的例子中,总计上传5个用户属性,分别是:
CS1: user_id:100324
CS2: company_id:943123
CS3: user_name:张溪梦
CS4: company_name:GrowingIO
CS5: sales_name:销售员小王
private void setGrowingIOCS() {
GrowingIO growingIO = GrowingIO.getInstance();
growingIO.setCS1("user_id", "100324");
growingIO.setCS2("company_id", "943123");
growingIO.setCS3("user_name", "张溪梦");
growingIO.setCS4("company_name", "GrowingIO");
growingIO.setCS5("sales_name", "销售员小王");
}
CS字段设置条件和限制
CS 字段不能是和用户没有直接关系的属性,比如不能是订单 ID,商品 ID 等。
CS1 字段:在 GrowingIO 系统中用于识别注册用户的身份,因此 CS1 的 value 必须填写用户的唯一身份标示 ID。
CS2 字段:在 GrowingIO 系统中用于识别 SaaS 客户的租户,因此所有的 SaaS 用户必须填写租户的唯一身份标示 ID,非 SaaS 用户不做限定。
对于未登录用户,不要设置任何CS字段。
如果没有用到所有的CS字段,剩下的可以不设置。
同一个CS字段,必须保持在各个平台意义相同。
CS1字段设置时机
基本原则
- 当App使用者的登录状态改变时设置CS1字段的值
- 设置后,在下一次任意
Activity.onResume
被调用时,新的CS1字段的值才会被发送 - 在CS1字段的值被发送前,重复设值会导致新的值取代旧的,旧值会被丢弃
用户手动登录
- 如果有多个登录入口,在每一个入口登录成功后,都需要调用
GrowingIO.setCS1
来设置用户的唯一标识 - 如果有第三方登录,成功登录后需要调用
GrowingIO.setCS1
方法
自动登录:App启动时,自动登录或者用户默认是登录状态,也需要调用GrowingIO.setCS1
方法
注册:有的App注册成功后,默认登录,这种情况下也需要调用GrowingIO.setCS1
方法
退出:退出登录时,需要把CS1字段置空,传""
或者null
都可以
其他CS字段遵循相似的设置时机
在上传成功之后,请联系在线客服,我们会为您配置并且激活相应的属性字段。
页面属性
在安卓应用中,页面指的是Activity
。
对于完成多个功能的Activity
,您可以给不同功能分别设置不同的PageGroup
用来辅助区分Activity
。
页面属性被称为PS字段,每个PageGroup
最多支持6个PS字段,从PS1到PS6,接口如下:
GrowingIO.setPageGroup(Activity activity, String name);
GrowingIO.setPS1(Activity activity, String property);
GrowingIO.setPS2(Activity activity, String property);
...
我们以商品详情页为例详细说明它的用法。
您可以将商品的类别,尺码、颜色、生产厂商等信息设置为PS字段,从而更加灵活的分析用户行为。
如,定义产品详情页“Clothing”为一个PageGroup
,并上传4个页面属性,分别是:
PS1:商品ID:1234567
PS2:商品名称:运动T-shirt
PS3:商品尺码:M
PS4:商品颜色:蓝色
public class ProductInfoActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GrowingIO growingIO = GrowingIO.getInstance();
growingIO.setPageGroup(this, "Clothing");
growingIO.setPS1(this, "1234567");
growingIO.setPS2(this, "运动T-shirt");
growingIO.setPS3(this, "M");
growingIO.setPS4(this, "蓝色");
}
}
PS字段设置条件和限制
页面属性接口必须在
Activity
的onCreate
方法中调用请务必设置
PageGroup
后再设置各个PS字段如果没有用到所有的PS字段,剩下的可以不设置。
除了页面本身外,在商品详情页上面所有的界面元素的行为,包括浏览和点击等,都会和这些页面属性建立关联。
在上传成功两小时后,您需要在「项目管理-项目配置-CS 配置中」进行字段配置和激活,配置成功后便可开始使用 CS 字段进行分析。配置过程请参考 属性数据(CS)上传配置文档。
设置图片内容
SDK默认不会采集ImageView的内容,如果您需要区分不同的ImageView可以使用contentDescription来标记:
View.setContentDescription(CharSequence contentDescription);
忽略元素
如果您需要忽略某些特殊内容,比如倒计时元素或涉及隐私的内容,可以使用该功能。
GrowingIO.ignoreView(View view)
设置ActivityGroup
如果您使用了ActivityGroup并且每个子Activity的显示顺序是动态的,请给每个Activity的DecorView设置ID来辅助统计
ViewGroup container = (ViewGroup) findViewById(R.id.activity_container);
View tabDecor = getLocalActivityManager().startActivity("ProductTabActivity",
new Intent(this, ProductTabActivity.class)).getDecorView();
container.addView(tabDecor);
GrowingIO.setTabName(tabDecor, "ProductTabActivity");
动态添加View
如果您有某些View动态添加到ViewTree中并且在父容器中的位置不固定(例如常见的多Fragment实现的Tab切换),请给每个View设置ID来辅助统计
View content = getLayoutInflater().inflate(R.layout.content_view, container, false);
GrowingIO.setTabName(content, "MyContent");
自定义点击事件
如果您有自定义的控件重写了View
的onTouchEvent
方法来判断和处理点击事件,请在每次触发点击事件时调用:
GrowingIO.setPressed(View view);