ubuntu 20.04将Python3交叉编译移植到Android平台

最近想在Android环境中集成Python3,参考了一下网上的实现,发现已经有项目实现这个功能的,具体的编译过程参考下面:

参考链接


ubuntu 20.04编译Android 11源代码&模拟器

Android 11 系统映像可直接将 ARM 指令转换成 x86 指令,因此以前很多需要真机测试的情况,现在只需要模拟器就可以进行操作了。

不过,根据官方博客 Run ARM apps on the Android Emulator 尾部的一段注意事项:

Note that the ARM to x86 translation technology enables the execution of intellectual property owned by Arm Limited. It will only be available on Google APIs and Play Store system images, and can only be used for application development and debug purposes on x86 desktop, laptop, customer on-premises servers, and customer-procured cloud-based environments. The technology should not be used in the provision of commercial hosted services.

这段事项说明,自己编译的镜像是没办法用上这个功能的,必须是Google编译好的镜像。

由于众所周知的原因,我们是没办法正常下载Android的源代码的,因此只能使用国内的镜像来操作了。

1.安装repo工具以及依赖

2.在需要存储代码的地方创建文件夹

3.使用镜像下载Android源代码

清华大学的镜像

4.Android 模拟器编译(可选)

编译完成之后,产生的模拟器可执行文件及库文件都位于external/qemu/objs/android目录下:

后面就可以像执行 SDK 中的模拟器那样,执行我们编译的模拟器了:

5.列出android-11全部分支

6.编译Android 11系统镜像

7.引入编译环境变量

8.设置编译目标,此处我们指定编译x86_64下的完整调试版本

9.如果需要跟踪调试代码,建议编译为调试类型

10.编译

注意此处如果发生编译失败,原因基本上是编译顺序导致的引用出错,也就是某些模块还没有编译完成,其他模块已经开始尝试链接,导致依赖错误,此时只要把多线程并发编译修改成单线程编译即可,即直接执行

如果由于内存不足导致的编译失败,可以增加物理内存。但是如果内存无法增加的话,那么适当增加交换分区/交换文件的大小(建议配置16GB以上的交换分区)可以解决此问题,只是编译速度会下降。

运行镜像

选择system-qemu.img和vendor-qemu.img,这两个镜像是专门为qemu运行制作的,如果选择system.img 和vendor.img,则avd运行失败。

上面运行起来的镜像是从~/AndSrc/aosp/out/debug/target/product/generic/hardware-qemu.ini即可读取配置信息的,但是这个文件直接修改无效,我们如果需要修改参数,只能从启动参数中设置。
比如我们如果需要增大内存,开启GPU的支持,则执行如下命令:

编译支持ARM应用的镜像

尽管根据

Note that the ARM to x86 translation technology enables the execution of intellectual property owned by Arm Limited. It will only be available on Google APIs and Play Store system images, and can only be used for application development and debug purposes on x86 desktop, laptop, customer on-premises servers, and customer-procured cloud-based environments. The technology should not be used in the provision of commercial hosted services.

我们自己编译的镜像是没办法直接从源代码编译支持安装运行 ARM 应用的。

但是有两个变通方案:

  1. Google官方的 Android 11 镜像中提取需要的文件塞到我们自己编译的镜像里,参考方案: Adding ARM native bridge to the AOSP11 x86 emulatorandroid_vendor_google_emu-x86
  2. 使用 Intel Houdini 实现支持,参考方案:Include Intel Houdini in Android-x86

首先,我们尝试从Google官方的 Android 11 镜像中提取需要的文件,执行如下脚本:

执行编译:

参考链接


Android模拟器支持运行ARM应用,Android 11系统映像可直接将ARM指令转换成x86指令

随着 Android 11 开发者预览版的发布,我们同时也推出了 Android 11 系统映像。新的系统映像在执行 ARM 二进制文件方面取得了显著的性能提升。此前,依赖 ARM 库且无法构建 x86 版本应用的开发者只能使用完整的 ARM 模拟系统映像 (其速度远低于在 x86 设备上运行 x86 系统映像) 或者实体机。Android 11 系统映像能够在不影响整个系统的前提下,直接将 ARM 指令转换成 x86 指令。开发者无需搭建高负载的 ARM 环境即可执行 ARM 二进制文件并进行测试。

继续阅读Android模拟器支持运行ARM应用,Android 11系统映像可直接将ARM指令转换成x86指令

Android App上架说明

Android App应用商店上架说明

目录

一、App上架所需证件 2

1.1、软件著作权申请 2

1.2、特殊资质证明 2

1.3公司营业执照、税务登记证 2

二、Android主流应用市场上架说明 2

2.1、华为应用市场 2

2.2、小米应用商店 3

2.3Oppo应用商店 3

2.4Vivo应用商店 3

2.5、应用宝 3

2.6Android其他应用市场 4

一、App上架所需证件

1.1、软件著作权申请

参考资料

http://www.ccopyright.com.cn/

http://www.ccopyright.com.cn/index.php?optionid=1079

1.2、特殊资质证明

新闻、直播、广播电视节目、股票、彩票、银行等,部分应用市场需要提交特殊运营资质证明材料,提交审核时候应用市场会有相应提示,根据各大应用市场要求填写即可。

1.3公司营业执照、税务登记证

当注册的开发者账号为企业账号时候,部分市场需要提供者两个证件。注册各大应用市场会有具体要求。

二、Android主流应用市场上架说明

2.1、华为应用市场

华为开发者账号登录注册地址

https://developer.huawei.com/consumer/cn/

华为市场App上架说明

https://developer.huawei.com/consumer/cn/doc

华为应用市场REST API自动化发布应用

https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agcapi-overview

2.2、小米应用商店

https://dev.mi.com/console/

小米开发者账号注册

https://dev.mi.com/docs/appsmarket/distribution/account_register/

小米应用商店App上架说明

https://dev.mi.com/docs/appsmarket/distribution/app_submit/

小米应用市场REST API自动化发布应用

https://dev.mi.com/console/doc/detail?pId=33

https://dev.mi.com/console/doc/detail?pId=2352

2.3Oppo应用商店

Oppo开发者账号注册登录地址 OPPO不支持个人发布应用

https://open.oppomobile.com/

2.4Vivo应用商店 VIVO 个人开发者无法注册账号

Vivo开发者账号注册登录地址

https://dev.vivo.com.cn/home

Vivo应用商店App上架说明

https://dev.vivo.com.cn/documentCenter/doc/52

VIVO应用市场REST API自动化发布应用

https://dev.vivo.com.cn/documentCenter/doc/327

VIVO提供了一个APK传包平台,貌似可以上传到其他应用商店,但是只有企业用户才能申请,具体怎么操作,暂时还不清楚。

2.5、应用宝

注册开发者账号

https://wiki.open.qq.com/index.php

创建应用

https://wiki.open.qq.com/wiki/%E5%88%9B%E5%BB%BA%E6%96%B0%E5%BA%94%E7%94%A8

应用宝暂时没办法通过 REST API自动化发布应用

注意每个应用第一次在腾讯应用商店上架,通过审核后,都需要人工提交工单到应用宝,准备跟上架一样的材料,并且提供其他应用商店的上架链接,上架截图,然后等工单审批通过后,才能正常搜索到。

这个工单类型是 “应用宝外显级别调整申请”,如下图:

也就是说应用宝必须是其他应用商店已经上线的情况下,才能提供搜索下载安装功能。

2.6、魅族应用商店

应用商店上架说明:

https://open.flyme.cn/openNew/application.html

2.7Android其他应用市场

360应用市场,百度应用市场、阿里应用分发平台、魅族应用商店。

参考链接


App上架到各大安卓应用市场流程

gradle cache目录(.gradle)剖析

gradle下载后会对文件路径进行修饰,本文给出反向解析,把文件路径修改为原始路径的办法。

之所以研究这个,本来的目的是为了让Gradle支持离线编译,但是由于Gradle目录组织的缺陷,如.gradle/caches/modules-2/metadata-2.23(metadata-xx跟使用的gradle版本有关)目录下module-artifacts.bin等bin文件中存的是本机的绝对路径,导致就算将.gradle拷贝给另一台机器,还是需要联网验证。

将gradle的jcenter重定向的方法见我的另一篇文章:[android]gradle下载加速 - 知乎专栏,例如阿里云的jcenter是Index of /repositories/jcenter

我在内网中搭建了jcenter仓库。然而我不想搭建一个大而全的jcenter的仓库,搭建大而全的仓库可以使用nexus来搭建,阿里云也是那么搭的,由于公司的网络需要上网认证,时不时会断一下,所以我的做法是通过利用.gradle目录来创建jcenter仓库。

下面先介绍.gradle目录的组织。

1 .gradle顶级目录

目录| 功能
caches | gradle缓存目录
daemon | daemon日志目录
native | gradle平台相关目录
wrapper | gradle-wrapper下载目录

2 caches目录

目录 | 功能
2.14.1 | gradle程序的脚本(gradle程序版本)
3.2.1 | gradle程序的脚本(gradle程序版本)
jars-1 | ?
jars-2 | ?
modules-2 | 下载缓存目录

2.1 caches/modules-2目录

目录 | 功能
files-2.1 | gradle下载的jar/aar目录
metadata-2.16 | gradle-2.14.1的描述文件?
metadata-2.23 | gradle-3.2.1的描述文件?

2.1.1 files-2.1的目录组织(jar/aar都下载到这里)

例如:

注意:创建jcenter时,对于jar包,可以没有pom,但是如果使用aar,则必须有pom,所以最好是每个版本都有个pom。因为pom中也描述了依赖关系。

3 daemon目录(无需离线)

用于存放gradle daemon的运行日志。按gradle程序版本存放。

目录 | 功能
2.14.1 | gradle-2.14.1运行的日志
3.2.1 | gradle-3.2.1运行的日志

4 native目录(无需离线)

用于存放平台相关(Windows/Linux/Mac)的库。

目录 | 功能
19 | gradle-2.14.1对应的lib目录,按平台存放,如osx-amd64
21 | gradle-3.2.1对应的lib目录,按平台存放,如osx-amd64
jansi | ?

5 wrapper目录

用于存放gradle-wrapper下载gradle的zip包和解压后的文件夹。 
wrapper的目录规则是 
wrapper/dists/gradle-2.14.1-all/${base36}/gradle-2.14.1-all.zip 
wrapper/dists/gradle-2.14.1-all/${base36}/gradle-2.14.1-all.zip.lck 
wrapper/dists/gradle-2.14.1-all/${base36}/gradle-2.14.1-all.zip.ok

其中base36的规则为:

从gradle-wrapper的jar包中提取的Java代码如下:

c++跟java代码见

6. 使用.gradle/caches/modules-2创建jcenter的方法

以下是mirror.sh,我把它放在.gradle目录下。运行脚本会在.gradle目录下生成jcenter目录。把它移走或直接把jcenter目录加入http服务器即可。

目前我的做法是在本地使用gradle编译一次,然后把gradle下载下来的jar/aar/pom全部提交到版本管理,然后由持续集成去拉版本库上的.gradle目录,然后生成jcenter提供给内网编译服务器。

另外,上面提到aar有可能会因为缺失pom导致无法使用,我还写了一个脚本,也是放在.gradle目录下,用于修复aar问题。本地运行时,可以只运行这个脚本,因为它会顺路执行上面的脚本。

以下是fix_aar_cache.sh的内容:

参考链接


集成华为HMS debug/release 修改包名,取不同包名下的agconnect-services.json 文件

debug/release 修改包名,取不同包名下的agconnect-services.json 文件 V2 解决每次更换包名,都是要手动删除agconnect-services.json文件操作

问题描述

集成华为HMS Core/Push在打多渠道包的时候,我需要区分debug版本,release版本,其中涉及到包名的不同,我使用release编译的时候,发现如下错误信息。这个原因是因为你的agconnect-services文件里面含有一个 package_name 参数,这个参数是需要指定包名的,如果 package_name 填写的报名,和目前你所使用的包名没有对应上就会出现这样的错误

修改过程中遇到的错误信息

不是很完美的解决问题

既然是需要区分包名的,我不如直接copy 2份出来,放到src下面,并新建一个类 pushservices 里面存放 debug/release 的类并存放 agconnect-services.json文件,这样我们想使用哪个版本的,就使用哪个版本的

继续阅读集成华为HMS debug/release 修改包名,取不同包名下的agconnect-services.json 文件

Android Studio使用gradle实现资源自动拷贝

把下面的代码拷贝到appgradle.build文件内

继续阅读Android Studio使用gradle实现资源自动拷贝

Android开源VPN客户端之ICS OpenVPN

1. 简介

Android API level 14+提供了VPNService服务框架,在不root的情况下,开发者可以创建自己的VPN服务应用。
目前主要有三种,分别为OpenVPN for Android(ICS OpenVPN),OpenVPN Connect,OpenVPN Settings。

OpenVPN for Android和OpenVPN Connect使用官方VPNService API (Android 4.0+),不需要root权限,而OpenVPN Settings需要root权限。
OpenVPN for Android是一个开源的客户端,由Arne Schwabe开发,他定位于更高级的用户,提供更多的设置,它可以在app内导入配置文件。
OpenVPN Connect是一个不开源的客户端,它由OpenVPN Technologies , Inc. 开发,它定位于普通用户,它基于OpenVPN协议的C++实现。
OpenVPN Settings是最老的客户端,需要root权限,它并不使用VPNService API。

2. 编译OpenVPN for Android

2.1 开发环境搭建

Ubuntu16,Android Studio,NDK,SDK
首先在Ubuntu下安装Android studio,安装完毕后,使用sdk manager工具安装sdk。
关于NDK,可以使用sdk manager来下载,不过在编译源码的过程中出现了错误,经过尝试发现sdk manager下载的是14版本的ndk,而14版本的ndk编译OpenVPN for Android会出现错误,建议使用12版本的ndk。

2.2 配置环境变量

安装完Android studio,解压完ndk后,需要配置环境变量。

进入用户目录(cd /home/bleach),打开配置文件(vim .bashrc),添加如下内容:

2.3 获取OpenVPN for Android源码

打开搜索引擎,输入ics openvpn,进行搜索,然后进入ics openvpn的github主页,选择master分支里的一个已经添加标签的版本,本文选择的是0.6.64版本的源码。

进入Ubuntu命令行,创建一个源码目录,然后使用git clone命令将源码下载到本地。

2.4 编译源码

step1:进入ics-openvpn-v0.6.64/ics-openvpn目录,修改.gitmodules文件。

将.gitmodules文件中的url更改掉。

step2:执行指令

step3:然后执行指令

step4:然后执行指令

upate指令会消耗一定的时间。
step5:最后进入ics-openvpn-v0.6.64/ics-openvpn/main目录,执行./misc/build-native.sh,等待编译完成,可能需要修改build-native.sh的执行权限。

3. 编译常见问题

3.1 ndk-build not found

未配置ndk环境变量,请参考2.2。

3.2 各种编译错误,比如unknown directive。

很有可能是ndk版本的问题,请使用12版本的ndk尝试编译。

3.3 cannot find .git directory in openvpn,aborting

不要在github上下载zip包的源码,请使用git clone指令将源码下载到本地。

4. 导入源码

将源码导入到Android studio中,目前OpenVPN for Android不支持导入到eclipse中,请使用Android studio开发环境。
打开Android studio,将源码导入,Android studio会自动更新gradle信息,更新完毕后,编译工程,就会生成对应apk包。

参考链接


Android开源VPN客户端之ICS OpenVPN

oKHttp 3.0忽略/检查https证书

最近公司项目需要,网络协议支持HTTPS,之前接触不多,所以这次想总结一下https在Android开发中的相关内容

一、HTTPS 证书

对于HTTPS和证书的概念,大家可以自行搜索百度。

证书分两种:

1、花钱向认证机构购买的证书。服务器如果使用了此类证书的话,那对于移动端来说,直接可以忽略此证书,直接用https访问。与之不同的是ios内置了很多信任的证书,所以他们不需要做任何操作

2、另一种是自己制作的证书,使用此类证书的话是不受信任的,也不需要花钱,所以需要我们在代码中将此类证书设置为信任证书

二、如何忽略证书

注意,下面的操作在线上环境强烈不建议采纳,只能是在测试环境中解决测试问题的时候才能使用。

1、服务器如果加上了证书的话,那么你们的网络请求的url将从http:xx改成https:xx,如果你直接也将http改成https的话而什么也不做的话,客户端将直接报错,如图:

继续阅读oKHttp 3.0忽略/检查https证书