Only enable telemetry in Mihon production apps (mihonapp/mihon#1976)

(cherry picked from commit 5e029b1fe6838da90fc95009a0f675b59e6f04fd)
This commit is contained in:
AntsyLich 2025-04-08 02:07:15 +06:00 committed by Cuong-Tran
parent f685e6d5fc
commit 62beeb4192
No known key found for this signature in database
GPG key ID: 733AA7624B9315C2
3 changed files with 70 additions and 5 deletions

View file

@ -0,0 +1,46 @@
package mihon.telemetry
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.content.pm.Signature
import android.os.Build
import java.security.MessageDigest
internal fun PackageInfo.getCertificateFingerprints(): List<String> {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
val signingInfo = signingInfo!!
if (signingInfo.hasMultipleSigners()) {
signingInfo.apkContentsSigners
} else {
signingInfo.signingCertificateHistory
}
} else {
@Suppress("DEPRECATION")
signatures
}
?.map(Signature::getCertificateFingerprint)
?.toList()
?: emptyList()
}
internal val SignatureFlags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
PackageManager.GET_SIGNING_CERTIFICATES
} else {
@Suppress("DEPRECATION")
PackageManager.GET_SIGNATURES
}
@OptIn(ExperimentalStdlibApi::class)
private val CertificateFingerprintHexFormat = HexFormat {
upperCase = true
bytes {
byteSeparator = ":"
}
}
@OptIn(ExperimentalStdlibApi::class)
private fun Signature.getCertificateFingerprint(): String {
return MessageDigest.getInstance("SHA-256")
.digest(toByteArray())
.toHexString(CertificateFingerprintHexFormat)
}

View file

@ -6,25 +6,40 @@ import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.crashlytics.FirebaseCrashlytics
object TelemetryConfig { object TelemetryConfig {
private lateinit var analytics: FirebaseAnalytics private var analytics: FirebaseAnalytics? = null
private lateinit var crashlytics: FirebaseCrashlytics private var crashlytics: FirebaseCrashlytics? = null
fun init(context: Context, isPreviewBuildType: Boolean, commitCount: String) { fun init(context: Context, isPreviewBuildType: Boolean, commitCount: String) {
// To stop forks/test builds from polluting our data
if (!context.isMihonProductionApp()) return
analytics = FirebaseAnalytics.getInstance(context) analytics = FirebaseAnalytics.getInstance(context)
FirebaseApp.initializeApp(context) FirebaseApp.initializeApp(context)
crashlytics = FirebaseCrashlytics.getInstance() crashlytics = FirebaseCrashlytics.getInstance()
// KMK --> // KMK -->
if (isPreviewBuildType) { if (isPreviewBuildType) {
analytics.setUserProperty("preview_version", commitCount) analytics?.setUserProperty("preview_version", commitCount)
} }
// KMK <-- // KMK <--
} }
fun setAnalyticsEnabled(enabled: Boolean) { fun setAnalyticsEnabled(enabled: Boolean) {
analytics.setAnalyticsCollectionEnabled(enabled) analytics?.setAnalyticsCollectionEnabled(enabled)
} }
fun setCrashlyticsEnabled(enabled: Boolean) { fun setCrashlyticsEnabled(enabled: Boolean) {
crashlytics.isCrashlyticsCollectionEnabled = enabled crashlytics?.isCrashlyticsCollectionEnabled = enabled
}
private fun Context.isMihonProductionApp(): Boolean {
if (packageName !in MIHON_PACKAGES) return false
return packageManager.getPackageInfo(packageName, SignatureFlags)
.getCertificateFingerprints()
.any { it == MIHON_CERTIFICATE_FINGERPRINT }
} }
} }
private val MIHON_PACKAGES = hashSetOf("app.komikku", "app.komikku.beta")
private const val MIHON_CERTIFICATE_FINGERPRINT =
"CB:EC:12:1A:A8:2E:BB:02:AA:A7:38:06:99:2E:03:68:A9:7D:47:B5:45:1E:D6:52:48:16:D0:30:84:C4:59:05"

View file

@ -2,6 +2,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- Remove unnecessary permissions from Firebase dependency --> <!-- Remove unnecessary permissions from Firebase dependency -->
<uses-permission <uses-permission
android:name="android.permission.ACCESS_ADSERVICES_AD_ID" android:name="android.permission.ACCESS_ADSERVICES_AD_ID"