Releases: solrudev/Ackpine
0.9.4
0.9.3
Dependencies
- Updated KSP to 2.0.21-1.0.28.
- Updated Android Gradle Plugin to 8.7.3.
- Updated
apksig
to 8.7.3. - Updated
binary-compatibility-validator
to 0.17.0. - Updated
androidx.navigation
to 2.8.5 (sample apps dependency). - Updated Guava to 33.4.0-android (sample apps dependency).
Bug fixes and improvements
- Raise
compileSdk
to 35. - Use random access when parsing APK on API level 26+ in
Apk.fromUri()
. This greatly improves performance for large APKs. - Add
ZippedFileProvider.getUriForZipEntry()
overloads forFile
andUri
. - Raise
targetSdk
for sample apps to 35. - Proper support for edge-to-edge display in sample apps.
Public API changes
- Added
getUriForZipEntry(File, String)
andgetUriForZipEntry(Uri, String)
toZippedFileProvider.Companion
and as staticZippedFileProvider
methods.
0.9.2
Bug fixes and improvements
- Fix
SESSION_BASED
installer session completing with "Install permission denied" failure when performing a self-update if install permission was not granted because it was unnecessary.
0.9.1
Bug fixes and improvements
- Proper support of dynamic features for split APKs (#95).
- Add documentation for
Apk
properties.
Public API changes
- Added
Apk.ConfigSplit
sealed interface inackpine-splits
module. - Added
configForSplit
property toApk.Libs
,Apk.ScreenDensity
andApk.Localization
inackpine-splits
module.
0.9.0
Dependencies
- Updated Dokka to 2.0.0-Beta.
- Updated Gradle wrapper to 8.11.1.
Bug fixes and improvements
-
Introduce
InstallPreapproval
API. See documentation on usage. -
Introduce
InstallConstraints
API. See documentation on usage. -
Add
requestUpdateOwnership
option for install sessions. PermissionENFORCE_UPDATE_OWNERSHIP
was added toAndroidManifest.xml
. -
Add
packageSource
option for install sessions. -
Add
dontKillApp
option for install sessions withInheritExisting
install mode. -
Source-incompatible: deprecate
SessionResult
and returnSession.State.Completed
fromSession.await()
.SessionResult
was an early design leftover which was mistakenly overlooked. Now it's finally been dealt with.To migrate, change
SessionResult.Success
toSession.State.Succeeded
, andSessionResult.Error
toSession.State.Failed
.cause
property ofSessionResult.Error
is replaced withfailure
property ofSession.State.Failed
.// Old when (val result = session.await()) { is SessionResult.Success -> println("Success") is SessionResult.Error -> println(result.cause.message) } // New when (val result = session.await()) { Session.State.Succeeded -> println("Success") is Session.State.Failed -> println(result.failure.message) }
-
Source-incompatible:
when
matches onInstallFailure
andUninstallFailure
type are no longer exhaustive.This change was made to guard against possible additions of failure types in future Android versions, like
Timeout
in Android 14. -
Fix session not launching after process restart if it was in the midst of preparations.
-
Show notification for
SESSION_BASED
install sessions whenDEFERRED
confirmation is set only if user action is actually required. -
Fix possible races when
ListenableFutures
returned fromgetSessionsAsync()
andgetActiveSessionsAsync()
might not get completed. -
Lower API level required for
READ_EXTERNAL_STORAGE
permission in sample apps. -
Add
sample-api34
sample project. -
Add "Building" section to documentation.
Public API changes
- Source-incompatible:
Session.await()
now returnsSession.State.Completed
. Overload returningSessionResult
is left for binary compatibility, but will be removed in the next minor version. - Source-incompatible:
when
matches onInstallFailure
andUninstallFailure
type are no longer exhaustive. - Deprecated:
SessionResult
is deprecated and will be removed in the next minor version. - Added
InstallPreapproval
class and related APIs toInstallParameters
,InstallParameters.Builder
andInstallParametersDsl
. - Added
InstallConstraints
class and related APIs toInstallParameters
,InstallParameters.Builder
andInstallParametersDsl
. - Added
dontKillApp
boolean property toInstallMode.InheritExisting
. - Added
requestUpdateOwnership
property toInstallParameters
,InstallParameters.Builder
andInstallParametersDsl
. - Added
PackageSource
class and related APIs toInstallParameters
,InstallParameters.Builder
andInstallParametersDsl
.
0.8.3
Bug fixes and improvements
- Return
Aborted
failure whenINTENT_BASED
install session is cancelled. - Return
Aborted
failure when uninstall viaACTION_UNINSTALL_PACKAGE
is cancelled. - Request permissions if they're not granted when sample apps are launched via
ACTION_VIEW
intent.
0.8.2
Bug fixes and improvements
- Fix introduced in 0.8.1 repeated install confirmation after granting install permission if confirmation was dismissed by clicking outside of confirmation dialog on some OS versions.
- Don't use
requireUserAction
option in samples as it's unstable with different vendors and OS versions.
0.8.1
Dependencies
- Updated Kotlin to 2.0.21.
- Updated
androidx.annotation
to 1.9.1. - Updated
androidx.activity
to 1.9.3 (sample apps dependency). - Updated
androidx.constraintlayout
to 2.2.0 (sample apps dependency). - Updated
androidx.lifecycle
to 2.8.7 (sample apps dependency). - Updated
androidx.navigation
to 2.8.3 (sample apps dependency). - Updated Guava to 33.3.1-android (sample apps dependency).
- Migrated from
gradle-nexus/publish-plugin
tovanniktech/gradle-maven-publish-plugin
for publishing artifacts to Maven Central.
Bug fixes and improvements
- Fix install confirmation from OS not displaying after granting install permission on some devices (particularly Android TV) using
SESSION_BASED
installer. This is a fix for #84. - Fix various issues with dismissing install confirmation from OS via clicking outside of confirmation dialog using
SESSION_BASED
installer.
0.8.0
Dependencies
- Extracted
ackpine-resources
artifact, which is now depended upon byackpine-core
.
Bug fixes and improvements
-
NotificationString
is superseded byResolvableString
to accommodate stable string resources resolution.ResolvableString
is now located inackpine-resources
artifact and can also be used separately for general app needs.NotificationString
is deprecated and will be removed in next minor release.To migrate
NotificationString.resource()
usages toResolvableString
, create classes inheriting fromResolvableString.Resource
like this:// Old NotificationString.resource(R.string.install_message, fileName) // New class InstallMessage(fileName: String) : ResolvableString.Resource(fileName) { override fun stringId() = R.string.install_message private companion object { private const val serialVersionUID = 4749568844072243110L } } InstallMessage(fileName)
Note that this requires to purge internal database because of incompatible changes, so all previous sessions will be cleared when Ackpine is updated to 0.8.0.
-
NotificationData
now requires an instance ofDrawableId
class instead of integer drawable resource ID for icon to accommodate stable drawable resources resolution. -
Don't hardcode a condition in implementation of
SESSION_BASED
sessions when Android'sPackageInstaller.Session
fails without report. It should possibly improve reliability on different devices. -
Fix progress bars on install screen not using latest value in sample apps.
-
Disable cancel button when session's state is Committed in sample apps.
Public API changes
- Breaking:
NotificationData
,NotificationData.Builder
andNotificationDataDsl
now requireResolvableString
instead ofNotificationString
astitle
andcontentText
type.NotificationString
is deprecated with an error deprecation level and will be removed in next minor release. - Breaking:
NotificationData
,NotificationData.Builder
andNotificationDataDsl
now requireDrawableId
instead of integer asicon
type. - Added
ResolvableString
sealed interface inackpine-resources
module. - Added
DrawableId
interface inackpine-core
module.
0.7.6
Dependencies
- Reverted
androidx.startup
to 1.1.1.
Bug fixes and improvements
INTENT_BASED
package installer sessions are no longer stuck inCOMMITTED
state if they have performed a successful app self-update (not in all scenarios). This is an (almost) fix for issue #33.- Use
ZipFile
API for readingAndroidManifest.xml
when possible while parsing single APK withApk.fromFile()
andApk.fromUri()
.