分类目录归档:Android开发

Android编译第三方库脚本模板

#!/bin/bash
path_current=`pwd`
path_script=$(cd "$(dirname "$0")"; pwd)
 
DEFAULT_PATH=$PATH
ANDROID_NDK_HOME=~/Android/Sdk/ndk/20.1.5948944
 
declare -A qt_architectures=( ["x86_64"]="x86_64" ["x86"]="x86" ["arm64"]="arm64-v8a" ["arm"]="armeabi-v7a" )
rm -rf android
if [ ! -d "${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin" ]; then
    echo "failed to find linux-x86_64 home. please install ndk-r20+ version in ubuntu-18.04 system"
    exit 1
fi
ANDROID_TOOLCHAIN="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin"
for arch in ${!qt_architectures[@]}
do    
    case $arch in
        arm)
            ANDROID_API=16
            ;;
        x86)
            ANDROID_API=16
            ;;
        arm64)
            ANDROID_API=21
            ;;
        x86_64)
            ANDROID_API=21
            ;;
    esac
    rm -rf ${path_script}/build
 
    ANDROID_DEFINITION="-DCMAKE_FIND_ROOT_PATH:PATH=${path_script}/../openssl/android/${arch};${path_script}/../zlib/android/${arch}"
    ANDROID_DEFINITION="${ANDROID_DEFINITION} -DWITH_EXAMPLES=OFF"
    ANDROID_DEFINITION="${ANDROID_DEFINITION} -DCMAKE_BUILD_TYPE:STRING=Release"
    ANDROID_DEFINITION="${ANDROID_DEFINITION} -DANDROID_ABI:STRING=${qt_architectures[$arch]}"
    ANDROID_DEFINITION="${ANDROID_DEFINITION} -DANDROID_NATIVE_API_LEVEL:STRING=${ANDROID_API}"
    ANDROID_DEFINITION="${ANDROID_DEFINITION} -DANDROID_NDK:PATH=${ANDROID_NDK_HOME}"
    ANDROID_DEFINITION="${ANDROID_DEFINITION} -DCMAKE_CXX_COMPILER:STRING=${ANDROID_TOOLCHAIN}/clang++"
    ANDROID_DEFINITION="${ANDROID_DEFINITION} -DCMAKE_C_COMPILER:STRING=${ANDROID_TOOLCHAIN}/clang"
    ANDROID_DEFINITION="${ANDROID_DEFINITION} -DCMAKE_TOOLCHAIN_FILE:PATH=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake"
    mkdir -p ${path_script}/build && cd ${path_script}/build && cmake -DCMAKE_C_FLAGS="-fPIC -Wall" -DCMAKE_INSTALL_PREFIX=${path_script}/android/${arch} ${ANDROID_DEFINITION} ../libssh-0.9.3
    make clean && make && make install
done

Qt5.12.8ForAndroid

如果只是使用Qt自身提供的组件,而不引入第三方组件,则建议使用Window系统,因为Qt和Android支持得非常成熟。
但一旦需要引入第三方库时,建议使用ubuntu进行开发。因为官方的linux版本,也是基于ubuntu来开发的。
而在选择ubuntu的版本是非常重要,因为选择错误是经常无法正常启动模拟器或调试的。
本人也是在使用ubuntu20.04/ubuntu18.10/ubuntu19.x/Centos7.x等,吃心苦头后仍不得结果,才开始思考如何让系统顺利运行包括单步调试/编译openssl/zib等第三方组等
核心关健点:只要能找到官方原生编译系统的环境或配置,并重现该环境,则一定能成功单步调试/自由编译第三方组件
首先,官方仓库是没有发现任何编译脚本。
只能通过源码搜索,检查系统的蛛丝马迹了。
我是按以下方法找到最佳系统版本的。
第一步:下载最新的LTS版本Qt5.12.8的Linux版本,随便找一个linux系统安装,包括源码。
第二步:在源码目录下:搜索“grep -r ‘ubuntu’ ./”,然后它会显示下以下一些信息。

第三步:从输出的信息中,可以确认Qt5.12.8是在ubuntu18.04环境下编译的。
事实上也验证在18.04中安装确实是成功实现单步调试和自由编译第三方包的体验。
以下是安装过程的总结:
1.安装准备
>>Ubuntu18.04,安装后,需要把软件源切换至阿里源。
>>Qt5.12.x最新版【5.12.x只选择LTS版,因为LTS版是Linux系统最常用的,问题最少且最快被修复的版本】
>>AndroidStudio3.5.2版,【从r25开始,AndroidSDK只随IDE一起发布,且SDK结构也与旧版有较大差异。】
>>JDK1.8.x版本。
2.系统安装【VMWare虚拟机安装】。
系统安装,Ubuntu18.04安装成功后,按以下步骤开启GPU和CPU加速,这是android模拟器需要VT-x和图形3D加速


切换软件源


3.安装Qt5.12.8【当前最新版】。把所有组件全部选择上。
4.安装JDK1.8.x版本。
5.安装AndroidStudio,本人选择的是AndroidStudio3.5.2版本,目标是SDK,但从R24版本后的SDK工具是和IDE捆绑一起。
从SDKr24版后,SDK工具已经发生比较大的变化,且不再独立发布,且结构也发生比较大的变化且不兼容,这需要特别注意。
我是默认安装了Android-10
6.配置Qt的Android。

===========================================================
问题列表
问题一:无法创建模拟器,如下图:

需要安装相应的SytemImage,如下图所示【从Android8以后,模拟器主要是提供x86模拟器,而Arm是直接连接设备即可,既然是模拟器那是哪一种模拟器就不重要了】:

=————————————-
问题二:
Android SDK启动提示:Failed to load module “canberra-gtk-module”
sudo apt-get install libcanberra-gtk-module
————————————————
问题三:
Linux环境下,如下报如下错:
cannot find -lGL
collect2:error:ld returned 1 exit status
sudo apt-get install libgl1-mesa-dev
—————————
问题三:
gcc无法使用
ubuntu:
报错When executing step “Make”
sudo apt-get install build-essential
—————————————–

WebRtc的支持

因为代码需要翻墙下载,故建议在海外的主机上,先在docker容器中建立相应的编译环境,然后把镜像拷贝回来。如果镜像的系统与本地的系统是同一个版本如centosv7.3,则可以从镜像中把包拷贝出来,在宿主机编译。
————————-
源代码获取步骤
1.下载depot_tools工具,并把执行路径加入环境变量中。

export PATH=$PATH:/path/depot_tools

2.按以下步骤

mkdir webrtc-checkout
cd webrtc-checkout
fetch --nohooks webrtc
gclient sync,在这个步骤时如果出错,可能是缺少bzip2及bzip2-devel库。

编译步骤
1.把depot_tools的执行路径加入到系统中。
source depot_tools_env.sh
2.在webrtc_checkout/src目录下,生成或清理原编译代码。
gn gen out/Default && gn clean out/Default
3.在webrtc_checkout/src目录下,执行程序编译指令
ninja -C out/Default
—————————————
编译工具使用:depot_tools
https://storage.googleapis.com/chrome-infra/depot_tools.zip
官方建议使用WebRtc Api的版本进行开发。

一、Android预编译库
https://webrtc.org/native-code/android/
https://bintray.com/google/webrtc/google-webrtc

二、IOS预编译库
https://webrtc.org/native-code/ios/
https://cocoapods.org/pods/GoogleWebRTC

三、原生API
https://webrtc.org/native-code/native-apis/

OpenWebRtc的版本,最后更新日期是2015年4月26日
https://www.openwebrtc.org/

android实用开源库

所有组件,类似awesome-android那个。
https://github.com/Trinea/android-open-project
———-
阿里牛人开源的库,感觉common库比较实用,其它库可以参考一下。
https://litesuits.com/?f=zh
—-
动态插件系统的例子
https://github.com/mmin18/AndroidDynamicLoader
—-
快速开发的SDK,基于flagment定制了很多UI组件。
https://github.com/liaohuqiu/cube-sdk
https://github.com/liaohuqiu/android-cube-app
——–
进程Daemon
https://github.com/liaohuqiu/MarsDaemon

android局部变量不能调试问题

在gradle文件把testCoverageEnabled设为false就可以了

buildTypes {
release {
debuggable false
minifyEnabled false //删除没有用到的文件
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
debug {
debuggable true
testCoverageEnabled false
}

}

APK反编译工具

方法一:
http://ibotpeaches.github.io/Apktool/
方法二:
有时方法一,并不凑效。可以试这个方法,把apk后缀名改为.zip,然后用winrar打开,这个方法是可以破开天猫的apk。

webapp的JS调试与性能优化

在调试MobileWeb的时候,如果打开空白窗口,其标题如:chrome-devtools://devtools/bundled/devtools.html类似,则说明这时你需要穿墙一次,才能打开调试界面,之后再次打开则不会存在任何问题的了,目前该调试是关联到不同手机平台的。

根据devtools进行优化前请详细阅读以下文档:
新版:https://developers.google.com/web/tools/chrome-devtools/
旧版:https://developer.chrome.com/devtools/docs/cpu-profiling

https://github.com/paulirish/adb_trace这是python版的通迅协议实现

cordova的命令集

附上cordova常用命令列表

命令 说明
cordova create <工程路径> <包名> <工程名> 创建cordova工程,例如:cordova create helloworld “org.commom.helloworld” “helloworld”
cordova platforms add android 添加平台支持。
cordova build android 给cordova项目添加android平台。
cordova run android 编译和运行项目。
cordova install android 将编译好的应用程序安装到模拟器上。
cordova plugin add <插件完全限定名> 给项目添加插件。
cordova plugin remove <插件完全限定名> 删除插件。
cordova plugin list 查看插件列表。
cordova build android 编译代码
cordova emulate android 在模拟器上运行(前提是创建好AVD)
cordova serve android 在浏览器运行
cordova run android 通过USB直接安装到真机

—————————–
插件:http://plugins.cordova.io/
如以上我们看到的,Cordova默认提供的程序界面和功能非常简单。当然你可以根据你的需要,运行标准Web开发技术对页面进行设计。但是当你需要和不同的设备进行通讯交互时,你就需要借助于一些插件,以便能够访问Cordova提供的核心API。
一般来说,你添加一个插件的目的是为了利用Cordova的API访问设备。详细的可用插件列表你可以在社区中看到(http://plugins.cordova.io/)。当然你也可以自定义自己的插件。
你可以用CLI搜索可用的插件,比如:
cordovaplugin search bar code
你可以通过以下命令安装插件,比如:
cordovaplugin add org.apache.cordova.device //设备API
cordovaplugin add org.apache.cordova.network-information //网络(事件)
cordovaplugin add org.apache.cordova.battery-status //电池(事件)
cordovaplugin add org.apache.cordova.device-motion //加速器
cordovaplugin add org.apache.cordova.device-orientation //罗盘
cordovaplugin add org.apache.cordova.geolocation //定位
cordovaplugin add org.apache.cordova.camera //摄像头
cordovaplugin add org.apache.cordova.media-capture //媒体文件处理
cordovaplugin add org.apache.cordova.media //媒体文件处理
cordovaplugin add org.apache.cordova.file //文件访问
cordovaplugin add org.apache.cordova.file-transfer //文件传输
cordovaplugin add org.apache.cordova.dialogs //对话框
cordovaplugin add org.apache.cordova.vibration //震动
cordovaplugin add org.apache.cordova.contacts //联系人
cordovaplugin add org.apache.cordova.globalization //全球化
cordovaplugin add org.apache.cordova.splashscreen //闪屏
cordovaplugin add org.apache.cordova.inappbrowser //打开新的浏览器窗口
cordovaplugin add org.apache.cordova.console //调试控制台
你可以用以下命令查看所有已经安装的插件
cordovaplugin ls
使用以下命令删除插件:
cordovaplugin rm org.apache.cordova.console
Plugin add高级选项
上面的安装方式是从registry.cordova.io库中按照id获取插件,这是一个非常通用的做法。你可以在安装时指定版本,比如:
cordovaplugin add org.apache.cordova.console@latest
cordovaplugin add org.apache.cordova.console@0.2.1
其中的latest表示获取最新版本。中间用@分隔。
如果插件不是在默认库中,而是在其他地方,则你可以指定URL:
cordovaplugin add https://github.com/apache/cordova-plugin-console.git
当然你需要先安装git。
Merge目录
前面提到,一般情况下最好不要修改各自平台下的www目录下的文件。但是如果你确实需要为某个平台定制一些内容,又该怎么办呢?
项目根目录下有一个merges目录。我们以一个实例来讲解:
1) 修改www\css目录下的index.css文件,设置event.received的样式为红色: background-color:#FF0000;
2) 修改platforms\android\assets\www\css中的index.css文件,设置.event.received的样式为蓝色:background-color:#0000FF;
3) 在merges\android目录下新建一个css目录。
复制www\css中的index.css文件到该目录下。
修改该目录下的index.css文件中的.event.received的样式为绿色:background-color:# 00FF00;
仿真器中运行,你会发现最终呈现的结果为绿色。由此我们可知:
1) Merges目录中没有对应文件时,platform下的文件会被跟目录(www)下的文件覆盖。(即:如果Merges目录中不存在index.css文件,最终颜色将为红色)
2) Merges目录中存在对应文件时,platform下的文件会被merges下的文件覆盖。可见Merges目录主要用于为平台定制功能。
帮助命令
通过以下命令查看帮助信息:
cordova help
更新命令
以下语句更新cordova:
npm update -g cordova
cordova更新完成后,你还需要更新项目:
cordovaplatform update android
注意:
因为各版本之间差异较大,执行更新时请事先仔细阅读官方文档,以免发生数据丢失或错误。

ionic使用代理

根据ionic提示:https://www.npmjs.com/package/ionic

export http_proxy=http://10.199.x.y:8971
# Or
export PROXY=http://10.199.x.y:8971

ionic start my_app

# Additionally, pass in line
PROXY=http://10.199.x.y:8971 ionic start myTest tabs