Bugly - Bugly 基本使用( App 质量追踪平台)

Bugly

1、基本介绍
  1. Bugly 是腾讯推出的 App 质量追踪平台,专门帮开发者发现、定位、解决线上 App 的崩溃、卡顿等问题

    1. 官方网址:https://bugly.qq.com/v2/

    2. 开发文档:https://bugly.qq.com/docs/user-guide/instruction-manual-android/?v=1.0.0

  2. Bugly 优势在于免费、接入简单,适合中小团队快速搭建质量监控体系

2、场景实例
  1. 以前:用户反馈"点了一下就闪退了",开发者复现不了,无从下手

  2. 现在:Bugly 后台直接看到崩溃堆栈、机型、系统版本、操作路径,精准定位到某行代码

3、演示
(1)Setting
  1. 项目级 build.gradle
groovy 复制代码
android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi'
        }
    }
}

...

dependencies {
    implementation 'com.tencent.bugly:crashreport:latest.release'
}
  1. AndroidManifest.xml
xml 复制代码
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  1. proguard-rules.pro,避免混淆 Bugly

    -dontwarn com.tencent.bugly.**
    -keep public class com.tencent.bugly.**{*;}

(2)Activity
xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="MainActivity"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_simulate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="模拟一个异常"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
java 复制代码
public class MainActivity extends AppCompatActivity {

    public static final String TAG = MainActivity.class.getSimpleName();

    private final String[] permissions = {
            Manifest.permission.INTERNET,
            Manifest.permission.ACCESS_NETWORK_STATE,
            Manifest.permission.ACCESS_WIFI_STATE
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        boolean needRequest = false;
        for (String permission : permissions) {
            int re = checkSelfPermission(permission);
            Log.i(TAG, "check ---------- 权限:" + permission + ",授权结果:" + re);
            if (re != PackageManager.PERMISSION_GRANTED) {
                needRequest = true;
                break;
            }
        }

        if (!needRequest) {
            next();
            return;
        }

        ActivityResultLauncher<String[]> activityResultLauncher = registerForActivityResult(
                new ActivityResultContracts.RequestMultiplePermissions(),
                o -> {
                    for (Map.Entry<String, Boolean> stringBooleanEntry : o.entrySet()) {
                        Log.i(TAG, "request ---------- 权限:" + stringBooleanEntry.getKey() + ",授权结果:" + stringBooleanEntry.getValue());
                    }

                    for (boolean granted : o.values()) {
                        if (!granted) {
                            Toast.makeText(this, "未授权权限", Toast.LENGTH_SHORT).show();
                            finish();
                            return;
                        }
                    }

                    next();
                }
        );
        activityResultLauncher.launch(permissions);
    }

    private void next() {
        CrashReport.initCrashReport(getApplicationContext(), "【App ID】", false);

        Button btnSimulate = findViewById(R.id.btn_simulate);

        btnSimulate.setOnClickListener(v -> {
            int i = 10 / 0;
        });
    }
}
相关推荐
無a伟1 小时前
RabbitMq高级特性:TTL,死信队列,延迟队列
java·分布式·rabbitmq
长谷深风1112 小时前
Agent 跑了 30 分钟宕机,如何从断点继续?
java·大数据·人工智能·ai·大模型·memory·aiagent
慧都小妮子2 小时前
DevExpress Java 文档处理 API 免费 CTP:PDF、PowerPoint、条码与跨平台部署
java·pdf·powerpoint·devexpress·文档处理·条码生成
泡海椒2 小时前
告别反射低效:JQuick-Java ASM动态调用链性能优化实战
java·python·性能优化
土司大王2 小时前
LeetCode 17 电话号码的字母组合:Java 回溯模板、多叉决策树与复杂度分析
java·leetcode·决策树
云边有个稻草人2 小时前
飞牛 NAS 远程访问实战:星空组网连接 Mac 与安卓,从 Compose 部署到 5G 验证
android·5g·macos
CoderYanger2 小时前
前端基础——JavaScript(WebAPI)代码案例
java·开发语言·前端·javascript·css·前端框架·html5
聚美智数2 小时前
手机号归属地-手机号归属地查询-手机归属地-运营商归属地
android·智能手机
恋猫de小郭2 小时前
Shopify 从 React Native 回到 Swift/Kotlin,但是你以为有手就行??
android·前端·ios
Nuanyt2 小时前
JUC常见核心知识梳理02 AQS ReentrantLock CAS 原子类 线程池
java