simplify apk signing in CI

update dependency
upload only release build to Telegram in CI
This commit is contained in:
BinTianqi
2024-08-06 16:39:55 +08:00
parent b908a50686
commit c570296e2d
10 changed files with 29 additions and 72 deletions

View File

@@ -41,17 +41,10 @@ jobs:
name: OwnDroid-CI-${{ env.SHORT_SHA }}-release-testkey name: OwnDroid-CI-${{ env.SHORT_SHA }}-release-testkey
path: app/build/outputs/apk/release/app-release.apk path: app/build/outputs/apk/release/app-release.apk
- name: Export key
env:
KEY_BASE64: ${{ secrets.KEY_BASE64 }}
run: echo "$KEY_BASE64" | base64 --decode - > app/signature.jks
- name: Build APK - name: Build APK
env: run: |
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} echo "${{ secrets.KEY_BASE64 }}" | base64 --decode - > app/release.jks
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} ./gradlew build -PStoreFile="$(pwd)/app/release.jks" -PStorePassword="${{ secrets.KEYSTORE_PASSWORD }}" -PKeyPassword="${{ secrets.KEY_PASSWORD }}" -PKeyAlias="${{ secrets.KEY_ALIAS }}"
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
run: ./gradlew build
- name: Upload Debug APK - name: Upload Debug APK
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
@@ -77,7 +70,7 @@ jobs:
with: with:
path: artifacts path: artifacts
- name: Download telegram-bot-api-binary - name: Download telegram-bot-api
run: | run: |
mkdir ./binaries mkdir ./binaries
wget "https://github.com/jakbin/telegram-bot-api-binary/releases/download/latest/telegram-bot-api" -O ./binaries/telegram-bot-api wget "https://github.com/jakbin/telegram-bot-api-binary/releases/download/latest/telegram-bot-api" -O ./binaries/telegram-bot-api
@@ -86,27 +79,18 @@ jobs:
- name: Start API Server & Upload - name: Start API Server & Upload
env: env:
COMMIT_MESSAGE: |+ COMMIT_MESSAGE: |+
New push to GitHub\! ${{ github.event.head_commit.message }}\n
``` [See commit detail here](${{ github.event.head_commit.url }})
${{ github.event.head_commit.message }}
```by `${{ github.event.head_commit.author.name }}`
See commit detail [here](${{ github.event.head_commit.url }})
COMMIT_URL: ${{ github.event.head_commit.url }} COMMIT_URL: ${{ github.event.head_commit.url }}
run: | run: |
ESCAPED=`python3 -c 'import json,os,urllib.parse; msg = json.dumps(os.environ["COMMIT_MESSAGE"]); print(urllib.parse.quote(msg if len(msg) <= 1024 else json.dumps(os.environ["COMMIT_URL"])))'` ESCAPED=`python3 -c 'import json,os,urllib.parse; msg = json.dumps(os.environ["COMMIT_MESSAGE"]); print(urllib.parse.quote(msg if len(msg) <= 1024 else json.dumps(os.environ["COMMIT_URL"])))'`
cd artifacts cd artifacts
export DEBUG_TEST_PWD=$(find . -name "*-debug-testkey*")
mv ./$DEBUG_TEST_PWD/app-debug.apk ./$DEBUG_TEST_PWD.apk && rm -rf ./$DEBUG_TEST_PWD
export RELEASE_TEST_PWD=$(find . -name "*release-testkey*") export RELEASE_TEST_PWD=$(find . -name "*release-testkey*")
mv ./$RELEASE_TEST_PWD/app-release.apk ./$RELEASE_TEST_PWD.apk && rm -rf ./$RELEASE_TEST_PWD mv ./$RELEASE_TEST_PWD/app-release.apk ./$RELEASE_TEST_PWD.apk && rm -rf ./$RELEASE_TEST_PWD
export DEBUG_SIGNED_PWD=$(find . -name "*-debug-signed*")
mv ./$DEBUG_SIGNED_PWD/app-debug.apk ./$DEBUG_SIGNED_PWD.apk && rm -rf ./$DEBUG_SIGNED_PWD
export RELEASE_SIGNED_PWD=$(find . -name "*release-signed*") export RELEASE_SIGNED_PWD=$(find . -name "*release-signed*")
mv ./$RELEASE_SIGNED_PWD/app-release.apk ./$RELEASE_SIGNED_PWD.apk && rm -rf ./$RELEASE_SIGNED_PWD mv ./$RELEASE_SIGNED_PWD/app-release.apk ./$RELEASE_SIGNED_PWD.apk && rm -rf ./$RELEASE_SIGNED_PWD
../binaries/telegram-bot-api --api-id=${{ secrets.TELEGRAM_API_APP_ID }} --api-hash=${{ secrets.TELEGRAM_API_HASH }} --local 2>&1 > /dev/null & ../binaries/telegram-bot-api --api-id=${{ secrets.TELEGRAM_API_APP_ID }} --api-hash=${{ secrets.TELEGRAM_API_HASH }} --local 2>&1 > /dev/null &
export token=${{ secrets.TELEGRAM_BOT_KEY }} export token=${{ secrets.TELEGRAM_BOT_KEY }}
curl -v "http://127.0.0.1:8081/bot$token/sendMediaGroup?chat_id=-1002216379163&media=%5B%7B%22type%22%3A%22document%22%2C%22media%22%3A%22attach%3A%2F%2FdebugTest%22%7D%2C%7B%22type%22%3A%22document%22%2C%22media%22%3A%22attach%3A%2F%2FreleaseTest%22%7D%2C%7B%22type%22%3A%22document%22%2C%22media%22%3A%22attach%3A%2F%2FdebugSigned%22%7D%2C%7B%22type%22%3A%22document%22%2C%22media%22%3A%22attach%3A%2F%2FreleaseSigned%22%2C%22parse_mode%22%3A%22MarkdownV2%22%2C%22caption%22%3A${ESCAPED}%7D%5D" \ curl -v "http://127.0.0.1:8081/bot$token/sendMediaGroup?chat_id=-1002216379163&media=%5B%7B%22type%22%3A%22document%22%2C%22media%22%3A%22attach%3A%2F%2FdebugTest%22%7D%2C%7B%22type%22%3A%22document%22%2C%22media%22%3A%22attach%3A%2F%2FreleaseTest%22%7D%2C%7B%22type%22%3A%22document%22%2C%22media%22%3A%22attach%3A%2F%2FdebugSigned%22%7D%2C%7B%22type%22%3A%22document%22%2C%22media%22%3A%22attach%3A%2F%2FreleaseSigned%22%2C%22parse_mode%22%3A%22MarkdownV2%22%2C%22caption%22%3A${ESCAPED}%7D%5D" \
-F debugTest="@$DEBUG_TEST_PWD.apk" \
-F releaseTest="@$RELEASE_TEST_PWD.apk" \ -F releaseTest="@$RELEASE_TEST_PWD.apk" \
-F debugSigned="@$DEBUG_SIGNED_PWD.apk" \
-F releaseSigned="@$RELEASE_SIGNED_PWD.apk" -F releaseSigned="@$RELEASE_SIGNED_PWD.apk"

1
.gitignore vendored
View File

@@ -10,5 +10,4 @@ captures
app/build app/build
app/release app/release
app/debug app/debug
app/signature.jks
.androidide .androidide

View File

@@ -4,17 +4,13 @@ plugins {
alias(libs.plugins.cc) alias(libs.plugins.cc)
} }
var keyPassword: String? = null
var keystorePassword: String? = null
var keyAlias: String? = null
android { android {
signingConfigs { signingConfigs {
create("defaultSignature") { create("defaultSignature") {
storeFile = file("signature.jks") storeFile = file(project.findProperty("StoreFile") ?: "testkey.jks")
storePassword = System.getenv("KEYSTORE_PASSWORD") ?: "testkey" storePassword = (project.findProperty("StorePassword") as String?) ?: "testkey"
keyPassword = System.getenv("KEY_PASSWORD") ?: "testkey" keyPassword = (project.findProperty("KeyPassword") as String?) ?: "testkey"
keyAlias = System.getenv("KEY_ALIAS") ?: "testkey" keyAlias = (project.findProperty("KeyAlias") as String?) ?: "testkey"
} }
} }
namespace = "com.bintianqi.owndroid" namespace = "com.bintianqi.owndroid"
@@ -27,8 +23,8 @@ android {
applicationId = "com.bintianqi.owndroid" applicationId = "com.bintianqi.owndroid"
minSdk = 21 minSdk = 21
targetSdk = 34 targetSdk = 34
versionCode = 31 versionCode = 32
versionName = "5.6" versionName = "6.0"
multiDexEnabled = false multiDexEnabled = false
} }
@@ -77,26 +73,6 @@ gradle.taskGraph.whenReady {
project.tasks.findByPath(":app:lintAnalyzeDebug")?.enabled = false project.tasks.findByPath(":app:lintAnalyzeDebug")?.enabled = false
} }
tasks.findByName("preBuild")?.dependsOn?.plusAssign("prepareSignature")
tasks.register("prepareSignature") {
doFirst {
file("signature.jks").let {
if(!it.exists()) file("testkey.jks").copyTo(it)
}
}
}
tasks.findByName("clean")?.dependsOn?.plusAssign("cleanKey")
tasks.register("cleanKey") {
doFirst {
file("signature.jks").let {
if(it.exists()) it.delete()
}
}
}
dependencies { dependencies {
implementation(libs.androidx.activity.compose) implementation(libs.androidx.activity.compose)
implementation(libs.androidx.ui) implementation(libs.androidx.ui)

View File

@@ -36,7 +36,7 @@ import kotlinx.coroutines.withContext
import java.io.FileInputStream import java.io.FileInputStream
class InstallAppActivity: FragmentActivity() { class InstallAppActivity: FragmentActivity() {
override fun onNewIntent(intent: Intent?) { override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent) super.onNewIntent(intent)
this.intent = intent this.intent = intent
} }

View File

@@ -82,7 +82,7 @@ class StopLockTaskModeReceiver: BroadcastReceiver() {
val packages = dpm.getLockTaskPackages(receiver) val packages = dpm.getLockTaskPackages(receiver)
dpm.setLockTaskPackages(receiver, arrayOf()) dpm.setLockTaskPackages(receiver, arrayOf())
dpm.setLockTaskPackages(receiver, packages) dpm.setLockTaskPackages(receiver, packages)
val nm = context.getSystemService(ComponentActivity.NOTIFICATION_SERVICE) as NotificationManager val nm = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
nm.cancel(1) nm.cancel(1)
} }
} }

View File

@@ -86,7 +86,7 @@ fun registerActivityResult(context: ComponentActivity){
} }
createManagedProfile = context.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {} createManagedProfile = context.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {}
addDeviceAdmin = context.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { addDeviceAdmin = context.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
val dpm = context.applicationContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val dpm = context.applicationContext.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
if(dpm.isAdminActive(ComponentName(context.applicationContext, Receiver::class.java))){ if(dpm.isAdminActive(ComponentName(context.applicationContext, Receiver::class.java))){
backToHomeStateFlow.value = true backToHomeStateFlow.value = true
} }

View File

@@ -12,8 +12,6 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageInstaller import android.content.pm.PackageInstaller
import android.os.Build.VERSION import android.os.Build.VERSION
import androidx.activity.ComponentActivity.CONTEXT_IGNORE_SECURITY
import androidx.activity.ComponentActivity.DEVICE_POLICY_SERVICE
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.annotation.StringRes import androidx.annotation.StringRes
@@ -34,7 +32,7 @@ lateinit var addDeviceAdmin: ActivityResultLauncher<Intent>
val Context.isDeviceOwner: Boolean val Context.isDeviceOwner: Boolean
get() { get() {
val sharedPref = getSharedPreferences("data", Context.MODE_PRIVATE) val sharedPref = getSharedPreferences("data", Context.MODE_PRIVATE)
val dpm = getSystemService(DEVICE_POLICY_SERVICE) as DevicePolicyManager val dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
return dpm.isDeviceOwnerApp( return dpm.isDeviceOwnerApp(
if(sharedPref.getBoolean("dhizuku", false)) { if(sharedPref.getBoolean("dhizuku", false)) {
Dhizuku.getOwnerPackageName() Dhizuku.getOwnerPackageName()
@@ -46,7 +44,7 @@ val Context.isDeviceOwner: Boolean
val Context.isProfileOwner: Boolean val Context.isProfileOwner: Boolean
get() { get() {
val dpm = getSystemService(DEVICE_POLICY_SERVICE) as DevicePolicyManager val dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
return dpm.isProfileOwnerApp("com.bintianqi.owndroid") return dpm.isProfileOwnerApp("com.bintianqi.owndroid")
} }
@@ -90,8 +88,8 @@ fun installPackage(context: Context, inputStream: InputStream) {
@SuppressLint("PrivateApi") @SuppressLint("PrivateApi")
fun binderWrapperDevicePolicyManager(appContext: Context): DevicePolicyManager? { fun binderWrapperDevicePolicyManager(appContext: Context): DevicePolicyManager? {
try { try {
val context = appContext.createPackageContext(Dhizuku.getOwnerComponent().packageName, CONTEXT_IGNORE_SECURITY) val context = appContext.createPackageContext(Dhizuku.getOwnerComponent().packageName, Context.CONTEXT_IGNORE_SECURITY)
val manager = context.getSystemService(DEVICE_POLICY_SERVICE) as DevicePolicyManager val manager = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val field = manager.javaClass.getDeclaredField("mService") val field = manager.javaClass.getDeclaredField("mService")
field.isAccessible = true field.isAccessible = true
val oldInterface = field[manager] as IDevicePolicyManager val oldInterface = field[manager] as IDevicePolicyManager
@@ -113,11 +111,11 @@ fun Context.getDPM(): DevicePolicyManager {
if (!Dhizuku.isPermissionGranted()) { if (!Dhizuku.isPermissionGranted()) {
dhizukuErrorStatus.value = 2 dhizukuErrorStatus.value = 2
backToHomeStateFlow.value = true backToHomeStateFlow.value = true
return this.getSystemService(DEVICE_POLICY_SERVICE) as DevicePolicyManager return this.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
} }
return binderWrapperDevicePolicyManager(this) ?: this.getSystemService(DEVICE_POLICY_SERVICE) as DevicePolicyManager return binderWrapperDevicePolicyManager(this) ?: this.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
} else { } else {
return this.getSystemService(DEVICE_POLICY_SERVICE) as DevicePolicyManager return this.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
} }
} }

View File

@@ -15,6 +15,7 @@ import android.app.admin.DevicePolicyManager.WIFI_SECURITY_PERSONAL
import android.app.admin.WifiSsidPolicy import android.app.admin.WifiSsidPolicy
import android.app.admin.WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_ALLOWLIST import android.app.admin.WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_ALLOWLIST
import android.app.admin.WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_DENYLIST import android.app.admin.WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_DENYLIST
import android.content.Context
import android.net.ProxyInfo import android.net.ProxyInfo
import android.net.Uri import android.net.Uri
import android.net.wifi.WifiSsid import android.net.wifi.WifiSsid
@@ -750,7 +751,7 @@ private fun APN() {
RadioButtonItem("PAP/CHAP", selectedAuthType == AUTH_TYPE_PAP_OR_CHAP, { selectedAuthType = AUTH_TYPE_PAP_OR_CHAP }) RadioButtonItem("PAP/CHAP", selectedAuthType == AUTH_TYPE_PAP_OR_CHAP, { selectedAuthType = AUTH_TYPE_PAP_OR_CHAP })
if(VERSION.SDK_INT>=29) { if(VERSION.SDK_INT>=29) {
val ts = context.getSystemService(ComponentActivity.TELEPHONY_SERVICE) as TelephonyManager val ts = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
carrierId = ts.simCarrierId.toString() carrierId = ts.simCarrierId.toString()
Text(text = "CarrierID", style = typography.titleLarge) Text(text = "CarrierID", style = typography.titleLarge)
TextField( TextField(

View File

@@ -1330,7 +1330,7 @@ fun InstallSystemUpdate() {
@SuppressLint("NewApi") @SuppressLint("NewApi")
private fun sendStopLockTaskNotification(context: Context) { private fun sendStopLockTaskNotification(context: Context) {
val nm = context.getSystemService(ComponentActivity.NOTIFICATION_SERVICE) as NotificationManager val nm = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (VERSION.SDK_INT >= 26) { if (VERSION.SDK_INT >= 26) {
val channel = NotificationChannel("LockTaskMode", context.getString(R.string.lock_task_mode), NotificationManager.IMPORTANCE_HIGH).apply { val channel = NotificationChannel("LockTaskMode", context.getString(R.string.lock_task_mode), NotificationManager.IMPORTANCE_HIGH).apply {
description = "Notification channel for stop lock task mode" description = "Notification channel for stop lock task mode"

View File

@@ -1,9 +1,8 @@
[versions] [versions]
agp = "8.5.0" agp = "8.5.0"
kt-android = "2.0.0" kotlin = "2.0.0"
cc = "2.0.0"
androidx-activity-compose = "1.8.2" androidx-activity-compose = "1.9.0"
navigation-compose = "2.7.7" navigation-compose = "2.7.7"
material3 = "1.2.1" material3 = "1.2.1"
accompanist-drawablepainter = "0.35.0-alpha" accompanist-drawablepainter = "0.35.0-alpha"
@@ -31,5 +30,5 @@ androidx-fragment = { group = "androidx.fragment", name = "fragment", version.re
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kt-android" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
cc = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "cc" } cc = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }