[Android][Google Play]Support 64-bit architectures采坑(一)

项目jni代码比较旧,好几年没维护了……
1、项目采用ndk-build编译方式
2、项目使用Android.mk、Application.mk
3、修改Application.mk中的APP_ABI

APP_ABI := armeabi-v7a arm64-v8a

4、ndk-build NDK_DEBUG=1

error: invalid argument '-std=gnu99' not allowed with 'C++'

5、修改Android.mk,移除’-std=gnu99’部分,继续编译,卡在了libyuv
6、关于libyuv与libjpeg的问题。。。这是一个超级大坑,因为最新的GitHub源代码采用了cmake的方式,于是单独编译了对应版本的so动态库,可是libyuv死活找不到部分jpeg的函数符号

zeonadmindeMac-mini-2:build zeonadmin$ make
[ 49%] Built target yuv
[ 51%] Built target yuvconvert
[ 52%] Linking CXX shared library libyuv.so
/Users/zeonadmin/GitHub/libyuv/source/mjpeg_decoder.cc:78: error: undefined reference to 'jpeg_std_error'
/Users/zeonadmin/GitHub/libyuv/source/mjpeg_decoder.cc:89: error: undefined reference to 'jpeg_CreateDecompress'
/Users/zeonadmin/GitHub/libyuv/source/mjpeg_decoder.cc:0: error: undefined reference to 'jpeg_resync_to_restart'
/Users/zeonadmin/GitHub/libyuv/source/mjpeg_decoder.cc:96: error: undefined reference to 'jpeg_destroy_decompress'
/Users/zeonadmin/GitHub/libyuv/source/mjpeg_decoder.cc:121: error: undefined reference to 'jpeg_read_header'
/Users/zeonadmin/GitHub/libyuv/source/mjpeg_decoder.cc:241: error: undefined reference to 'jpeg_abort_decompress'
/Users/zeonadmin/GitHub/libyuv/source/mjpeg_decoder.cc:516: error: undefined reference to 'jpeg_start_decompress'
/Users/zeonadmin/GitHub/libyuv/source/mjpeg_decoder.cc:542: error: undefined reference to 'jpeg_read_raw_data'
/Users/zeonadmin/GitHub/libyuv/source/mjpeg_decoder.cc:526: error: undefined reference to 'jpeg_abort_decompress'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [libyuv.so] Error 1
make[1]: *** [CMakeFiles/yuv_shared.dir/all] Error 2
make: *** [all] Error 2

用ndk的nm查看符号,全部都在,卧槽不懂了。。。
只好单独将libyuv用单个android studio project的jni来build,结果就成功了

[armeabi-v7a] Gdbserver      : [arm-linux-androideabi] libs/armeabi-v7a/gdbserver
[armeabi-v7a] Gdbsetup       : libs/armeabi-v7a/gdb.setup
[armeabi-v7a] Install        : libjpeg.so => libs/armeabi-v7a/libjpeg.so
[armeabi-v7a] Install        : libyuv.so => libs/armeabi-v7a/libyuv.so

思考了一下原因,用的ndk都是来源AndroidStudio的ndk,TOOLCHAIN应该都是clang…
使用make VERBOSE=1 查看具体的链接库信息。。。
无解。。。
****2019年6月10日 周一****
休了一周的年假回来,整个人都通透了,终于发现了原因在build.sh上:

JPEG_SHARED_LIB=${JPEG_LIB_PATH}/libjpeg.so
...
 
cmake -G"Unix Makefiles" \
    -DANDROID_ABI=armeabi-v7a \
    -DANDROID_PLATFORM=android-${ANDROID_VERSION} \
    -DANDROID_TOOLCHAIN=${TOOLCHAIN} \
    -DANDROID_ARM_MODE=arm \
    -DCMAKE_ASM_FLAGS="--target=arm-linux-androideabi${ANDROID_VERSION}" \
    -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
    -DCMAKE_C_FLAGS="${CFLAGS} -Wall -Werror -Wno-unused-parameter -fexceptions" \
    -DJPEG_INCLUDE_DIR=${JPEG_INCLUDE_DIR} \
    -DJPEG_LIBRARY=${JPEG_SHARED_LIB} \
    -DJPEG_SHARED_LIB=${JPEG_SHARED_LIB} \
    ../

注意上面的JPEG_SHARED_LIB使用的是通配符变量,这样的写法cmake链接库的时候找不到,必须给动态库写绝对路径…
7、鉴于Android的样例推荐都采用了cmake编译,于是根据原来的Android.mk,重新翻译成CMakeLists.txt,还是很方便的,就是新东西里面的变量、函数不熟,导致试错成本太高,建议从AndroidStudio新建cmake编译的工程样例开始。

[北京市积分落户]2019年积分落户填报总结

5月22日开始申报,7月20日截止;
申报第一天已填报完成,并提交,小结一下过程。

1、与2018年不同的是,登录系统改用了北京市政府官方网站的统一登录路径:北京通,申报2019年积分落户需要注册北京通账号并完成L2、L3级别的实名认证
2、今年系统数据全部需要重填,官方所谓的4项不用填写项,去年也不用填……数据本来就在他们那,但是居住、教育居然还要重填一遍,真坑,重填不说,还要重新在线审核
3、今年系统采用全部在线审核的方式,去掉了现场审核,所以必须按照填报说明,上传证明材料
4、居住指标填写,去掉了2017年1月1日以前租房项,只有自有住房、2017年以后租房备案、2017年以后单位租房可选项;自有住房填写部分,规范了房产证的填写方式,只用填写x字x号部分;自有住房配偶部分,需要根据结婚证时间,填写配偶详情并审核通过后,才能填报配偶自有住房部分;如果有离婚复婚情况的,按离婚、再婚时间分段填写配偶栏位(即使是同一人,也分段填写);另外填报完成并保存,就进入在线审核系统后台审核,大概30分钟就有结果。
5、教育指标填写,今年特意分开了国内教育和其他部分,学历认证部分还是和去年一样,使用学信网的在线电子验证码;学位认证,由于去年是申请的纸质报告,填那个报告编号就好了;学历电子码在线审核很快,10分钟不到;学位审核花了上午3个小时。
6、职住转移,系统根据居住指标,自动计算是否符合居住转移,但是需要自己输入验证码,点击后面的计算按钮,得到结果了再保存
7、其他指标都无满足,但是仍需点击新增xxx,勾选“不满足xxx”,点保存(吐槽)
8、未完成的指标项,图标会是灰色状态,不能提交/预览
9、只有全部保存成功,提交才不会提示你有xxx未填写
10、提交成功,“预览/撤回”功能才可用,表示填报完成啦,静待出分即可。

备注:
关于房产证在线审核,官方提示过了,上住建委的官方网站去查一下自己的房本是否登记在系统中,不在的赶紧去窗口登记查询。
关于租房备案审核,有ZL和GL两种编码开头,ZL的去住建委的官方网站也能查到,否则也要去对应的地方登记查询。
关于学历、学位认证的,看本站前面几篇文章有介绍如何办理认证。

[转载][Android]模拟器现已支持 AMD 处理器和 Hyper-V

原创: Google Play 谷歌开发者 Yesterday
作者:Jamal Eason, Android 产品经理

自两年前谷歌对 Android 模拟器进行重大更新以来,我们一直致力于开发出一款运行速度快、功能全面的模拟器,帮助您为用户打造卓越应用体验。Android 模拟器现已成为 Android Studio 中最受欢迎的设备 —— 使用量为 Android 实体设备的两倍以上。很高兴看到 Android 模拟器一路以来陪伴各位开发者共同成长,但是旅程才刚刚开始,我们还可能做得更好。

模拟器速度一直是 Android Studio 团队重点攻克的难题之一:在之前的几个版本中,我们相继加入快速启动和模拟器快照功能,让开发者能够在 2 秒内快速启动模拟器并恢复之前的会话。迄今为止,Android 模拟器已能够在 macOS® 以及 Linux 设备上流畅运行,但对 Windows 或者 Hyper-V 平台用户而言并非如此,Android 模拟器支持只在英特尔处理器上提供的硬件加速增强。通过在 Android 模拟器添加 AMD 处理器以及 Hyper-V 虚拟机的支持,我们在本次版本更新中顺利解决了开发者社区里这两项存在已久的用户请求。

>> 模拟器快照功能链接:
https://developer.android.google.cn/studio/run/emulator#snapshots

今天,您就可以下载最新版本 Android 模拟器,在搭载 AMD 处理器的电脑上运行 Android x86 虚拟设备。本次重要更新同时也会让应用开发者们更容易接入 Android 模拟器,不仅不会受到此前的软件模拟上的限制,还会获得硬件加速性能支持。而且,对于那些希望利用 Hyper-V 运行自己本地应用后端的用户来说,现在的 Android 模拟器也可以和 Windows 10 上 Hyper-V 支持的其他应用兼容运行。

>> 最新版本 Android 模拟器链接:
https://developer.android.google.cn/studio/run/emulator#install

得益于新的 Windows 虚拟化管理平台 (WHPX) API 以及微软开源项目上作出的努力,更多 Android 应用开发者能够体验到模拟器在速度以及功能方面的显著改进。

>> Windows 虚拟化管理平台链接:
https://docs.microsoft.com/en-us/virtualization/api/

以上技术支持最早在 Android 模拟器 v27.3.8 (金丝雀版本) 中试行,而现在我们将这些预览版特性 (AMD 处理器以及 Hyper-V 支持) 推广至稳定版,希望获得更多反馈。此外,我们还提升了模拟器快照的加载速度,让使用英特尔硬件加速执行管理器(HAXM) 的开发者将获得更好体验。

如何使用

Linux系统

若您正在使用 Linux 进行 Android 应用开发,Android 模拟器将继续使用原生 KVM 虚拟技术管理工具为英特尔以及 AMD 设备提供高速、高性能的虚拟化解决方案。Android 模拟器 v27.3.8 新增加快照用户界面,并在性能、稳定性和资源利用方面的表现更为出色。

>> KVM 虚拟技术管理工具链接:
https://www.linux-kvm.org/page/Main_Page

macOS系统

若系统为 OS X v10.10 Yosemite 或更高版本,Android 模拟器在默认情况下继续使用内置 Hypervisor.Framework,且在框架无法启动的情况下 (如系统为 OS X v10.9 或更低版本),转用英特尔硬件加速执行管理器 (HAXM)。在升级至最新 macOS 版模拟器之后,您可以使用新增的快照用户界面,并享受到性能更好、稳定性更强的 Android 模拟器。

>> Hypervisor.Framework 链接:
https://developer.apple.com/documentation/hypervisor

微软 Windows 系统

对于使用英特尔 x86 处理器的设备来说,默认情况下 Android 模拟器将继续使用硬件加速执行管理器技术 (Intel HAXM)。该技术是英特尔开发的一款较为成熟的开源虚拟化技术解决方案。此外,由于英特尔在创新研发方面的持续投入,HAXM 依旧是目前市面上最快的 Android 模拟器加速技术。请前往 Android SDK 管理器页面查看更新,下载最新版本英特尔 HAXM v7.2.0。

若您的设备使用的是 AMD 处理器,需同时满足以下条件:

AMD 处理器 —— 推荐使用 AMD 锐龙系列处理器;

Android Studio 3.2 Beta 或更高版本,点击前往 Android Studio 预览版下载页面;

Android 模拟器 v27.3.8 +,点击前往 Android Studio SDK 管理器页面下载;

x86 Android 虚拟设备 (AVD),创建虚拟设备;

Windows 10 Version 1803 四月更新版;

在 Windows 功能菜单中勾选 “Windows Hypervisor Platform”

>> Android Studio 预览版链接:
https://developer.android.google.cn/studio/preview/

>> Android Studio SDK 管理器链接:
https://developer.android.google.cn/studio/intro/update#sdk-manager

>> 创建 AVD 链接:
https://developer.android.google.cn/studio/run/managing-avds#createavd

如果您想在配有英特尔处理器的设备上并行运行 Hyper-V 与 Android 模拟器,请根据上文指示更新 Android Studio 与 Android 模拟器,同时:

在 Windows 功能菜单中勾选 “Hyper-V” —— 仅支持 Windows 10 专业版、教育版与企业版

英特尔处理器:确保您的 Intel Core 处理器支持虚拟化技术 (VT-x)、扩展页表 (ETP) 以及不受限客户机 (UG) 功能;并在 BIOS 管理设置中启用 VT-x 虚拟化选项。

阅读文档 (https://developer.android.google.cn/studio/run/emulator-acceleration),了解更多安装技巧以及错误排查细节。

概括来说:若您的 Windows 设备使用英特尔处理器,Android 模拟器将继续使用英特尔 HAXM 技术 —— 它的速度更快,同时也是我们的推荐配置;若设备使用 AMD 处理器或 Hyper-V 虚拟机进行开发,您也不妨尝试一下新的 Android 模拟器,相信它会给您带去不少惊喜。

[m3u8]关于AES-128解码的尝试

上篇文章中m3u8文件采用了AES-128的加密方式,key是16位,还有iv参数,看样子是可以将ts解码出来,直接能播放。
传统的采用pycrypto模块
pip install pycrypto

示例代码如下:

    >>> from Crypto.Cipher import AES
    >>> from Crypto import Random
    >>>
    >>> key = b'Sixteen byte key'
    >>> iv = Random.new().read(AES.block_size)
    >>> cipher = AES.new(key, AES.MODE_CFB, iv)
    >>> msg = iv + cipher.encrypt(b'Attack at dawn')

这里的key是16位的byte,iv也是16位byte,上文中的iv是字符串“0xae98961dd802f860ae9b67dd75136a18”,需要转码

from binascii import unhexlify
iv = unhexlify('ae98961dd802f860ae9b67dd75136a18')

注意去掉字符串前面的0x前缀。

解析m3u8文件有开源的库,这里推荐:
https://github.com/globocom/m3u8.git

采用cipher.decrypt()得到的ts文件和源文件一样大,但是不能直接播放。。。so,肯定是哪里出问题了。。。。

突然发现openssl直接有提供aes-128带key和iv的解码cmd工具,用这个试试:

openssl enc -d -aes-128-cbc -iv {iv的十六进制字符串} -K {key的十六进制字符串} -in {输入ts文件} -out {输出ts文件}

通过OpenSSL这个直接输出的ts文件可以播放,泪流满面。。。。。。

在网上搜了一下这俩的实现:
Implement OpenSSL AES Encryption in Python
文章中提到:
The only non-standard (and most difficult) part is the derivation of the IV and the key from the password.

关于IV和key的不是标准部分…

OpenSSL puts and expects the salt in the first 8 bytes of the encrypted payload.

点开EVP_BytesToKey函数,有详细的说明。

难道说openssl需要读取加密的ts文件头8字节作为salt?

[北京积分落户]学历学位认证流程图

https://docs.qq.com/doc/BYLK7M0MXPP207FubW07rv9133VCbW17lhCt3

注意准备材料:
1、身份证正反面复印件-扫描件(图片格式)(可以手机拍照复印件后修改)
2、学位证书扫描件(图片格式)
3、毕业证书扫描件(图片格式)

注意事项:
本地上传图片失败 – 检查文件名是否为中文或者路径包含中文,将其修改为英文就可以上传了。

下面是学位证书认证申请的提示:

附:学位认证新增“北京积分落户”为目的选项,认证时间可以压缩到了一周以内;另外学历学位认证都不再收费。。。

[ECS][WordPress][Https]WordPress迁移到HTTPS

WordPress迁移到HTTPS (原站点url为http://www.qdota.com,新url为https://www.qdota.com)

1、修改wp_options(对应的id为1和2分别是siteurl和home)
update `wp_options` set `option_value`=’https://www.qdota.com’ where `option_id`=’1′;
update `wp_options` set `option_value`=’https://www.qdota.com’ where `option_id`=’2′;

2、文章的固定链接(wp_posts表)
select * from `wp_posts` where `guid` like ‘http://www.qdota.com%’;

update `wp_posts` set `guid`=replace(`guid`,’http://www.qdota.com’,’https://www.qdota.com’) where `guid` like ‘http://www.qdota.com%’;

3、文章中引用的图片的固定链接(uploads文件目录)
找出所有用到的图片超链接
SELECT * FROM `wp_posts` WHERE `post_type` = ‘attachment’;
修改
update `wp_posts` set `post_content`=replace(`post_content`,’http://www.qdota.com’,’https://www.qdota.com’) where `post_content` like ‘%http://www.qdota.com%’;

Android[AOSP][原创]我是如何使用GCE编译AOSP源码的

在试用Google Computer Engine时,发现它的内网下载速度达到了Gb/s的飞速,于是萌生了想用GCE来编译AOSP的想法。。。
2018年1月20日周六16:00开始,申请了4vCPU+16G内存的GCE配置如下:

打开AOSP的下载说明页面:
https://source.android.com/setup/downloading
执行到git时,提示没有git,安装git:

sudo apt-get install git-core

继续执行,同步代码:

repo sync

同步中……可以看到代码下载的飞快……

到了16:30查看同步的进度:
Fetching project platform/prebuilts/qemu-kernel 56% (28897/51544)

到了17:08查看同步已经处于Checking out files了,查看CPU曲线:

到了17:12查看命令行窗口,已然结束同步:

嘎嘎,这速度是不是杠杠的,下边来进行编译(https://source.android.com/setup/building)

提示找不到make,安装:
sudo apt-get install make


提示找不到JDK6,安装:
下载Oracle jdk6版本…
设置环境变量包括CLASSPATH等等。。。

执行make -j4大约1个小时build完成。。。