Android APP签名和用户UID

本文介绍了Android APP签名的作用,包括声明发布者身份、获取不同资源权限及确保应用更新的一致性。详细讲解了如何使用Android提供的四种测试key进行签名,并演示了如何通过Android Studio生成keystore。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android APP签名除了能够声明发布者的身份,另外还有一下两个作用

1.使用一些特殊的key签名,可以获取到不同的资源

testkey -- a generic key for packages that do not otherwise specify a key.
platform -- a test key for packages that are part of the core platform.
shared -- a test key for things that are shared in the home/contacts process.
media -- a test key for packages that are part of the media/download system.

android 的为我们提供了这4种key的测试key,他们位于android\build\target\product\security

我们已系统的platform 为例

在security目录下

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

该命令会生成platform.pem文件

openssl pkcs12 -export -in  platform.x509.pem -out platform.p12 -inkey  platform.pem -password pass:android -name androiddebugkey

该命令生成一个数据证书platform.p12

keytool -importkeystore -deststorepass android -destkeystore ./platform.jks -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepassandroid

该命令生成我们需要的keystore文件

2.APP签名后,如果其他发布者使用相同名称的发布包由于签名不一样,该APK是无法覆盖你的APP的

下面介绍用android stdio为APP生成keystore

在开发工具上直接将APP安装到设备上是,开发工具会为APP签入一个DebugKey,但是当我们要正式发布一个APP时,必须要为该APP签入合适的签名,该签名主要用于声明作者身份,表明该APP是可信任的。

系统不会安装一个未签名的APP,签名证书不需要授权,APP开发者普遍都使用自己的证书签名,如开发者可以使用Android Stdio为自己的APP签名:

1.step 1


2.step 2


这里需要使用java SDK中的keytool命令

keytool -genkey -alias wiwide -keypass wiwide2016 -keyalg RSA -keysize 1024 -validity 365 -keystore c:\key\jimmy.keystore -storepass 123456 -dname CN=wiwide

在对话框中输入生成的keystore文件所在的目录,以及别名和秘钥




UID

今天编译调试一个APP的时候发现andio Stduio报SHARED_USER_INCOMPATIBLE的错误


研究了一下发现在AndroidManifest.xml中,将sharedUserId声明成了system的,临时把这个关掉就能调试了

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wiwide.jiang.wiplussettings"
    android:sharedUserId="android.uid.system">

扩展了解一下sharedUserI

Android的每一个APP都会分配到一个自己的UID,前面说了android提供了四种key类型

在使用system类型的key时,还需要在android.mk中定义LOCAL_CERTIFICATE := platform这句表示该APP使用目标系统中的platform key就是上面提到的security目录中的platform.pk8和platform.x509.pem两个文件来签名,不过这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用。如果需要在第三方的系统中使用,需要有第三方的KEY





<think>我们正在讨论如何将第三方Android应用以V2签名方式预置到设备中(即作为系统预装应用)。AndroidV2签名方案(也称为APKSignatureSchemev2)是Android7.0(Nougat)引入的一种新的签名机制,它提供了更快的应用安装时间更强的安全性。预置第三方应用到设备通常需要以下几个步骤:1.**获取第三方应用的APK**:确保该APK已经使用V2(或V2及V1)签名方案进行了签名。可以使用`apksigner`工具来验证签名方案:```bashapksignerverify--verboseyour_app.apk```或者使用`keytool`查看签名(但不如`apksigner`直观):```bashkeytool-printcert-jarfileyour_app.apk```2.**将应用放入系统镜像**:通常,预装应用需要放入系统镜像中的某个分区(如`/system`分区)下的特定目录。常见的目录包括:-`/system/app`:用于普通系统应用,不需要额外权限,安装时不弹出授权提示。-`/system/priv-app`:用于需要特权权限的系统应用,这些权限只能由预装在`priv-app`目录的应用获取。-`/vendor/app`:用于供应商提供的应用。3.**创建应用目录**:在以上对应目录下创建一个子目录(例如应用包名),然后将APK文件放入该目录。4.**签名一致性问题**:预置的第三方应用必须使用与设备上其他系统应用相同的密钥进行签名,否则系统可能无法安装或运行。因此,你需要:-使用系统签名密钥对第三方APK重新签名(如果第三方应用允许重新签名)。-或者,在设备上预置第三方应用时,设备制造商需要在系统构建过程中将第三方应用包含在内,并使用设备制造商自己的密钥重新签名。5.**重新签名步骤**(如果允许重新签名):-准备系统签名密钥(例如platform.pk8platform.x509.pem)。-使用`apksigner`工具或`signapk.jar`(Android构建工具的一部分)重新签名:```bashjava-jarsignapk.jarplatform.x509.pemplatform.pk8input.apkoutput.apk```-注意:重新签名后,原始签名将被覆盖。6.**添加配置信息**:在应用的AndroidManifest.xml中,可能需要添加一些属性以表明是系统应用:```xmlandroid:sharedUserId="android.uid.system"```或```xmlandroid:sharedUserId="android.uid.shared"```或者特权权限需要放置在`/system/priv-app`目录。7.**编译系统镜像**:将预置的应用连同其目录一起放入系统镜像,并重新构建系统镜像。8.**设备测试**:刷入新的系统镜像,验证应用是否被正确预装。9.**注意事项**:-预置应用可能需要特殊权限,需要确保在系统构建时将这些权限授予应用(通过`etc/permissions`目录下的xml文件)。-Android版本变化:从Android10开始,系统分区(如/system)通常是只读的,预装应用无法被用户卸载(除非用户获得root权限)。在Android11中,系统分区更改为使用动态分区。10.**签名版本兼容性**:从Android7.0开始,V2签名被引入,而Android11(API30)要求所有应用至少使用V2签名(V1签名可选)。同时,V3、V4签名也被引入。因此,在预置应用时,建议使用V2或更高版本的签名方案进行签名。具体步骤可能因设备制造商Android版本而异,请参考对应Android版本的官方文档。如果需要详细的操作步骤,可以参考以下步骤:###重新签名第三方APK并预置到系统镜像的步骤:1.准备系统签名密钥(例如,从你的Android构建环境中获取,通常是`build/target/product/security/`目录下的`platform.pk8``platform.x509.pem`)。2.下载或编译得到`signapk.jar`(位于`out/host/linux-x86/framework/signapk.jar`,如果使用AOSP构建环境)。3.重新签名APK:```bashjava-jarsignapk.jarplatform.x509.pemplatform.pk8input.apkoutput.apk```4.将重新签名APK放入系统镜像目录,例如:```bash#假设你的系统镜像解压目录是/systemmkdir-p/path/to/system/priv-app/MyApp/cpoutput.apk/path/to/system/priv-app/MyApp/MyApp.apk```5.重新打包系统镜像并刷入设备。注意:对于Android10及更高版本,系统分区可能使用super分区(动态分区),因此需要重新构建super.img。另外,也可以将预装应用作为模块添加到AOSP构建系统中。这需要创建一个Android.mk或Android.bp文件,以在构建系统镜像时包含该应用。例如,在`device/<manufacturer>/<device>/`目录下,创建以下结构:```<device>/prebuilts/MyApp/MyApp.apk<device>/prebuilts/MyApp/Android.mk```在`Android.mk`中:```makefileLOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=MyAppLOCAL_SRC_FILES:=MyApp.apkLOCAL_MODULE_CLASS:=APPSLOCAL_MODULE_TAGS:=optionalLOCAL_CERTIFICATE:=platformLOCAL_MODULE_SUFFIX:=$(COMMON_ANDROID_PACKAGE_SUFFIX)include$(BUILD_PREBUILT)```然后,在设备配置文件(如`<device>.mk`)中添加:```makefilePRODUCT_PACKAGES+=MyApp```这样,在构建整个系统时,该应用会被自动签名并预置到`/system/priv-app`(或根据模块定义的路径)中。以上方法适用于将第三方应用预置为系统应用,并且签名方式为V2签名(因为构建系统使用的`apksigner`会使用最新的签名方案,默认同时使用V1V2签名,你也可以在构建系统中配置只使用V2签名)。因此,总结为两种主要方法:1.手动重新签名并手动放置到系统镜像中。2.通过AOSP构建系统,将第三方应用作为预编译模块加入。推荐第二种方法,因为这样更符合系统构建流程,也便于版本管理。请根据你的具体需求选择合适的方法。§§相关问题§§1.如何验证APK签名版本(V1、V2、V3)?2.如果第三方应用禁止重新签名,如何预置到设备中?3.在AOSP中如何配置只使用V2签名方案?4.预装应用如何避免被用户卸载?5.预装应用在系统升级时的处理方式是什么?</think> ### Android V2签名预置第三方应用方法 在Android设备中预置第三方应用使用V2签名,需遵循以下步骤: #### 1. **获取应用原始APK** 获取第三方应用的未签名APK文件(通常从开发者处获得) #### 2. **生成V2签名密钥** 使用keytool生成签名密钥: ```bash keytool -genkey -v -keystore platform.keystore -alias platform -keyalg RSA -keysize 2048 -validity 10000 ``` - `platform.keystore`:密钥库文件名 - `platform`:密钥别名 #### 3. **使用V2签名方案签名** 通过apksigner工具签名(需Android SDK Build Tools 24.0.3+): ```bash apksigner sign --ks platform.keystore --v2-signing-enabled true app-unsigned.apk ``` - `--v2-signing-enabled true`:强制启用V2签名方案 #### 4. **验证签名方案** 检查签名状态: ```bash apksigner verify -v --print-certs app-signed.apk ``` 输出中应包含:`Verified using v2 scheme (APK Signature Scheme v2)` #### 5. **系统预置配置** 在AOSP源码中的设备配置文件(`device.mk`)添加: ```makefile PRODUCT_PACKAGES += YourApp PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/prebuilt/YourApp.apk:system/priv-app/YourApp/YourApp.apk ``` #### 6. **添加证书白名单** 在设备源文件(如`/etc/security/mac_permissions.xml`)添加: ```xml <signer signature="30820...(证书指纹)"> <package name="com.your.app.package"/> </signer> ``` #### 7. **系统应用权限** 如需特权权限,在`AndroidManifest.xml`添加: ```xml android:sharedUserId="android.uid.system" android:protectionLevel="signature|privileged" ``` #### 关键注意事项: 1. **系统分区位置**: - 普通应用:`/system/app/` - 特权应用:`/system/priv-app/` - OEM定制应用:`/vendor/app/` 2. **签名一致性**: - 所有预置应用必须使用**相同平台证书签名** - 系统分区应用的签名证书需在`/etc/permissions/platform.xml`注册 3. **兼容性处理**: - 同时启用V1+V2签名确保Android 6.0+兼容性: ```bash apksigner sign --ks keystore --v1-signing-enabled true --v2-signing-enabled true ``` 4. **设备启动流程**: 首次启动时Package Manager会: - 扫描系统分区APK - 验证证书链 - 授予`sharedUserId`权限 - 建立应用数据目录 > **重要**:Android 7.0+强制要求系统应用必须使用平台签名,且签名密钥需与系统build签名完全一致[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值