androidopenssl编译
❶ OpenSSL的编译和使用
个人博客地址: https://blog.yookingh.cn
该文章地址: https://blog.yookingh.cn/dev/201215-openssl.html
从NDK r19开滑知始,由于gcc兼容clang的编译方式有问题,该版本乎高已经移除了相关gcc文件,所以用老方法交叉编译Openssl的时候,会提示找不到gcc文件。
参考: https://blog.csdn.net/zoujin6649
build-android-single.sh 脚本文件及注释如下岁让尺
执行脚本
修改脚本为 循环编译 ,编译所有需要的文件
build-android-all.sh 脚本文件内容如下
执行脚本方法同上,如为第一次执行(即没有Makefile文件),仍需要执行 ./config 循环编译无需执行 make clean
参考: https://blog.csdn.net/iamadk
Python 脚本内容
创建编译执行脚本
执行编译脚本同r15,第一次需要执行 ./config 生成Makefile,第二次或以上需要清除make记录即 make clean ,接下来依旧是创建 循环编译 脚本
❷ 编译调试Android系统原生App - 以Settings为例
本文已过时,最新文章:向大家推荐《使用 AS 开发 System App》 https://xiaozhuanlan.com/system-app
Android原生系统带有许多原生的App,比如 浏览器、录音机、计算器、设置 等,有些时候,我们需要用到一些系统的功能,或者是对已有的功能做二次开发,比如我上学时给一个公司做过一个Launcher和Wizard,就需要用到系统设置中的某些功能,比如Wifi、声音、显示等功能,于是就需要从Settings源码中提取出需要的功能。
特别是公司自己定制Android系统,需要在上面做一些 系统级的App 的时候,原生App已有的功能就可以通过编译其源码的方式直接拿过来改改就能用,而且可用度很高。
这里有两种情况,分为 原生 的和 公司定制 的系统。无论是原生的还是定制的,类似于Settings这样需要使用到 系统级或隐藏API 的App,都需要系统签名文件和编译系统源码后得到相应的jar包才可以在IDE中编译,因为标准SDK根本没有那些API可供调用。
举个栗子:
需要额外的Jar就需要自己编译系统源码啦,这个是比较麻烦的,有兴趣可以试试自己编译定制自己的Android系统。
** 注意,既然是定制的,源码、jar、签名文件,还有系统都是一一对应的,你不能拿其他公司的系统签名来给你公司的系统app签名,这样无法运行的。 **
有了源码,下一步当然是要跑起来啦。
建议都使用Eclipse来编译,不要使用AS,因为AS编译大型的原生App能卡到你吐血,而且出错提示也不友好。但是用过AS的人都不想再碰Eclipse了有没有??别急,可以先用Eclipse编译过了,再贴到AS中,这样好很多,也很节省时间。
初始化:
放入源码:
修正res错误:
修正src错误:
使用到系统级API的,或者AndroidManifest.xml文件中声明了
那么没有系统签名,直接debug签名运行是不行的,需要向底层工程师要系统的签名文件,在源码目录
build\target\proct\security
下的 platform.pk8 和 platform.x509.pem ,如果你想看此次编译Settings是否已成功了,可以适当的在入口加一下Log,然后导出未签名的apk,使用系统签名进行签名后,放到 /system/app/ 下替换掉Settings.apk,然后重启系统,打开设置,看看Logcat是否输出里加入的Log。
在不知道系统签名可以转换成debug签名前,老实说我一直都是用Log的方式调试,太特么痛苦了。现在知道后整个人都懵逼了。
我们都希望可以像调试普通app那样调试系统app,以下是如何通过 openssl 将 platform.pk8 和 platform.x509.pem 转换成 debug.keystore 文件:
三个命令
此方法来自: http://curlog.com/2016/08/30/android-pk2debug-keystore/
Mac自带openssl,Linux和Win需要安装。
然后就可以使用得到的debug签名配置到eclipse后愉快的调试啦,当然,得先把系统中已经存在的app先删除掉。然后重启系统,至于如何配置eclipse的debug签名,请Google。
使用过AS后,当然希望在AS中也可以调试系统App,抽空再写篇相关编译和调试的文章。如果这篇文章帮到你了,给个赞呗。
❸ 如何生成release版本的Android系统
1.使用platform密钥对apk进行签名
1.1.进入<Android_Source_Path>/build/target/proct/security,找到【platform.pk8】和【platform.x509.pem】系统密钥。
1.2.进入<Android_Source_Path>/build/tools/signapk找到SignApk.java,运行javac编译成SignApk.class
1.3.执行命令java com.android.signapk.SignApk platform.x509.pem platform.pk8 input.apk output.apk
至此,完成。
2. 对1的补充:
<Android_Source_Path>/build/target/proct/security下有多对密钥,详细如下:
The following commands were used to generate the test key pairs:
development/tools/make_key testkey '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/[email protected]'
development/tools/make_key platform '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/[email protected]'
development/tools/make_key shared '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/[email protected]'
development/tools/make_key media '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/[email protected]'
The following standard test keys are currently included:
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.
These test keys are used strictly in development, and should never be assumed
to convey any sort of validity. When $BUILD_SECURE=true, the code should not
honor these keys in any context.
signing using the openssl commandline (for boot/system images)
--------------------------------------------------------------
1. convert pk8 format key to pem format
% openssl pkcs8 -inform DER -nocrypt -in testkey.pk8 -out testkey.pem
2. create a signature using the pem format key
% openssl dgst -binary -sha1 -sign testkey.pem FILE > FILE.sig
extracting public keys for embedding
------------------------------------
it's a Java tool
but it generates C code
take a look at commands/recovery/Android.mk
you'll see it running $(HOST_OUT_JAVA_LIBRARIES)/mpkey.jar
3.对3的补充:
在运行第三步的命令前,请在当前的工作目录下新建如下结构的文件夹:com.android.signapk,然后将第二步编译生成的SignApk放入该目录下。或者也可以将SignApk.java的package声明删除后再运行javac编译。
命令java com.android.signapk.SignApk platform.x509.pem platform.pk8 input.apk output.apk
不单可以对apk文件进行重签名,也可以对所有的zip文件进行重签名,包括ROM文件。
网上Android数字签名大多是与Android APK相关,而介绍Android系统签名的方法却不多。正巧前段时间帮别人做CTS 认证,需要用到给Android系统签名。
为什么需要给Android系统签个名才能进行CTS认证呢?原来通过make -j4编译出来的system.img使用的是test key,这种类型的key只适用于开发阶段,而且这种秘钥是公开的,谁都可以使用。当发布一款android产品,就需要另外给整个系统签个名,防止被别人盗用。这种系统就是release版本的Android系统。
下面就详细介绍下整个过程。
1、生成加密key文件
要对Android系统进行签名,需要生成四种类型的key文件。
a)releasekey
b)media
c)shared
d)platform
就拿releasekey为例简单介绍下生成过程。
1)进入/android_src/development/tools目录。
/development/tools$ ls
apkcheck etc1tool hosttestlib jdwpspy makedict mkstubs
axl finnused idegen line_endings make_key monkeyrunner zoneinfo
2)使用make_key工具生成签名文件
development/tools$ sh make_key releasekey '/C=CN/ST=JiangSu/L=NanJing/O=Company/OU=Department/CN=YourName/emailAddress=YourE-mailAddress'
Enter password for 'releasekey' (blank for none; password will be visible): mypassword <------- 设置密码
creating platform.pk8 with password [mypassword]
Generating RSA private key, 2048 bit long molus
...............+++
........................................................+++
e is 3 (0x3)
这里要顺便介绍下make_key的参数。第一个参数是要生成key的名字,第二个参数是关于公司的信息。
key的名字很好理解,就是前面提到的4中类型的key,公司信息的参数比较多,它们的含义如下:
C ---> Country Name (2 letter code)
ST ---> State or Province Name (full name)
L ---> Locality Name (eg, city)
O ---> Organization Name (eg, company)
OU ---> Organizational Unit Name (eg, section)
CN ---> Common Name (eg, your name or your server’s hostname)
emailAddress ---> Contact email address
这样就生成了一组releasekey,另外3种类型的key的生成方法也基本一样。
生成后的结果如下:
/development/tools$ ls
makedict media.pk8 mkstubs platform.pk8 releasekey.pk8 shared.pk8
make_key media.x509.pem platform.x509.pem releasekey.x509.pem shared.x509.pem
*.pk8是生成的私钥,而*.x509.pem是公钥,生成时两者是成对出现的.
2 、 把pk8和x509.pem文件拷贝到vendor/Mol/security/proct_mol目录
/android_src/vendor/Mol/security/proct_mol$ cp ../../../../development/tools/*.pk8 ./
/android_src/vendor/Mol/security/proct_mol$ cp ../../../../development/tools/*.pem ./
这一部虽然不是必须的,但最好还是这样做下,由于牵涉到项目的原因,产品和产品型号就用Mol和proct_mol代替了.
3 、 回到根目录android_src
/android_src/vendor/Mol/security/proct_mol$ cd ../../../../
大家看后肯定觉得这一步很多余,根本没有必要单独提出来,但后来证明把这步提下还是很有必要的,因为第5步的操作必须要在根目录下执行,不然会出错.
4 、编译系统
/android_src$ make -j4 PRODUCT-proct_mol-user dist
这个怎么跟平时的编译不一样,后面多了两个参数PRODUCT-proct_mol-user 和 dist. 编译完成之后回在/android_src/dist/目录内生成个proct_mol-target_files开头的zip文件.这就是需要进行签名的文件系统.
5 、开始签名
android_src$ ./build/tools/releasetools/sign_target_files_apks -d vendor/Mol/security/proct_mol/ out/dist/proct_mol-target_files.zip out/dist/signed_target_files.zip
ERROR: no key specified for:
CalendarWidget.apk
Contacts_yellowpage.apk
SnsAppMain.apk
fbandroid-1.5.0.apk
AnalogClockWidget.apk
MessageWidget.apk
NewsWidget.apk
上面的意思是使用sign_target_files_apks工具采用vendor/Mol/security/proct_mol/下的key对proct_mol-target_files.zip文件进行签名,并把签名结果放在out/dist/signed_target_files.zip里.
从上面的签名结果看,签名并没有成功,原因是由于有些apk程序已经签过名了或者找不到对应的key. 可以通过设置过滤,不对上面的程序进行签名.方法如下:
通过参数"-e <apkname>=" 来过滤这些程序.
android_src$ ./build/tools/releasetools/sign_target_files_apks -d vendor/Mol/security/proct_mol/ -e CalendarWidget.apk= -e Contacts_yellowpage.apk= -e SnsAppMain.apk= -e fbandroid-1.5.0.apk= -e AnalogClockWidget.apk= -e MessageWidget.apk= -e NewsWidget.apk= out/dist/proct_mol-target_files.zip out/dist/signed_target_files.zip
Enter password for vendor/Mol/security/proct_mol//media key> <----- imput the password
Enter password for vendor/Mol/security/proct_mol//platform key> <----- imput the password
Enter password for vendor/Mol/security/proct_mol//releasekey key> <----- imput the password
Enter password for vendor/Mol/security/proct_mol//shared key> <----- imput the password
rewriting RECOVERY/RAMDISK/default.prop:
replace: ro.build.tags=test-keys
with: ro.build.tags=release-keys
NOT signing: CalendarWidget.apk
NOT signing: Contacts_yellowpage.apk
signing: Mms.apk
signing: SoundRecorder.apk
signing: AccountAndSyncSettings.apk
signing: Camera.apk
.......................................................................
rewriting SYSTEM/build.prop:
replace: ro.build.tags=test-keys
with: ro.build.tags=release-keys
replace: ro.build.description= test-keys
with: ro.build.description= release-keys
replace: ro.build.fingerprint=...........................
with: ro.build.fingerprint=.............................
signing: framework-res.apk
done.
这样就完成了android系统的签名工作.
6 、生成image文件
android_src$ ./build/tools/releasetools/img_from_target_files out/dist/signed-target-files.zip out/dist/signed-img.zip
creating boot.img...
creating recovery.img...
creating system.img...
creating userdata.img...
cleaning up...
done.
使用img_from_target_files工具生成signed-img.zip文件.signed-img.zip文件包含了boot.img,userdate.img,system.img文件等.
7 、通过fastboot下载signed-img.zip文件
fastboot update signed-img.zip
通过fastboot就可以把签了名的系统文件下载到手机上了。
❹ 如何把openssl库在VxWorks下进行编译或者说把openssl库编译成vxworks下能用的.a库文件,如何去做
下一个完整版的cygwin,免费开源的东西,官网上就有下的
然后将工程文件拷入cygwin工作目录
在cygwin控制台下CD到工程目录
与上面那些步骤同时,先进入Tornado的host/x86-win32/bin目录,把该目录下的cygwin1.dll删除或者重命名(建议保留,因为Tornado编译还要用这个),然后把这个bin目录设置到windows的path环境变量中。记下bin目录下所用的编译器cc和归档程序ar的名字(比如PPC的架构就叫ccppc和arppc)
再在cygwin控制台下输入 CC=ccppc AR=arppc ./configure 运行(PPC为例,如果为其他架构等号后面的值做相应修改)
等配置完毕后打开生成的Makefile文件 找到-IInclude这一个flag修改成-I/cygwindriver/e/tornado/target/h (这里目录也只是举例,根据自己情况修改)
再之后加上-I/lib/include
保存
再在cygwin控制台下输入make运行
这时候应该就可以开始编译了
但是光做这些修改可能还是会多多少少的报错
移植细节我这一时半会也没办法细说 只能自己看报错来改了
❺ 在MACOX上的ANDROIDSTUDIO如何编译OPENSSL原生的C库成动态的.SO库
目前暂不支持开发工具编译C、c++代码生成so文件,应该后续版本会有的。
.so 为共享库,是shared object,用于动态连接的,和dll差不多,可以这样调用so文件:
调用 System.out.println(System.getProperty("java.library.path"));
得到/usr/java/jdk1.5.0_13/jre/lib/i386,将SO文件放在该目录下
运行java程序,输出了由C语言函数计算出的结果
❻ android 怎么使用自己编译的openssl
项目上面右击如图:
❼ 求问怎么编译OpenSSL,得到libssl.a 和libcrypto.a,跪求
如何在Windows下编译OpenSSL (VS2010使用VC10的cl编译器)
1、安装ActivePerl//初始化的时候,需要用到perl解释器
2、使用VS2010下的Visual Studio 2010 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)
3、解压缩openssl的包,进入openssl的目录
4、perl configure VC-WIN32
尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。
5、ms\do_ms.bat
在解压目录下执行ms\do_ms.bat命令
6、nmake -f ms\ntdll.mak
7、nmake -f ms\nt.mak
编译后
在openssl解压目录下执行,完成编译后。输出的文件在out32dll (6), out32 (7)里面,包括应用程序的可执行文件、lib文件和dll文件
注意:在运行第五步时,cl编译器会抱怨说.\crypto\des\enc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码error C2220,于是上MSDN上查找:
warning treated as error - no object file generated
/WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated.
是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。
于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。。。
继续执行nmake -f ms\ntdll.mak
=================================
一、编译并安装OpenSSL
1、按照标准步骤从源代码编译安装OpenSSL
在编译OpenSSL前,需要正确安装Perl,因为在编译OpenSSL时需要使用到该程序。
下载最新版本的Perl然后安装之。
下载最新版本的OpenSSL
然后将源码解压缩到某个目录(如 C:\openssl-0.9.8j)中。
进入openssl源码目录。
cd c:\openssl-1.0.1e
以下为参照该目录下的文件INSTALL.W32的执行过程:
运行configure:
perl Configure VC-WIN32
创建Makefile文件:
ms\do_ms.bat
编译动态库:
nmake -f ms\ntdll.mak
编译静态库:
nmake -f ms\nt.mak
测试动态库:
nmake -f ms\ntdll.mak test
测试静态库:
nmake -f ms\nt.mak test
安装动态库:
nmake -f ms\ntdll.mak install
安装静态库:
nmake -f ms\nt.mak install
清除上次动态库的编译,以便重新编译:
nmake -f ms\ntdll.mak clean
清除上次静态库的编译,以便重新编译:
nmake -f ms\nt.mak clean
2、如果嫌麻烦,不想编译,可以直接用别人做好的windows OpenSSL 安装包(我用的是0.9.8j版),
可以下载 OpenSSL for Windows,直接安装。
P.S. OpenSSL for Windows 的源代码有一些数据类型和VC6的编译器不兼容,我发现的不兼容的数据类型如下:
在OpenSSL安装目录的下的include/bn.h文件中,将
#define BN_ULLONG unsigned long long
#define BN_ULONG unsigned long long
#define BN_LONG long long
分别修改为:
#define BN_ULLONG ULONGLONG
#define BN_ULONG ULONGLONG
#define BN_LONG LONGLONG
否则,会出现编译错误。
二、使用OpenSSL
在VC中配置使用以上的函数库:
点击菜单:Tools -> Options,弹出对话框"Options",在该对话框中选择"Directories"标签。
在"Show directories for:"的"Include files"选项中新增目录"C:\openssl\include";
"Library files"选择中新增目录"C:\openssl\lib"。
然后在需要链接OpenSSL函数库的工程中加入如下两句:
#pragma comment(lib, "ssleay32.lib")
#pragma comment(lib, "libeay32.lib")
其作用是将OpenSSL所需的库导入工程中。
三、问题
我在链接OpenSSL的静态函数库时遇到类似以下的问题:
Linking...
msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj)
...
这是由于OpenSSL的静态函数库使用的是了VC的多线程DLL的Release版本,而我的程序使用了多线程静态链接的Release版本。
调整OpenSSL的静态函数库使用的库函数版本即可,调整过程如下:
编辑文件 ms\nt.mak,将该文件第19行
"CFLAG= /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -
D_CRT_NONSTDC_NO_DEPRECATE /Fdout32 -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_TLSEXT -DOPENSSL_NO_KRB5 -
DOPENSSL_NO_DYNAMIC_ENGINE"
中的"/MD"修改为"/MT"。然后重新编译安装OpenSSL即可。
四、附录:在VC中对C/C++ 运行时库不同版本编译指令说明
《在VC中对C/C++ 运行时库不同版本编译指令说明》一文中详细介绍了连接不同版本库的编译指令如下:
C Runtime Library:
/MD MSVCRT.LIB 多线程DLL的Release版本
/MDd MSVCRTD.LIB 多线程DLL的Debug版本
/MT LIBCMT.LIB 多线程静态链接的Release版本
/MTd LIBCMTD.LIB 多线程静态链接的Debug版本
/clr MSVCMRT.LIB 托管代码和非托管代码混合
/clr:pure MSVCURT.LIB 纯托管代码
C++ Standard Library:
/MD MSVCPRT.LIB 多线程DLL的Release版本
/MDd MSVCPRTD.LIB 多线程DLL的Debug版本
/MT LIBCPMT.LIB 多线程静态链接的Release版本
/MTd LIBCPMTD.LIB 多线程静态链接的Debug版本
===============================================
一 配置编译参数
配置编译参数是进行OpenSSL编译的第一步,这一步可以确定系统的环境,使用什么编译器,默认安装路径以及其他一些选项.步骤如下:
1.安装perl:下载ActivePerl-5.8.8.822-MSWin32-x86-280952.msi,然后点击msi文件进行安装!
2..配置编译参数:下载openssl-1.0.1e.tar.gz,解压.
vc:首先在C:\Program Files\Microsoft Visual Studio .NET 2010\VC10\bin\目录下执行vcvars32.bat,然后在解压后的openssl-1.0.1e目录,执行命令配置编译参数:perl Configure VC-WIN32
bc:在解压后的openssl-0.9.8g目录下执行:perl Configure BC-32
二 生成批处理文件
在使用configure脚本配置好的编译参数后,就可以使用批处理命令来生成编译脚本.生成编译脚本根据采用编译器的不同通常使用不同的批处理文件.就目前来说,使用vc编译的时候有三种选择:do_ms,do_masm和do_nasm来创建一系列编译脚本文件,即.mak脚本.步骤如下:
vc:在openssl-1.0.1e目录下,执行命令来批处理文件:do_ms,do_masm和do_nasm
bc:1.下载nsm09839.zip微软汇编编译器,解压,拷贝到c:/windows目录下,修改名称为nasmw.exe;2.在openssl-1.0.1e目录下,执行命令来批处理文件:ms\do_nasm
三 代码编译
vc:
完成上面步骤后,可以看到两个关键脚本文件:nt.mak和ntdll.mak.如果我们需要编译后的OpenSSL库是支持动态DLL形式的,那么应该使用ntddll.mak文件进行编译,这样编译完成我们会得到四个与OpenSSL的API库有关文件:ssleay32.lib,libeay32.lib,ssleay32.dll和libeay32.dll.执行的编译命令形式如下:nmake -f ms\ntdll.mak
如果不希望以动态库的形式使用OpenSSL,那么可以使用nt.mak文件进行编译.这样编译后使用OpenSSL的时候,回直接将代码链接进我们的程序里面.执行命令如下:nmake -f ms\nt.mak
bc:执行命令来完成代码编译:make -f ms\bcb.mak
四 ELSE
1)
测试动态库:
nmake -f ms\ntdll.mak test
测试静态库:
nmake -f ms\nt.mak test
安装动态库:
nmake -f ms\ntdll.mak install
安装静态库:
nmake -f ms\nt.mak install
清除上次动态库的编译,以便重新编译:
nmake -f ms\ntdll.mak clean
清除上次静态库的编译,以便重新编译:
nmake -f ms\nt.mak clean
2)
使用OpenSSL
在VC中配置使用以上的函数库:
点击菜单:Tools -> Options,弹出对话框"Options",在该对话框中选择"Directories"标签。
在"Show directories for:"的"Include files"选项中新增目录"C:\openssl\include";"Library files"选择中新增目录"C:\openssl\lib"。
然后在需要链接OpenSSL函数库的工程中编译时加入"libeay32.lib"就可以了。