bugly的异常报告,统计与升级

1.首先,自定义Application继承TinkerApplication,添加构造方法,代码如下:

public class MyAppliction extends TinkerApplication {

public MyAppliction() {

super(ShareConstants.TINKER_ENABLE_ALL,"com.lml.hotfix.activity.myhoxfixhello.MyApplicationLike",

"com.tencent.tinker.loader.TinkerLoader", false);

}

}


super中的第二个参数为Application的代理类,在MyApplication中不进行处理,把处理的操作都放入到MyApplicationLike中。

2.实现MyApplicationLike类,继承DefaultApplicationLike类,把原先对Application的配置都放入此类中代码如下:

public class MyApplicationLike extends DefaultApplicationLike {

public MyApplication Like(Application application, int tinkerFlags,

boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime,

long applicationStartMillisTime,Intent tinkerResultIntent) {

super(application,tinkerFlags,tinkerLoadVerifyFlag,applicationStartElapsedTime,applicationStartMillisTime,tinkerResultIntent);

}

@Override

public void onCreate() {

super.onCreate();

//这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId

//调试时,将第三个参数改为true

CrashReport.UserStrategy strategy =newCrashReport.UserStrategy(getApplication());

strategy.setAppChannel("ceshi");//打包后使用的渠道号

strategy.setAppVersion("4.0");

strategy.setAppPackageName("com.lml.hotfix.activity.myhoxfixhello");

Beta.autoCheckUpgrade=true;

Bugly.init(getApplication(),"填入appid", false,strategy);

}

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)

@Override

public void onBaseContextAttached(Context base) {

super.onBaseContextAttached(base);

// you must install multiDex whatever tinker is installed!

MultiDex.install(base);

//安装tinker

// TinkerManager.installTinker(this);替换成下面Bugly提供的方法

Beta.installTinker(this);

}

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)

public void registerActivityLifecycleCallback(Application.ActivityLifecycleCallbacks callbacks) {

getApplication().registerActivityLifecycleCallbacks(callbacks);

}

}

CrashReport.UserStrategy 类是对版本信息的一些处理,setAppVersion 统计信息的版本号,记得填入Appid,此值为关联到bugly后台。

3.添加Activity测试类。MainActivity代码如下:

public class MainActivity extends AppCompatActivity {

private String text=null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

((TextView)findViewById(R.id.tv_info)).setText("first:当前版本号versionName为:"+ BuildConfig.VERSION_NAME);

findViewById(R.id.btn_throw).setOnClickListener(newView.OnClickListener() {

@Override

public void onClick(View v) {

//AlertDialog.Builder builder =newAlertDialog.Builder(MainActivity.this);

//builder.setTitle("haha");

//builder.show();

 Log.i("1",text.toString());

}

});

}

}

当点击此按钮时,程序会抛出异常。用于测试热更新。

4.在清单文件中添加权限,添加Application和Activity:


不要忘了bugly自带的BetaActivity的注册。

5.在app下的gradle的配置

defaultConfig {

applicationId"com.lml.hotfix.activity.myhoxfixhello"

minSdkVersion15

targetSdkVersion25

versionCode10

versionName"5.0"

testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"

ndk {

//设置支持的SO库架构

abiFilters'armeabi'//, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'

}

multiDexEnabledtrue

}


加入ndk支持so包。

dependencies {

compile'com.android.support:multidex:1.0.1'

compile'com.tencent.bugly:crashreport_upgrade:latest.release'

//其中latest.release指代最新版本号,也可以指定明确的版本号,例如1.2.0

compile'com.tencent.bugly:nativecrashreport:latest.release'

//其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.2.

}

在dependencies中添加上面依赖。

6.新建tinker-support.gradle类,代码如下:

apply plugin:'com.tencent.bugly.tinker-support'

def bakPath = file("${buildDir}/bakApk/")

/**

*此处填写每次构建生成的基准包目录

*/

def baseApkDir ="123456"

/**

*对于插件各参数的详细解析请参考

*/

tinkerSupport {

//开启tinker-support插件,默认值true

enable =true

//指定归档目录,默认值当前module的子目录tinker

autoBackupApkDir ="${bakPath}"

//是否启用覆盖tinkerPatch配置功能,默认值false

//开启后tinkerPatch配置不生效,即无需添加tinkerPatch

overrideTinkerPatchConfiguration =true

//编译补丁包时,必需指定基线版本的apk,默认值为空

//如果为空,则表示不是进行补丁包的编译

// @{link tinkerPatch.oldApk }

baseApk ="${bakPath}/${baseApkDir}/app-release.apk"

//对应tinker插件applyMapping

baseApkProguardMapping ="${bakPath}/${baseApkDir}/app-release-mapping.txt"

//对应tinker插件applyResourceMapping

baseApkResourceMapping ="${bakPath}/${baseApkDir}/app-release-R.txt"

tinkerId ="4.0.0-base"

//    buildAllFlavorsDir = "${bakPath}/${baseApkDir}"

enableProxyApplication =false

}

/**

*一般来说,我们无需对下面的参数做任何的修改

*对于各参数的详细介绍请参考:

* https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97

*/

tinkerPatch {

//oldApk ="${bakPath}/${appName}/app-release.apk"

ignoreWarning =false

useSign =true

dex {

dexMode ="jar"

pattern = ["classes*.dex"]

loader = []

}

lib {

pattern = ["lib/*/*.so"]

}

res {

pattern = ["res/*","r/*","assets/*","resources.arsc","AndroidManifest.xml"]

ignoreChange = []

largeModSize =100

}

packageConfig {

}

sevenZip {

zipArtifact ="com.tencent.mm:SevenZip:1.1.10"

//        path = "/usr/local/bin/7za"

}

buildConfig {

keepDexApply =false

//tinkerId = "1.0.1-patch"

//applyMapping = "${bakPath}/${appName}/app-release-mapping.txt" //可选,设置mapping文件,建议保持旧apk的proguard混淆方式

//applyResourceMapping = "${bakPath}/${appName}/app-release-R.txt" //可选,设置R.txt文件,通过旧apk文件保持ResId的分配

}

}

加粗字体稍后编译有用。在app下的gradle中添加集成tinker-support.gradle。


7.在项目的gradle下添加如下代码:

classpath"com.tencent.bugly:tinker-support:1.0.8"

8.添加混淆规则:

-dontwarncom.tencent.bugly.**

-keeppublic class com.tencent.bugly.**{*;}

-keepclass android.support.**{*;}

9.项目配置完成,现开始生成基准包:

现设置tinkerId ="4.0.0-base",加黑为版本号,自定义。


点击ide右侧的gradle,再点击assembleRelease,生成基准包:


如要使用热更新,需要原先apk集成了bugly的SDK,上面圈处的即是。

可先在手机上安装此Apk。

修改Activity代码:

AlertDialog.Builder builder =newAlertDialog.Builder(MainActivity.this);

builder.setTitle("haha");

builder.show();

//                Log.i("1",text.toString());

接着生成补丁包,需要修改两处tinker-support.gradle。

1.def baseApkDir ="123456"  此为生成基准包所在的文件夹名,上面的话,即为“app-0706-17-20-03”

2.tinkerId ="4.0.0-base" 把base修改问patch


然后会在会在项目目录下出现补丁包:


10.发布补丁:

在热更新上发布补丁。

11.测试:

先安装好基准包,点击按钮是app崩溃。等发布补丁后,稍等一会,系统bug修复,展示AlertDialog。崩溃信息也可在bugly后台查看,也可查看用户使用信息。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容