系统签名
在AOSP 中,package/apps/ 下面的app 会进行系统签名,拥有系统签名后,就可以干一些三方app不能干的时候。但是一般非厂商或者厂商合作方也无法进行系统签名。
源码环境下签名
App源码编译
如果你直接将app源码放在AOSP下编译,可以参考package/apps下任意 app Android.mk 即可
// Bluetooth/Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := Bluetooth
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_CERTIFICATE := platform // 注意此处 使用的是平台证书
LOCAL_USE_AAPT2 := true
LOCAL_JNI_SHARED_LIBRARIES := libbluetooth_jni
LOCAL_JAVA_LIBRARIES := javax.obex telephony-common services.net
LOCAL_STATIC_JAVA_LIBRARIES := \
com.android.vcard \
bluetooth.mapsapi \
sap-api-java-static \
services.net \
libprotobuf-java-lite \
bluetooth-protos-lite
LOCAL_STATIC_ANDROID_LIBRARIES := android-support-v4
LOCAL_REQUIRED_MODULES := libbluetooth
LOCAL_PROGUARD_ENABLED := disabled
include $(BUILD_PACKAGE)
APK编译
在无源码,只有apk环境下。可以对此apk进行预编译。用平台证书签名对其重新签名。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Test
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)
非源码环境下签名
这种方法会更加便捷的调试,也是我想推荐的方式。将平台的证书做成 .jks,同时在AndroidManifest.xml 设置android:sharedUserId=“android.uid.system” ,配合gradle 方便打包生成的apk就可以得到系统级别的app。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.me.test"
android:sharedUserId="android.uid.system"
>
...
</manifest>
是不是很赞,跟着下面的步骤:
获取platform.pk8 & platform.x509.pem
在AOSP 目录下 build\target\product\security
生成密钥
此处给出通过AndroidStudio生成密码。通过keytool 的方式可以自行百度& Google。
-
1 Build-> Generate Signed Bundle/ APK…
-
2 Next
-
3 Create New
-
4 New Key Store
选择好 key store path, 填完以上的信息。 点击 OK 就可以生成 .jks 密钥。
keytool-importkeypair
我们需要使用此工具将刚才生成的密钥 使用 platform.pk8 & platform.x509.pem 重新签名。Github上的工作地址如下:
github_keytool-importkeypair
执行一下命令
./keytool-importkeypair -k test.jks -p 123456 -pk8 platform.pk8 -cert platform.x509.pem -alias test
# -k test.jks // -k 属性表示签名 test.jks 对应签名文件
# -p 123456 // -p 属性表示密码 123456 生成密钥输入的密码
# -pk8 platform.pk8 -cert platform.x509.pem // 系统签名文件
在Gradle中添加相关属性
在As Project中新建一个config的文件夹放置刚才生成的test.jks。目录结构如下:
在App 这个module下的build.gradle 中添加 signingConfigs属性
signingConfigs {
config {
keyAlias 'test' //密钥别名
keyPassword '123456' //密钥的密码
storeFile file(rootDir.getAbsolutePath() +'/config/test.jks') //密钥位置
storePassword '123456'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
}
编译
点击build 可以编译出debug& release 版本。这样得到拥有系统签名的app
以上。Over