Android13 系统签名应用编译调试说明

Android13 系统签名应用编译调试说明

文章目录

  • Android13 系统签名应用编译调试说明
    • 一、前言
    • 二、系统签名应用调试步骤
      • 1、新建一个应用,确保可以正常编译出APK
      • 2、获取系统签名文件
      • 3、Android Studio 编译安装系统权限应用
        • (1)导入签名文件生成apk安装验证
        • (2)AndroidManifest中添加
      • 4、添加系统的Jar包
        • (1)编译framework 的Jar包
        • (2)添加SettingsLib 的Jar包
        • (3)app\build.gradle中导入依赖的包
        • (4)app\build.gradle添加framework中特殊声明
    • 三、其他
      • 1、Android Studio系统签名应用编译调试小结
      • 2、系统Jar包适配
        • (1)framework jar包
          • ① 大概配置:Android Studio新版本 + Gradle8.7 + 编译版本34 + JDK8
          • ②导入的Android14 的framework.jar,但是Gradle版本是6.5 会编译报错:
          • ③Android Studio 配置SDK33和配置Android14 的framework.jar包,运行报错
        • (2)SettingsLib jar包
          • 删除无费用的包
      • 3、如何查看安装的应用是否是系统应用

一、前言

Android11之前一直可以用系统的签名文件编译系统签名apk,
但是开发Android13 的系统应用后,就有点问题了,
发现使用系统签名文件编译的系统签名apk安装到设备上会失败,
以为搞不了了,但是看到有的同事是OK的,等了一段时间后分析处理了。

本文记录一下这种系统签名应用调试的过程。

我之前安装的Android Studio 版本是2021年的,Android Gradle 版本是6.5;
后面发现安装2024年的Android Studio,并且使用Gradle8.7 就ok,
可以正常打包Android13 或者更新版本的系统签名apk了。

二、系统签名应用调试步骤

1、新建一个应用,确保可以正常编译出APK

这个是确保当前系统SDK、JDK、Gradle环境与Android Studio是否匹配;
只有环境ok才能继续下一步。

2、获取系统签名文件

从源码中获取签名文件步骤:
https://blog.csdn.net/wenzhi20102321/article/details/134898404

配置签名文件的账户,密码后会生成 platform.jks系统签名文件。

并不是所有源码都可以生成签名文件,有些是被供应商加密处理的,如果不行可以咨询供应商了解。

生成的platform.jks系统签名文件就可以导入到Android Studio进行签名处理。

3、Android Studio 编译安装系统权限应用

(1)导入签名文件生成apk安装验证

查看是否可以正常编译出APK并且是否可以正常安装到运行的设备;
能编译出apk说明,签名文件的账号和密码是匹配签名文件的;
如果账号和密码不匹配签名文件是无法编译出apk的;

jks文件放到app目录下,然后配置一下签名文件的信息:

app\build.gradle

android {buildToolsVersion "33.0.0"compileSdkVersion 33defaultConfig {applicationId "com.demo.android14demo"minSdkVersion 30targetSdkVersion 33versionCode 1versionName "1.0"}//系统签名文件配置----statsigningConfigs {println "---------------------signingConfigs"main {storeFile file("./platform.jks") //签名文件路径,根目录storePassword "skg202302p"keyAlias "skg"keyPassword "skg202302p"}}buildTypes {println "---------------------buildTypes"release {println "release start"minifyEnabled falsesigningConfig signingConfigs.main //添加这一行proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'println "release end"}debug {println "debug"minifyEnabled falsesigningConfig signingConfigs.main //添加这一行proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}//系统签名文件配置----endcompileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}

中间那段代码就是配置打包系统签名到apk的代码。

但是要注意,普通签名的apk也是可以直接安装的,只是没有系统权限而已;
所以要成为系统签名的应用,还有添加uid的权限。

(2)AndroidManifest中添加
android:sharedUserId="android.uid.system"

如果导入签名文件,并且设置uid可以,生成apk并且安装到设备,
说明已经成功的把系统签名应用编译运行到设备上了。

后面就可以进行系统权限代码的相关逻辑调用了。

4、添加系统的Jar包

添加系统代码开发需要的JAR包,
比如framework、SettingsLib、一些三方或者自定义的JAR包

导入系统jar包的作用:

导入framework :
是为了调用一些系统类/方法,比如 SystemProperties 或者热点设置相关的方法;
还有就是开发中对于系统原生类添加的类或者新接口,需要使用。导入SettingsLib:
是为了调用一些 SettingsLib 封装的方法,
比如wifi、蓝牙的很多逻辑在 SettingsLib 都是有比较完善的封装处理可以直接拿来用,
原生Settings 里面非常多的逻辑都是使用了SettingsLib的。
(1)编译framework 的Jar包
//编译framework jar包的命令
make -j64 framework//framework jar生成的目录
release\out\target\common\obj\java_libraries\framework_intermediates\classes.jar
(2)添加SettingsLib 的Jar包
//编译 SettingsLib jar包的命令
make -j64 SettingsLib//SettingsLib jar生成的目录
release\out\target\common\obj\java_libraries\settingslib_intermediates\classes.jar

上面的classes.jar包修改一下命名后,复制到Studio的libs目录

(3)app\build.gradle中导入依赖的包
dependencies {//这个是旧版本Gradle的依赖,新版本是兼容的//implementation 'androidx.appcompat:appcompat:1.3.1'//新版本的版本管理是统一在 Demo\gradle\libs.versions.tomlimplementation libs.appcompatimplementation libs.materialimplementation libs.activityimplementation libs.constraintlayout//导入framework和SettingsLib包implementation files('libs\\framework.jar')implementation files('libs\\SettingsLib.jar')
}

如果未导入framework 包,有些系统的类就无法识别,比如 SystemProperties
会报错:

import android.os.SystemProperties; //Cannot resolve symbol 'SystemProperties'
(4)app\build.gradle添加framework中特殊声明

添加配置的代码如下:

dependencies { }//dependencies 下方配置 framework
gradle.projectsEvaluated {tasks.withType(JavaCompile) {Set<File> fileSet = options.bootstrapClasspath.getFiles()List<File> newFileList =  new ArrayList<>();//"../framework.jar" 为相对位置,需要参照着修改,或者用绝对位置newFileList.add(new File("libs/framework.jar"))newFileList.addAll(fileSet)options.bootstrapClasspath = files(newFileList.toArray())}
}

配置上面的代码说明优先从framework.jar 的代码中获取相关的类;
否则只从Studio SDK版本中获取到的类,会导致很多方法和内部类无法调用。

如果未配置上面的 framework ,会造成下面常见影响:

import static android.net.wifi.WifiManager.WIFI_AP_STATE_CHANGED_ACTION; // WIFI_AP_STATE_CHANGED_ACTION 无法识别//获取热点配置,找不到 getSoftApConfiguration()方法
SoftApConfiguration softApConfiguration = wifiManager.getSoftApConfiguration();

上面只是举例的一部分,还有些不常用的Java类,
所以最好导入framework.jar后再添加framework的声明,防止造成系统代码报错。

到这里Android Studio系统签名应用的配置大致完成了。

其实上面只是分析和操作的大致步骤,实际开发中可能还会有其他问题;
比如jar包兼容性问题。jar包兼容性问题只能一个个包的排查,替换成不会造成兼容的jar包。

后面有介绍framework.jar 和 SettingsLib.jar兼容问题的处理参考。
可以不同的项目方案有所差别,所以仅供参考。

三、其他

1、Android Studio系统签名应用编译调试小结

大致步骤:

 1、新建一个应用,确保可以正常编译出APK2、源码中获取系统签名文件3、Android Studio 编译安装系统权限应用查看是否成功4、添加系统的Jar包

上面三步OK,证明运行环境和系统签名证书匹配的。

最好使用比较新的Gradle版本,我之前就是使用Gradle6.5 一直无法正常生成系统签名应用,换成最新的Gradle8.7就OK了。

上面的调试步骤,我为啥把添加jar包放在最后,
是因为对于复杂的系统应用来说第4步才是最麻烦的,比如导入SettingsLib包会报很多错误。
下面讲一下导入framework和SettingsLib 的简单经验。

2、系统Jar包适配

后面验证发现关联的情况很多,比如AndroidStudio版本,选择的SDK版本,Gradle版本,具体的Gradle配置,运行的系统环境等等都要有影响。

不同系统环境可能有所差异,这里仅供参考。

(1)framework jar包

下面是一些情况的验证测试情况,

① 大概配置:Android Studio新版本 + Gradle8.7 + 编译版本34 + JDK8

311D2 Android14 的 framework的jar包,不需要适配就可以直接导入使用。

9679 Android14的 framework的jar包,不会编译报错,但是会运行一会后崩溃。

刚开始我以为是系统环境问题,但是后面发现是jar包问题,
因为9679方案的framework.jar 编译的apk 安装在311D2方案的设备上也会有这个问题;
所以有的方案的framework的jar会有兼容性问题!
估计是供应商有修改适配framework代码有关系。

报错如下:
在这里插入图片描述

部分日志如下:

2024-12-18 20:41:56.792 25793-25891 AndroidRuntime          com.example.android14                E  FATAL EXCEPTION: pool-2-thread-1Process: com.example.android14, PID: 25793java.lang.IncompatibleClassChangeError: Class 'android.app.PendingIntent$$ExternalSyntheticLambda0' does not implement interface 'java.util.concurrent.Executor' in call to 'void java.util.concurrent.Executor.execute(java.lang.Runnable)' (declaration of 'androidx.profileinstaller.DeviceProfileWriter' appears in /data/app/~~SM7I1l6Vc5y6uQofWqnX2w==/com.example.android14-yUgXUvcu7KYWoFgznszrLQ==/base.apk!classes6.dex)at androidx.profileinstaller.DeviceProfileWriter.result(DeviceProfileWriter.java:87)at androidx.profileinstaller.DeviceProfileWriter.deviceAllowsProfileInstallerAotWrites(DeviceProfileWriter.java:119)at androidx.profileinstaller.ProfileInstaller.transcodeAndWrite(ProfileInstaller.java:440)at androidx.profileinstaller.ProfileInstaller.writeProfile(ProfileInstaller.java:575)at androidx.profileinstaller.ProfileInstaller.writeProfile(ProfileInstaller.java:515)at androidx.profileinstaller.ProfileInstaller.writeProfile(ProfileInstaller.java:479)at androidx.profileinstaller.ProfileInstallerInitializer.lambda$writeInBackground$2(ProfileInstallerInitializer.java:145)at androidx.profileinstaller.ProfileInstallerInitializer$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:0)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)at java.lang.Thread.run(Thread.java:1012)
---------------------------- PROCESS ENDED (25793) for package com.example.android14 ----------------------------

主要报错是:

IncompatibleClassChangeError: 
Class 'android.app.PendingIntent$$ExternalSyntheticLambda0' 
does not implement interface 'java.util.concurrent.Executor' 
in call to 'void java.util.concurrent.Executor.execute(java.lang.Runnable)' 
(declaration of 'androidx.profileinstaller.DeviceProfileWriter'

但是好像看不出啥,不好解决啊。
只能看出 android.app.PendingIntent 的代码有问题,
还有 重复定义的 androidx.profileinstaller.DeviceProfileWriter;

其实Jar包可以删除里面的东西。
在这里插入图片描述

我最后的处理是删除了报错的地方:
在这里插入图片描述

我最后的处理是 删除了jar包里面的android下面的app 整个目录。
发现是OK的。
其实这个是瞎试的,反正jar包可以多备份一个,删错了恢复回来就行。

②导入的Android14 的framework.jar,但是Gradle版本是6.5 会编译报错:
Unsupported class file major version 61

Java 17 对应的类文件主版本号是 61。
所以当出现 “Unsupported class file major version 61” 提示时,
大概率是你当前运行代码的环境(比如 JRE)所支持的 Java 版本低于 Java 17,
导致其无法识别这个用 Java 17 编译出来的类文件。

我目前的Java环境是1.8,也就是Java8,有可能更新JDK可以解决这个问题;
但是不想搞了,比较麻烦。
首先使用新的Gradle版本尝试吧,不行再更新JDK版本;我是用Gradle8.7就OK了的。

③Android Studio 配置SDK33和配置Android14 的framework.jar包,运行报错

编译出apk,但是运行报错:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.demo.android14demo/com.demo.android14demo.MainActivity}: 
java.lang.ClassNotFoundException: Didn't find class "com.demo.android14demo.MainActivity"at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3693)
。。。Caused by: java.lang.ClassNotFoundException: Didn't find class "com.demo.android14demo.MainActivity" on path: DexPathList[[zip file "/data/app/~~hsBPlkD_QBZzxoDWdGBYVg==/com.demo.android14demo-ZynohvbL1ZaBZUvw2iu5hA==/base.apk"],nativeLibraryDirectories=[/data/app/~~hsBPlkD_QBZzxoDWdGBYVg==/com.demo.android14demo-ZynohvbL1ZaBZUvw2iu5hA==/lib/arm64, /system/lib64, /system_ext/lib64]]at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
。。。at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978) Suppressed: java.io.IOException: Failed to open dex files from /data/app/~~hsBPlkD_QBZzxoDWdGBYVg==/com.demo.android14demo-ZynohvbL1ZaBZUvw2iu5hA==/base.apk because: Failure to verify dex file '/data/app/~~hsBPlkD_QBZzxoDWdGBYVg==/com.demo.android14demo-ZynohvbL1ZaBZUvw2iu5hA==/base.apk': Method 2285(Landroid/animation/PropertyValuesHolder;.-$$Nest$smnCallFloatMethod) has code, but is marked native or abstractat dalvik.system.DexFile.openDexFileNative(Native Method)

这里看出看出framework 的jar包导入需要注意:

不同源码环境的framework.jar 可能会有差异;
导入的framework.jar 的Android版本要和运行环境的版本一致,否则会运行报错;
Gradle 版本可能也会有影响

肯定还有其他差异,或者其他情况,报的错误可能也不同
比如Gradle版本,JDK版本,这里无法一一进行验证测试。

(2)SettingsLib jar包

SettingsLib.jar 就比较好适配了,就是嘎嘎嘎一段删就行。

SettingsLib.jar 无论是哪个方案都是要处理的。
编译就报错,报错太多了,就不一一展示了。

主要处理如下:

删除无费用的包

在这里插入图片描述

只留下com.android下面的包就行,其实有用的就是下面的settinngslib包而已。

如果没有Beyond Compare工具,使用普通的解压包工具打开jar包后直接删除里面的文件也是OK的。

3、如何查看安装的应用是否是系统应用

方法有很多,比如运行环境下,
dumpsys package XXX 查看appid的信息
如果是uid签名的系统应用,appid=1000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/492331.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring Boot的医院质控上报系统

一、系统背景与意义 医院质控上报系统旨在通过信息化手段&#xff0c;实现医院质量控制的标准化、流程化和自动化管理。该系统能够帮助医院实时监控医疗质量数据&#xff0c;及时发现和处理潜在的质量问题&#xff0c;从而确保医疗服务的安全性和有效性。同时&#xff0c;系统…

将java项目部署到linux

命令解析 Dockerfile: Dockerfile 是一个文本文件&#xff0c;包含了所有必要的指令来组装&#xff08;build&#xff09;一个 Docker 镜像。 docker build: 根据 Dockerfile 或标准指令来构建一个新的镜像。 docker save: 将本地镜像保存为一个 tar 文件。 docker load: 从…

LeetCode:226.翻转二叉树

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;226.翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 …

Webpack学习笔记(2)

1.什么是loader? 上图是Webpack打包简易流程&#xff0c;webpack本身只能理解js和json这样的文件&#xff0c;loader可以让webpack解析其他类型文件&#xff0c;并且将文件转换成模块供我们使用。 test识别出那些文件被转换&#xff0c;use定义转换时使用哪个loader转换 上图…

【WebDriver】浏览器驱动下载及其配置

一、Windows电脑环境搭建-Chrome浏览器 行业内&#xff0c;Chrome (谷歌) 浏览器对于自动化程序来讲是比较稳定的. 自动化程序推荐使用 Chrome 浏览器的原因有几个&#xff1a; 开发者工具&#xff1a;Chrome 提供强大的开发者工具&#xff0c;方便调试和测试自动化脚本。 稳…

list使用

目录 list介绍 list使用 list创建 list迭代器 容量操作 元素访问 修改元素 其他操作 list介绍 ● list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 ● list的底层是双向链表结构&#xff0c;双向链表中每个元素存…

【AIGC】如何高效使用ChatGPT挖掘AI最大潜能?26个Prompt提问秘诀帮你提升300%效率的!

还记得第一次使用ChatGPT时&#xff0c;那种既兴奋又困惑的心情吗&#xff1f;我是从一个对AI一知半解的普通用户&#xff0c;逐步成长为现在的“ChatGPT大神”。这一过程并非一蹴而就&#xff0c;而是通过不断的探索和实践&#xff0c;掌握了一系列高效使用的技巧。今天&#…

windows 使用python共享网络给另外一个网卡

# -*- coding: utf-8 -*- import subprocessdef open_share(to_shared_adapter, from_shared_adapter):"""打开以太网的网络共享:return: None"""powershell_script f"""# Register the HNetCfg library (once)# regsvr32 hnetc…

devops-部署Harbor实现私有Docker镜像仓库

文章目录 概述下载配置安装安装后生成的文件使用和维护Harbor参考资料 概述 Harbor是一个开源注册中心&#xff0c;它使用策略和基于角色的访问控制来保护工件&#xff0c;确保镜像被扫描并且没有漏洞&#xff0c;并将镜像签名为可信的。Harbor是CNCF的一个毕业项目&#xff0…

Java深拷贝和浅拷贝区别?

大家好&#xff0c;我是锋哥。今天分享关于【Java深拷贝和浅拷贝区别?】面试题。希望对大家有帮助&#xff1b; Java深拷贝和浅拷贝区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Java中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&am…

Linux文件属性 --- 硬链接、所有者、所属组

三、硬链接数 1.目录 使用“ll”命令查看&#xff0c;在文件权限的后面有一列数字&#xff0c;这是文件的硬链接数。 对于目录&#xff0c;硬链接的数量是它具有的直接子目录的数量加上其父目录和自身。 下图的“qwe”目录就是“abc”目录的直接子目录。 2.文件 对于文件可…

MobileLLM开发安卓AI的体验(一)

MobileLLM是一个在安卓端跑的大语言模型&#xff0c;关键它还有调动api的能力 https://github.com/facebookresearch/MobileLLM 项目地址是这个。 看了下&#xff0c;似乎还是中国人团队 article{liu2024mobilellm, title{MobileLLM: Optimizing Sub-billion Parameter Langua…

【WRF安装】WRF编译错误总结1:HDF5库包安装

目录 1 HDF5库包安装有误&#xff1a;HDF5 not set in environment. Will configure WRF for use without.HDF5的重新编译 错误原因1&#xff1a;提示 overflow 错误1. 检查系统是否缺少依赖库或工具2. 检查和更新编译器版本3. 检查 ./configure 报错信息4. 检查系统环境变量5.…

大模型微调---Prompt-tuning微调

目录 一、前言二、Prompt-tuning实战2.1、下载模型到本地2.2、加载模型与数据集2.3、处理数据2.4、Prompt-tuning微调2.5、训练参数配置2.6、开始训练 三、模型评估四、完整训练代码 一、前言 Prompt-tuning通过修改输入文本的提示&#xff08;Prompt&#xff09;来引导模型生…

【UE5】pmx导入UE5,套动作。(防止“气球人”现象。

参考视频&#xff1a;UE5Animation 16: MMD模型與動作導入 (繁中自動字幕) 问题所在&#xff1a; 做法记录&#xff08;自用&#xff09; 1.导入pmx&#xff0c;删除这两个。 2.转换给blender&#xff0c;清理节点。 3.导出时&#xff0c;内嵌贴图&#xff0c;选“复制”。 …

005 QT常用控件Qwidget_上

文章目录 前言控件概述QWidgetenable属性geometry属性windowTitle属性windowlcon属性 小结 前言 本文将会向你介绍常用的Qwidget属性 控件概述 Widget 是 Qt 中的核心概念. 英文原义是 “⼩部件”, 我们此处把它翻译为 “控件” . 控件是构成⼀个图形化界面的基本要素. QWi…

gitlab初始化+API批量操作

几年没接触gitlab了&#xff0c;新版本装完以后代码提交到默认的main分支&#xff0c;master不再是主分支 项目有几十个仓库&#xff0c;研发提交代码后仓库地址和之前的发生了变化 有几个点 需要注意 1、修改全局默认分支 2、关闭分支保护 上面修改了全局配置不会影响已经创…

如何用上AI视频工具Sora,基于ChatGPT升级Plus使用指南

没有GPT&#xff0c;可以参考这个教程&#xff1a;详情移步至底部参考原文查看哦~ 1.准备工作 详情移步至底部参考原文查看哦~ 详情移步至底部参考原文查看哦~ 4.Sora使用 详情移步至底部参考原文查看哦 参考文章&#xff1a;【包教包会】如何用上AI视频工具Sora&#xff…

如何查看K8S集群中service和pod定义的网段范围

在我们创建部署K8S集群的开头时候 不是需要在master节点上执行一条这样的命令嘛&#xff1f; kubeadm init --apiserver-advertise-address192.168.60.130 --control-plane-endpointcluster-master --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers -…

使用 Marp 将 Markdown 导出为 PPT 后不可编辑的原因说明及解决方案

Marp 是一个流行的 Markdown 演示文稿工具&#xff0c;能够将 Markdown 文件转换为 PPTX 格式。然而&#xff0c;用户在使用 Marp 导出 PPT 时&#xff0c;可能会遇到以下问题&#xff1a; 导出 PPT 不可直接编辑的原因 根据 Marp GitHub 讨论&#xff0c;Marp 导出的 PPTX 文…