一、Android.mk 文件配置签名 我们知道在 build/target/product/security 目录中有四组默认签名供,Android.mk在编译APK使用:
1、testkey:普通APK,默认情况下使用。 2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。 3、shared:该APK需要和home/contacts进程共享数据。 4、media:该APK是media/download系统中的一环。
举例说明一下
系统中所有使用android.uid.system作为共享UID的APK, 都会首先在manifest节点中增加android:sharedUserId=”android.uid.system”, 然后在Android.mk中增加LOCAL_CERTIFICATE := platform。可以参见Settings等
系统中所有使用android.uid.shared作为共享UID的APK, 都会在manifest节点中增加android:sharedUserId=”android.uid.shared”, 然后在Android.mk中增加LOCAL_CERTIFICATE := shared。可以参见Launcher等
系统中所有使用android.media作为共享UID的APK, 都会在manifest节点中增加android:sharedUserId=”android.media”, 然后在Android.mk中增加LOCAL_CERTIFICATE := media。可以参见Gallery等。
二、AS项目在系统下编译MK文件 1.MK文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 LOCAL_PATH:= $(call my-dir)/src/main include $(CLEAR_VARS) LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 LOCAL_MODULE_TAGS := optional #aidl文件引入 LOCAL_SRC_FILES := $(call all-subdir-java-files,java) \ src/com/voole/epg/cooperation/aidl/VooleAIDL.aidl #jar文件引入 LOCAL_STATIC_JAVA_LIBRARIES := umeng_ad \ afinal_ad #so库引入 LOCAL_JNI_SHARED_LIBRARIES := libaccstub \ libalgmsyoukutv #aar文件引入 LOCAL_STATIC_JAVA_AAR_LIBRARIES := inveno_meitu_ui_sdk \ inveno_detail_info_sdk LOCAL_AAPT_FLAGS += \ --auto-add-overlay \ --extra-packages com.inveno.basics \ --extra-packages com.inveno.detailinfosdk \ LOCAL_PACKAGE_NAME := Mprobe LOCAL_PROGUARD_ENABLED := full #LOCAL_PROGUARD_FLAG_FILES := proguard.flags LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := afinal_ad:libs/afinal.jar \ umeng_ad:libs/umeng-analytics-v5.5.3.jar LOCAL_PREBUILT_LIBS := libaccstub:libs/armeabi/libaccstub.so \ libalgmsyoukutv:libs/armeabi/libalgmsyoukutv.so LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += inveno_meitu_ui_sdk:libs/meitu_sdk-release_201709291605.aar \ inveno_detail_info_sdk:libs/detail_info_sdk-release.aar include $(BUILD_MULTI_PREBUILT)
2.android 系统下编译需要类库与资源的APP 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 LOCAL_STATIC_JAVA_LIBRARIES += \ android-support-v4 \ android-support-v7-recyclerview \ android-support-v7-preference \ android-support-v7-appcompat \ android-support-v14-preference \ android-support-v17-preference-leanback \ android-support-v17-leanback \ xz-java LOCAL_RESOURCE_DIR := \ frameworks/support/v17/leanback/res \ frameworks/support/v7/preference/res \ frameworks/support/v14/preference/res \ frameworks/support/v17/preference-leanback/res \ frameworks/support/v7/appcompat/res \ frameworks/support/v7/recyclerview/res \ $(LOCAL_PATH)/res LOCAL_AAPT_FLAGS := --auto-add-overlay \ --extra-packages android.support.v17.leanback:android.support.v7.preference:android.support.v14.preference:android.support .v17.preference:android.support.v7.appcompat:android.support.v7.recyclerview
三、apk重签系统名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # # # Generate by Binary Description tools # LOCAL_PATH := $(call my-dir) # For /system/priv-app directory apks SYSTEM_PRIV_APP_DIR_PREFIX:=priv-# # If the PLATFORM_VERSION is 4.0.x 4.1.x 4.2.x 4.3.x, no priv-app support ifneq ($(filter 4.0% 4.1% 4.2% 4.3%,$(strip $(PLATFORM_VERSION))),) # Revert to "" SYSTEM_PRIV_APP_DIR_PREFIX:=# endif #end of filter APP_SUFFIX := .apk PREBUILT_APPS := $(subst $(APP_SUFFIX),,$(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/*$(APP_SUFFIX)))) $(foreach t,$(PREBUILT_APPS), \ $(eval include $(CLEAR_VARS)) \ $(eval LOCAL_MODULE := $(t) )\ $(eval LOCAL_MODULE_TAGS := optional)\ $(eval LOCAL_SRC_FILES := $(t)$(APP_SUFFIX) )\ $(eval LOCAL_MODULE_CLASS := APPS) \ $(eval LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)) \ $(eval LOCAL_CERTIFICATE := platform) \ $(eval include $(BUILD_PREBUILT)) \ )
四、keystore与pk8+x509.pem转换 1.keystore文件转换格式为pk8+x509.pem 第一步 先v把keystore文件转换为pkcs12格式 1 keytool -importkeystore -srckeystore debug.keystore -destkeystore tmp.p12 -srcstoretype JKS -deststoretype PKCS12
第二步 将PKCS12 dump成pem 这样就可以按照文本形式查看了 1 openssl pkcs12 -in tmp.p12 -nodes -out tmp.rsa.pem
接下来打开文件intermediate.rsa.pem 看到 PRIVATE KEY 还有CERT PS:private 那边可能有RSA KEY 这个不用管 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Bag Attributes friendlyName: androiddebugkey localKeyID: 54 69 6D 65 20 31 33 38 38 39 37 38 34 32 36 38 36 39 Key Attributes: <No Attributes> -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY----- Bag Attributes friendlyName: androiddebugkey localKeyID: 54 69 6D 65 20 31 33 38 38 39 37 38 34 32 36 38 36 39 subject=/C=US/O=Android/CN=Android Debug issuer=/C=US/O=Android/CN=Android Debug -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- 复制“BEGIN CERTIFICATE” “END CERTIFICATE” 到(新建个文件) cert.x509.pem [ pem里面内容(下的一样): -----BEGIN CERTIFICATE----- 。。。。 -----END CERTIFICATE----- ] 复制 “BEGIN RSA PRIVATE KEY” “END RSA PRIVATE KEY” 到(同上) private.rsa.pem
第三 生成pk8格式的私钥 1 openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 -nocrypt
完毕 收集文件 cert.x509.pem private.pk8 其余的中间文件删除即可
2.pk8+x509.pem文件转换格式为keystore 1.把pkcs8格式的私钥转换为pkcs12格式:
1 $ openssl pkcs8 -in testkey.pk8 -inform DER -outform PEM -out testkey.priv.pem -nocrypt
2.生成pkcs12格式的密钥文件:
1 $ openssl pkcs12 -export -in testkey.x509.pem -inkey testkey.priv.pem -out testkey.pk12 -name androiddebugkey
(注:此过程中需要输入密码:android)
3.生成keystore:
1 $ keytool -importkeystore -deststorepass android -destkeypass android -destkeystore debug.keystore -srckeystore testkey.pk12 -srcstoretype PKCS12 -srcstorepass android -alias androiddebugkey