0%

快速移除开源软件中基于electron-google-analytics的统计功能

一些作者会喜欢在自家的软件里加上使用统计功能(usage analytics),以便于收集用户使用习惯等,用于改进软件。虽说统计模块确实能通过统计数据帮助作者做出决策,而且很多软件作者都在这么做(比如微软),但笔者从心里抗拒这种方式,所以看到“遥测”、“用户体验改善计划”等字眼就会想办法关掉这类功能。如果只是单纯的用户找bug的离线统计,并且默认离线存储那倒还好,但事实上绝大多数软件都会默认设置定期把统计结果发回自己的服务器,甚至有的没法关闭这个功能。好在如果软件开源,我们可以直接修改代码,把统计功能拔了。
相比于大公司的大项目(如vscode),个人作者的软件所的使用统计功能则有很多种样子。本文所述的项目则是使用electron-google-analytics,通过Google Analytics来收集统计数据。而对于这种项目,我们可以通过构造一个无任何联网行为的Analytics类,并将源码中导入electron-google-analytics的地方修改为导入我们构造好的Analytics类来达成屏蔽统计功能的效果。

  • 第一步,我们先根据electron-google-analytics的代码构造一个空的Analytics类:
    fake-ga.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    // Fake Google-Analytics component
    class Analytics {
    constructor(trackingID, {
    userAgent = '',
    debug = false,
    version = 1
    } = {}) {
    this.foo={};
    }

    set(key, value) {

    }

    pageview(hostname, url, title, clientID, sessDuration) {
    }

    event(evCategory, evAction, { evLabel, evValue, clientID } = {}) {
    }

    screen(appName, appVer, appID, appInstallerID, screenName, clientID) {

    }

    transaction(trnID, {
    trnAffil, trnRev, trnShip, trnTax, currCode
    } = {}, clientID) {

    }

    social(socialAction, socialNetwork, socialTarget, clientID) {

    }

    exception(exDesc, exFatal, clientID) {

    }

    refund(trnID, evCategory = 'Ecommerce', evAction = 'Refund', nonInteraction = 1, { prdID, prdQty } = {}, clientID) {

    }

    purchase(hostname, url, title, transactionID, {
    trnAffil, trnRev, trnTax, trnShip, trnCoupon,
    prdID, prdName, prdCtg, prdBrand, prdVar, prdPos
    } = {}, clientID) {

    }

    checkout(hostname, url, title, checkoutStep, checkoutOpt, {
    prdID, prdName, prdCtg, prdBrand, prdVar, prdPrice, prdQty
    } = {}, clientID) {

    }

    checkoutOpt(evCategory, evAction, checkoutStep, checkoutOpt, clientID) {

    }

    promoImp(hostname, url, title, {
    promoID, promoName, promoCrt, promoPos
    } = {}, clientID) {

    }

    promoCk(evCategory, evAction, {
    evLabel, promoID, promoName, promoCrt, promoPos
    } = {}, clientID) {

    }

    item(trnID, itemName, {
    itemPrice, itemQty, itemSku, itemVariation, currCode
    } = {}, clientID) {

    }

    timingTrk(timingCtg, timingVar, timingTime, {
    timingLbl, dns, pageDownTime, redirTime, tcpConnTime, serverResTime
    } = {}, clientID) {

    }

    send(hitType, params, clientID) {

    }
    }

    export default Analytics;
  • 第二步,我们将源码中导入electron-google-analytics的地方改为导入我们构造好的组件:

    1
    2
    //import Analytics from "electron-google-analytics";
    import Analytics from "./fake-ga.js";
  • 第三步,测试修改

    1
    2
    yarn
    yarn test
  • 如果软件不再连接谷歌服务器(1e100.net),则可以编译后放心使用了

Example: https://github.com/bigbenzh/koodo-reader

感谢你看到这里❤