Haoyh的博客


  • 首页

  • 归档
Haoyh的博客

在Android工程中集成友盟统计记录

发表于 2016-12-11 |

在Android工程中集成友盟统计

首先需要在友盟官网注册账号并添加新应用,获取Appkey。具体步骤这里不进行叙述。

1.集成准备

首先需要集成友盟统计SDK

有两种方式:

1.下载SDK,并复制到工程 lib/目录下;

2.通过添加gradle依赖,在app/builde.gradle中添加

1
2
3
dependencies {
compile 'com.umeng.analytics:analytics:latest.integration'
}

因为gradle文件有变化,所以需要更新下工程,就可以使用友盟统计包中的方法了。

接下来在工程中配置Appkey

在AndroidManifest.xml中添加权限,填写Appkey和渠道id,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<manifest……>
<uses-sdk ……></uses-sdk>
<!--这4个权限都是必须添加的,最好检查下是否同工程已经添加的权限重复,权限具体用途请自行搜索-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<application ……>
……
<activity ……/>
<!--替换为在友盟后台申请的应用Appkey-->
<meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"></meta-data>
<!--应用的推广渠道名称,Channel ID自定义-->
<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
</application>
</manifest>

如果希望在代码中配置Appkey,Channel等信息,就在程序入口处调用下面的方法:

1
MobclickAgent. startWithConfigure(UMAnalyticsConfig config)

需要创建UMAnalyticsConfig实例,该类有多个构造方法

1
2
3
4
5
UMAnalyticsConfig(Context context, String appkey, String channelId)
UMAnalyticsConfig(Context context, String appkey, String channelId, EScenarioType eType)
UMAnalyticsConfig(Context context, String appkey, String channelId, EScenarioType eType,Boolean isCrashEnable)

构造意义:
String appkey:官方申请的Appkey
String channel: 渠道号
EScenarioType eType: 场景模式,包含统计、游戏、统计盒子、游戏盒子
Boolean isCrashEnable: 可选初始化. 是否开启crash模式

  • 建议在AndroidManifest文件中进行配置

2.session统计

在每个Activity的onResume方法中调用 MobclickAgent.onResume(Context),
onPause方法中调用 MobclickAgent.onPause(Context)。

  • 对于继承了BaseActivity的类,不要同时在父和子Activity中重复添加onResume和onPause方法,会造成重复统计。

  • 确保在所有的Activity中都调用 MobclickAgent.onResume() 和MobclickAgent.onPause()方法,这两个调用将不会阻塞应用程序的主线程,也不会影响应用程序的性能。

  • 当应用在后台运行超过30秒(默认)再回到前端,将被认为是两个独立的session(启动),例如用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。可通过接口:MobclickAgent.setSessionContinueMillis(long interval) 来自定义这个间隔(参数单位为毫秒)。

  • 如果调用Process.kill或者System.exit之类的方法杀死进程,请务必在此之前调用MobclickAgent.onKillProcess(Context context)方法,用来保存统计数据。

3.页面统计

只包含Activity的应用,使用上面2.session统计 进行设置就已经默认统计了每个Activity的挑战路径了。页面统计不需要再添加其他代码。

对包含Activity、Fragment和FragmentActivity的应用,需要进行以下设置。

建议定义统一的BaseActivity、BaseFragment及BaseFragmentActivity,然后工程中的类分别对应继承这些Base类,那么就只需要对Base类进行配置了,当然在Base类里也可以定义其他一些方法。

调用MobclickAgent.openActivityDurationTrack(false); 禁止默认的页面统计方式,这样就不会自动统计Activity了。会走我们下面的配置。(详细的统计fragment)

说下base类如何配置

BaseActivity.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class BaseActivity extends Activity {
@Override
protected void onResume() {
super.onResume();
MobclickAgent.onPageStart(getLocalClassName());
MobclickAgent.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
MobclickAgent.onPageEnd(getLocalClassName());
MobclickAgent.onPause(this);
}
}

BaseFragment.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public abstract class BaseFragment extends Fragment {
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(getClass().getName());
}
@Override
public void onPause() {
super.onPause();
MobclickAgent.onPageEnd(getActivity().getLocalClassName());
}
}

BaseFragmentActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BaseFragmentActivity extends FragmentActivity {
@Override
protected void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
}
  • 新创建的Activity需要继承BaseActivity

4.发送策略

发送策略有两种方式:1.启动时发送;2.按间隔发送。默认使用启动时发送的策略

在友盟后台进行设置,位置:统计分析->设置->发送策略

5.日志加密、代码混淆

在程序入口设置加密模式

1
2
3
/** 设置是否对日志信息进行加密, 默认false(不加密). */
AnalyticsConfig.enableEncrypt(boolean enable);//6.0.0版本以前
MobclickAgent.enableEncrypt(boolean enable);//6.0.0版本及以后

代码混淆

如果应用使用了混淆,需要在混淆文件添加

1
2
3
4
5
6
7
8
9
10
-keepclassmembers class * {
public <init> (org.json.JSONObject);
}
-keep public class [实际的应用包名].R$*{
public static final int *;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

6.自定义事件统计

自定义事件也就是常说的埋点事件,当如果点击了某个按钮时将用户的这一动作记录下来,并传回给服务器,方便统计。

这里只说下计数事件

在希望跟踪的位置,调用如下方法:

1
MobclickAgent.onEvent(Context context, String eventId); // eventId 事件ID,自己定义

代码添加之后,在友盟后台需要添加事件,位置 统计分析->设置->事件,将定义的事件ID添加就可以了。

附:友盟官方文档地址

Haoyh的博客

WeChat AndResGuard使用记录

发表于 2016-08-16 |

使用wechat AndResGuard进行安装包压缩

1.clone工程到本地

工程Git地址

2.命令行方式使用

到 /tools_output目录下,将提前准备好的.apk文件复制到该目录,并重命名为input.apk.

第一次执行:./build.sh

报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
signing apk: input_signed.apk
use 7zip to repackage: input_signed_7zip.apk, will cost much more time
[addStoredFileIn7Zip]rewrite the stored file into the 7zip, file count:273
zipaligning apk: input_signed.apk
java.io.IOException: Cannot run program "zipalign": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at com.tencent.mm.androlib.ResourceApkBuilder.alignApk(ResourceApkBuilder.java:150)
at com.tencent.mm.androlib.ResourceApkBuilder.alignApk(ResourceApkBuilder.java:131)
at com.tencent.mm.androlib.ResourceApkBuilder.buildApk(ResourceApkBuilder.java:48)
at com.tencent.mm.resourceproguard.Main.buildApk(Main.java:94)
at com.tencent.mm.resourceproguard.Main.resourceProguard(Main.java:71)
at com.tencent.mm.resourceproguard.cli.CliMain.run(CliMain.java:193)
at com.tencent.mm.resourceproguard.cli.CliMain.main(CliMain.java:37)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:248)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 7 more

解决:将zipalign添加到环境变量中

添加方法

vim ~/.bash_profile

在末尾添加(路径根据实际情况修改)

1
2
export ZIPALIGN=/Users/xxx/Android/android-sdk-macosx/build-tools/21.1.2
export PATH=$PATH:$ZIPALIGN/

3.最终实现

原8.3M的安装包经过处理最后为8.1M。

Haoyh的博客

Jenkins+Gradle

发表于 2016-04-13 |

简介

自动化打包目的:使打包脱离开发人员和个人电脑;减少出错率;打包流程规范化。
需要安装的环境
JDK、Android SDK、Jenkins、Gradle、Git
本次进行环境搭建的电脑环境:OS(10.11.4)

1.环境安装

主要说下Mac下的Jenkins环境,其他环境请自行百度。
命令行执行:

1
#brew install jenkins

执行后结果:

2.按安装提示

应该是开机启动的意思,也可以不执行该命令,影响暂不清楚。
要执行的话还是在命令行运行:

1
#ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents

3.启动Jenkins

运行命令:

1
#jenkins

会输出一些信息:包括Jenkins.war所在目录等,这个时候应该就是安装并且启动成功了

4.验证启动是否真的成功了

浏览器打开:http://localhost:8080 ;
如果能看到左上角的老人头,验证已经成功启动了。

5.在Jenkins中安装插件

系统管理 > 管理插件 > 可选插件
1.gradle:Gradle plugin,对Gradle的支持;
2.Gitlab:GitLab Plugin,因为代码在由GitLab管理。
安装可能需要一些时间,成功后重启Jenkins(在启动Jenkins的命令行窗口ctrl+c,然后启动服务,并刷新浏览器)。

6.配置Jenkins中的环境变量

系统管理 > 系统设置
1.Android SDK

2.JDK

3.Git

4.Gradle

注意:路径根据具体的情况设置

7.创建工程,并配置

点击左侧新建,创建一个新的需要被构建的工程;
点击OK之后成功创建并自动跳到工程对应的配置页。
必需配置:a.被构建的工程源码配置;b.Gradle构建配置;
可选配置:c.构建后操作,如失败发送邮件;d.构建触发器等;
主要说下必需的配置:

a.被构建的工程源码配置;

源码配置:情况1.代码在电脑,没有上传到git之类的代码托管服务器;
情况2.代码在Git或者GitLab服务器中;

针对情况1 是将本地工程路径配置为自定义的工作空间
针对情况2需要配置 源码管理 > Git > Repositories

b.Gradle构建配置;

选择Gradle版本;配置Gradle命令

8.立即构建

到这里关于Jenkins及对Gradle支持相关的所有的配置就结束了,回到首页进入工程下,点击左侧的立即构建就可以开始构建了。

附:
1.grade配置信息文件:

/Users/xxx/.jenkins/hudson.plugins.gradle.Gradle.xml

2.Android Studio升级为2.0,构建时出现:

Error:Gradle version 2.10 is required. Current version is 2.4. If using the gradle wrapper, try editing the distributionUrl in ...

解决问题:Jenkins添加gradle2.10的环境,添加方式同刚才:配置Jenkins中的环境变量Gradle的配置说明
参考:http://android-er.blogspot.com/2016/04/errorgradle-version-210-is-required.html

Haoyh的博客

Hello World

发表于 2016-03-29 |

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

Haoyh的博客

Hexo+GitHub 环境配置

发表于 2016-03-04 |

1.为什么要搭建这个环境

写了2年的代码想把用到的,学习到的东西记录下来,看着csdn又不是很爽,看到那么多炫酷的个人博客,我也要拥有一个这时候已经在心里种下了种子。突然有一个看到大神stormzhang的公众号推荐了一篇文章 我为什么坚持下博客 知道了几个可以用的环境,知道了Hexo并且是大神推荐的所以就准备搭建下。

2.准备工作

准备工作一般从百度开始(无果会转到Google),结果很快搜到了一些教程和Hexo官网。电脑准备好(本教程基于Mac编写),连上网就要开始了。

3.开始搭建

找到了文档就可以很快的入手开始做了。Hexo官网,方便挑错。
先看下Hexo的介绍:

1
2
Hexo is a fast, simple and powerful blog framework. You write posts in Markdown (or
other languages) and Hexo generates static files with a beautiful theme in seconds.

到底有多好我也没玩转呢,慢慢发现吧。
a.搭建需要安装:Node.js, Git.
如果已经安装了就可以直接安装Hexo了。

1
$ npm install -g hexo // 安装hexo,如果没有权限记得sudo

c.创建工程(到你指定的任意路径下执行就可以)

1
2
3
4
5
$ hexo init blog // 创建名为:blog的工程,就是博客的根目录
```
d.生成静态页面,cd到blog目录,执行下面命令后会在public生成对应的静态页
```bash
$ hexo generate // 可以简写为:hexo g

e.启动本地服务,进行预览

1
$ hexo server

成功启动后,在浏览器输入http://localhost:4000.

4.遇到的坑

安装好了之后,怎么都提交不到git,我的解决办法是缺少安装,继续安装,

1
$ npm install hexo-deployer-git —-save // 我的一直不成功,然后安装了下这个就正常了

5.关联github

a.建立Repository 建立与你用户名对应的仓库,仓库名必须为【your_user_name.github.io】,固定写法
b.建立关联,以刚才创建的blog为例,cd到blog目录,包含的文件和目录如下图所示

c.通过修改_config.yml文件,来建立关联,命令:

1
$ vim _config.yml

到文件尾部,修改为下图所示的样子,repository修改为刚才创建的git repository名。

d.最后执行命令

1
$ hexo deploy

在浏览器中输入http://haoyh.github.io就可以了,注需要将名字改为你的。

部署步骤

1
2
3
$ hexo clean
$ hexo generate
$ hexo deploy

看到这里,还不快去试试。

Haoyh

Haoyh

学习、总结

5 日志
3 标签
© 2016 Haoyh
由 Hexo 强力驱动
主题 - NexT.Mist