当前位置: 首页 > article >正文

framework踩坑:aosp/lineageos系统apk签名导出到as进行使用

背景:

经常做framework开发或者系统应用开发时候,都会有一个很熟悉的名词“系统签名”,因为有了系统签名才可以有比普通第三方应用更高的权限,很多核心函数才可以进行调用成功等。所以在做系统应用开发经常要把自己的apk进行相关的签名,但是具体怎么对系统应用进行签名呢?
一般可以有如下2个情况:
1、本身系统应用的代码源码集成,Android.bp或mk指定platform签名,就是随aosp系统编译出apk,这种情况只需要对系统进行整编,或者对apk进行单独模块编译make xxxx目标既可以。这样out目录出来的apk就自带了系统前面

2、但是很多公司的系统应用,为了开发效率的提高,或者本身代码就是独立于系统的。他们采用集成方式是apk进行集成,这种其实就和我们android studio开发没啥区别,编译apk也是android studio直接编译的。相当于与系统没有任何耦合,这种编译apk时候就需要考虑使用系统签名才可以。

在这里插入图片描述
但是针对android studio编译的apk如何自带系统签名呢?这个具体怎么做呢?

制作系统签名文件

1、导出lineage或者aosp系统自带的签名文件
源码根目录执行如下命令:

cd build/target/product/security/
ls | grep platform
platform.pk8
platform.x509.pem

可以看到在build/target/product/security/有两个platform的两个文件都拷贝到单独目录

在这里插入图片描述

2、执行命令生成platform.pem文件

openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.pem -nocrypt

3、执行命令生成的platform.pk12文件

# 生成platform.pk12,别名为platform,密码是:android
openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:android -name platform

4、生成对应的platform.jks

test@test:~/disk2/platform-signed$ ~/android-studio/jre/bin/keytool -importkeystore -deststorepass android -destkeystore platform.jks -srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass android
Importing keystore platform.p12 to platform.jks...
Entry for alias platform successfully imported.
Import command completed:  1 entries successfully imported, 0 entries failed or cancelled

Warning:
<platform> uses the MD5withRSA signature algorithm which is considered a security risk.
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore platform.jks -destkeystore platform.jks -deststoretype pkcs12".


ps:这里最重要就是keytool使用的要和android studio对应的jre目录的一致,一定要注意这里的keytool要注意它对应的java版本,如果java版本不对会导致生成的platform.jks无法被android studio编译,会不断报错Invalid keystore format

Execution failed for task ':app:packageDebug'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > com.android.ide.common.signing.KeytoolException: Failed to read key platform from store "/home/test/AndroidStudioProjects/ANRDemo/app/platform.jks": Invalid keystore format

* Try:

具体android studio的jre目录确定:
在这里插入图片描述所以我们这里的没有用默认keytool,而是使用~/android-studio/jre/bin/keytool下面的。

做完上面几步既可以目录下看到关键的签名文件platform.jks:

在这里插入图片描述
使用它导入到android studio既可以编译了.

android studio使用签名文件编译

拷贝platform.jks到as过程的app目录:
在这里插入图片描述
然后修改app下面的build.gradle文件

 signingConfigs {
        config {
            storeFile file("platform.jks")
            storePassword 'android'
            keyAlias 'platform'
            keyPassword 'android'
        }
    }
    buildTypes {
        debug {
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
    }

再进行编译:
在这里插入图片描述
编译成果后,进行安装:

test@test:~/AndroidStudioProjects/ANRDemo$ adb install -r app/build/outputs/apk/debug/app-debug.apk
Success

直接可以安装成功了,本身apk属于内置apk

test@test:~/disk2/platform-signed$ adb shell dumpsys package android | grep "signatures:"
    signatures=PackageSignatures{24b8cda version:3, signatures:[b4addb29], past signatures:[]}
test@test:~/disk2/platform-signed$ adb shell dumpsys package com.example.anrdemo| grep signa
    signatures=PackageSignatures{114d882 version:2, signatures:[b4addb29], past signatures:[]}
    signatures=PackageSignatures{114d882 version:2, signatures:[b4addb29], past signatures:[]}

dumpsys可以看到确实属于系统platform签名

本文参考链接:https://mp.weixin.qq.com/s/W6l8ok78SD6gE4e1PD74RA

更多framework干货,请关注下面“千里马学框架”


http://www.kler.cn/a/455414.html

相关文章:

  • 光谱相机与普通相机的区别
  • springboot配置oracle+达梦数据库多数据源配置并动态切换
  • JVM调优实践篇
  • 如何阻止盗版软件在互联网上传播
  • 学习笔记(prism--视频【WPF-prism核心教程】)--待更新
  • 论文解读——掌纹生成网络 RPG-Palm升级版PCE-Palm
  • SSL/TLS 深入浅出
  • SpringBoot(Ⅱ)——@SpringBootApplication注解+自动装配原理+约定大于配置
  • PHP高性能webman管理系统EasyAdmin8
  • C05S16-MySQL高可用
  • 天天 AI-241226:今日热点-OpenAI正研发实体机器人,终结者时代还是来了
  • 年会游戏策划
  • C++线程、并发、并行
  • SuperMap iDesktopX填补三维可视化地图海岸地形
  • MySQL 性能瓶颈,为什么 MySQL 表的数据量不能太大?
  • Vue axios 异步请求,请求响应拦截器
  • Hive SQL和Spark SQL的区别?
  • PHP实现登录和注册(附源码)
  • Java并发编程框架之综合案例—— 大数据分析工具(六)
  • Linux | Ubuntu零基础安装学习cURL文件传输工具
  • 【gopher的java学习笔记】@ComponentScan注解解析
  • leetcode hot 100 二叉搜索
  • Qt 信号和槽 connect()第5个参数
  • 利用Python爬虫在速卖通按关键字搜索商品案例指南
  • Windows配置cuda,并安装配置Pytorch-GPU版本
  • STM32-笔记12-实现SysTick模拟多线程流水灯