AGP7 适配 Transform

AGP7 适配 Transform

环境:

Gradle 版本:

distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip

AGP版本:

buildscript {  
ext.kotlin_version = "1.6.20"
dependencies {
classpath "com.android.tools.build:gradle:7.2.2"
}
}

plugins {
id 'com.android.application' version '7.2.2' apply false
id 'com.android.library' version '7.2.2' apply false
id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
}
阅读更多
Framework -- wsl编译安卓系统

Framework -- wsl编译安卓系统

最近在研究研究android系统源码,打算在编译一个room验证下自己的想法,在windows上折腾很久,终于算是在windows上把安卓系统编译出来了。

阅读更多
Gradle -- 统一依赖库版本

Gradle -- 统一依赖库版本

这么多年的安卓开发中,让人最头疼的莫过于多个项目之间的三方库的版本统一,用过多种多样的版本统一方式,从最开始的ext,到buildSrc,再到自定义插件,无论是哪种方式都没有完全解决这个疼点。
现在在gradle 7.0以上的版本中,gralde官方添加了一个新的特性Catalog,用于统一不同项目之间的版本依赖库。

阅读更多

Android Dex加载流程

Android 系统加载Dex 分两步:
首先是开发者通过Jave Api 调用加载Dex的方法;
然后是jvm调用Native的方法进行加载Dex文件

JAVA中加载一个DEX

DexClassLoader classLoader = new DexClassLoader(dexPath, OutputDir.getAbsolutePath(),null,getClassLoader())
阅读更多

Javadoc generation failed.

具体问题描述:

Execution failed for task ':UIWidget:androidJavadocs'.
> Javadoc generation failed. Generated Javadoc options file (useful for troubleshooting): '/Users/aria/dev/android/work_space/KeepassLib/UIWidget/build/tmp/androidJavadocs/javadoc.options'

* Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. Run with --scan to get full insights.

javadoc: ?? - ???????: /Users/aria/dev/android/sdk/docs/reference/element-list
阅读更多

Android oneDrive 集成(二)-- 单租户账号集成

Android oneDrive 集成(一)– SDK申请

Android oneDrive 集成(三)– 使用Postman测试Graph API

微软的MSAL平台有多种租户模式,本篇文章将介绍单租户的接入方式。

AzureADMyOrg:仅限应用注册的组织目录中的帐户(单租户)
AzureADMultipleOrgs:任何组织目录中的帐户(多租户)
AzureADandPersonalMicrosoftAccount:任何组织目录中的帐户 (多租户) 和个人 Microsoft 帐户 (例如,Skype、Xbox 和 Outlook.com)
PersonalMicrosoftAccount:仅个人 Microsoft 帐户

注意⚠️:本篇文章仅适用于单租户,因为MSAL对不同的租户有不同的接入方式。

阅读更多

Android oneDrive 集成(一)-- SDK申请

Android oneDrive 集成(二)– 单租户账号集成

Android oneDrive 集成(三)– 使用Postman测试Graph API

最近我的个人应用KeepassA在酷安上收到了很多私信,问我能不能集成下OneDrive,作为唯一的没有被墙的,大型的跨平台云盘服务,集成OneDrive貌似很有必要。因此研究了好几天的微软文档,遇到了很多坑,总算是搞明白了该怎么集成。
这里不得不吐槽下,微软的东西总是大而全,对新接开发者很不友好,平台那出现问题,错误信息非常不明确。

阅读更多

日常爬坑-Android Transitions动画失效

最近在我的应用KeepassA中碰到了一个诡异的过渡动画问题

API版本:29

正常状态应该如下:

normal

当我从一级设置界面,进入二级设置界面后,并从二级设置界面返回时,一级界面当回主页的过渡动画消失了!!

android_ta_error
阅读更多

MPAndroidChart - 常用属性

一、常用属性

参考地址:https://blog.csdn.net/qq_25943493/article/details/51803497
中文文档:https://github.com/baiqingsong/ChartDawn

// 禁止触摸/拖动/缩放
bc.setTouchEnabled(false)
bc.isDragEnabled = false
bc.setScaleEnabled(false)
//不绘制网格背景
bc.setDrawGridBackground(false)
// 处理y坐标轴
bc.axisRight.isEnabled = false // 右侧不显示Y轴
bc.axisLeft.axisMinimum = 0f //设置Y轴显示最小值,不然0下面会有空隙
bc.axisLeft.setDrawGridLines(false) //不设置Y轴水平线显示
bc.axisLeft.axisLineColor = Color.TRANSPARENT // 设置左侧y轴坐标轴线的颜色

// 处理x坐标轴
bc.xAxis.position = XAxis.XAxisPosition.BOTTOM // 设置坐标轴位置
bc.xAxis.setDrawGridLines(false) // 设置X轴竖直线的显示
// 显示每一个 X 轴的数值,第一个参数为x轴数值个数,第二个是否强制使用坐标轴数值
bc.xAxis.setLabelCount(10, false)

// 设置偏移量
bc.extraBottomOffset = 14f // 底部偏移量

// 设置描述
bc.description = Description().apply {
text = "min"
setPosition(30.toPx().toFloat(), 25.toPx().toFloat()) // 修改显示的位置
textAlign = Paint.Align.LEFT // 显示在左边/右边/中间
}

// 处理标签
val legend = bc.legend
legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER // 设置标签横向居中
legend.verticalAlignment = Legend.LegendVerticalAlignment.TOP // 设置标签在顶部
//背景阴影
bc.setDrawBarShadow(false)
bc.isHighlightFullBarEnabled = false
//显示边界
bc.setDrawBorders(false)
bc.setPadding(1, 1, 1, 1)
// 设置描述
bc.description = Description().apply {
text = ""
}
阅读更多

日常爬坑-指纹解锁Key permanently invalidated

最近我的个人应用KeepassA在bugly上收到了一个行奇怪的问题。

错误日志:

java.lang.RuntimeException:java.lang.reflect.InvocationTargetException
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
......
Caused by:
android.security.keystore.KeyPermanentlyInvalidatedException:Key permanently invalidated
android.security.KeyStore.getInvalidKeyException(KeyStore.java:1368)
android.security.KeyStore.getInvalidKeyException(KeyStore.java:1413)

android.security.keystore.KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(KeyStoreCryptoOperationUtils.java:54)
android.security.keystore.KeyStoreCryptoOperationUtils.getExceptionForCipherInit(KeyStoreCryptoOperationUtils.java:89)
android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:265)
android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:109)

阅读更多