如何通过Android CTS测试—testPackageSignatures

解决此问题时在网上搜了很多资料,但都很零碎,没有找到非常完整的解决方案,在此把解决方法和大家分享一下:

 

CTS测试的错误如下:

junit.framework.AssertionFailedError: These packages should not be signed with a well known key: [com.android.pts.browser] at android.security.cts.PackageSignatureTest.testPackageSignatures  ........      (PackageSignatureTest.java:62)

错误原因是APK使用了默认签名,需要使用自定义的签名。

 

android源码编译使用的默认key:

android\build\target\product\security\    .pk8   .pem 文件

 

参考:

http://blog.csdn.net/chen_chun_guang/article/details/6325833

http://www.cnblogs.com/ok-lanyan/archive/2013/04/02/2995462.html

http://www.cnblogs.com/leaven/p/3860583.html

 

解决方法:

1. 生成加密key文件:

将/android_src/development/tools/生成的key   COPY到android\build\target\product\security\ 

 

2. 编译android源码

重新编译android源码,此时out/.../system/app下就是重新编译的APK

重新构建NFS挂载使用的根文件系统再次测试

 

3. 单个APK的签名

重新测试时发现com.android.pts.browser包还是PASS不了,查看out/.../system/app/下的APK文件,发现在步骤2中,

out/.../system/app/PtsDeviceBrowserLauncher.apk没有重新生成,还是原来的。

不知道为啥没有重新生成? 我的解决方法是对此APK单独签名,将signapk.jar   及自签名密匙,platform.pk8  platform.x509.pem COPY到下面路径并

cd  /out/target/product/xxxx/obj/APPS/PtsDeviceBrowserLauncher_intermediates

文件位置:可以在platform/build/target/product/security/中找到platform.pk8 platform.x509.pem等签名文件,对应不同的权限。
signapk.jar:由/platform/build/tools/signapk/编译产出,可以在/out/host/linux-x86/framework/中找到。

然后运行下面命令 :
 #   java -jar signapk.jar  platform.x509.pem  platform.pk8  package.apk.unsigned  PtsDeviceBrowserLauncher.apk

package.apk.unsigned  表示未签名的该APK文件, 重新签名后为PtsDeviceBrowserLauncher.apk  //签过名的APK重新签名可能会出错,最好找到未签名的APK

 

其他参考:
签名:
java -jar signapk.jar platform.x509.pem platform.pk8 MyDemo.apk MyDemo_signed.apk 得到具有对应权限的APK

优化APK:
zipalign -v 4 MyDemo_signed.apk MyDemo_new.apk

查循APK是否优化过:
zipalign -c -v 4 MyDemo.apk

 

 

上面是我之前总结的文档,当时解决此测试问题的时候自己将生成的key替换了android\build\target\product\security\ 下面原有的key, 其实这种方法不好。

应该将生成的key放到android\vendor\Modul\security\project_XXXX下面,  同时配置默认的key  为此路径。

 

可以在

android/build/core/config.mk 或者

android\device\company\project_xxx.mk 中添加如下code:

ifeq (user,$(TARGET_BUILD_VARIANT))
PRODUCT_DEFAULT_DEV_CERTIFICATE := vendor/Modul/security/project_xxxxx/releasekey
endif

这样当编译user版本的时候会使用指定的key, 也可以去掉条件限制任何版本都使用指定key.

 

 android/build/core/config.mk中

# The default key if not set as LOCAL_CERTIFICATE
ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
  DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)
else
  DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkey
endif

从上面code可以知道如果没有定义PRODUCT_DEFAULT_DEV_CERTIFICATE 则默认使用的key就是build/target/product/security/testkey

此外。, 还有个external/sepolicy/keys.conf文件修改为使用releasekey.

[@RELEASE]
ENG       : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem
USER      : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem

注意上面的路径在下面有变更, get 路径名了

./external/sepolicy/Android.mk:296:     $(hide) DEFAULT_SYSTEM_DEV_CERTIFICATE="$(dir $(DEFAULT_SYSTEM_DEV_CERTIFICATE))" \

 

那么所有的apk都会使用releasekey签名吗 ?

不是的, 如果*.mk 文件中定义了LOCAL_CERTIFICATE则会使用定义内容的key

ifeq (eng,$(TARGET_BUILD_VARIANT))
LOCAL_CERTIFICATE := PRESIGNED //表示使用此APK原始签名
else
LOCAL_CERTIFICATE := platform
endif

此mk文件中如果编译usr版本就使用platform key

怎么找到对应的platform key的呢? 

/build/core/prebuilt_internal.mk:149:      LOCAL_CERTIFICATE := $(dir $(DEFAULT_SYSTEM_DEV_CERTIFICATE))$(LOCAL_CERTIFICATE)

./build/core/package_internal.mk:350:    LOCAL_CERTIFICATE := $(dir $(DEFAULT_SYSTEM_DEV_CERTIFICATE))$(LOCAL_CERTIFICATE)

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值