0%

🧱 第一步:创建一个公共数据类(单例)

public class GlobalData extends ViewModel {
private static GlobalData instance;

private final MutableLiveData<String> flightStatus = new MutableLiveData<>();
private final MutableLiveData<Boolean> isConnected = new MutableLiveData<>();

public static GlobalData getInstance() {
    if (instance == null) {
        instance = new GlobalData();
    }
    return instance;
}

public MutableLiveData<String> getFlightStatus() {
    return flightStatus;
}

public MutableLiveData<Boolean> getIsConnected() {
    return isConnected;
}

}
🧱 第二步:页面中监听数据变化(Activity 或 Fragment)
在你的 Activity 中:

GlobalData globalData = GlobalData.getInstance();

globalData.getFlightStatus().observe(this, status -> {
flightStatusTextView.setText(status);
});

globalData.getIsConnected().observe(this, isConnected -> {
connectIcon.setVisibility(isConnected ? View.VISIBLE : View.GONE);
});
✅ 第三步:在任何地方修改数据,全局生效

GlobalData.getInstance().getFlightStatus().postValue(“起飞中”);
GlobalData.getInstance().getIsConnected().postValue(true);

🔄 如果希望多个 Activity 共享 ViewModel 数据?
建议用 ViewModelProvider 配合 Application:

public class MyApp extends Application {
private GlobalData globalData = new GlobalData();

public GlobalData getGlobalData() {
    return globalData;
}

}
然后在任意页面中用:

GlobalData globalData = ((MyApp) getApplication()).getGlobalData();

安卓打包时包含多个 ABI(CPU 架构) 的确会显著增大 APK 或 AAB 包体积。常见 ABI 有:

ABI 说明
armeabi-v7a 主流 32 位 ARM 设备(绝大多数 Android 手机)
arm64-v8a 主流 64 位 ARM 设备(目前主流)
x86 模拟器用(或极少量 Intel 手机)
x86_64 64 位模拟器(或极少量 Intel 平板)

✅ 原因:每个 ABI 会编译一份 .so 文件(Native 库),多架构直接打包 → 体积翻倍甚至更多。

只打主流架构(推荐 armeabi-v7a 和 arm64-v8a)
✅ 修改 build.gradle(模块级):
gradle
android {

defaultConfig {
    ...
    ndk {
        abiFilters 'armeabi-v7a', 'arm64-v8a'  // ← 只保留主流架构
    }
}

}

手动拆包(生成多个 APK)
gradle
android {

splits {
    abi {
        enable true
        reset()
        include 'armeabi-v7a', 'arm64-v8a'
        universalApk false // 是否生成包含所有 ABI 的 APK(默认 false)
    }
}

}
然后执行:

./gradlew assembleRelease
输出路径:app/build/outputs/apk/,每个架构生成一个独立 APK。

发布目标 推荐 ABI 设置
面向国内市场 armeabi-v7a, arm64-v8a
面向全球(含模拟器测试) 加上 x86, x86_64,但只用于测试或调试包
仅供线上发布(小体积) arm64-v8a(极致精简)
上传 Google Play 使用 .aab,让 Play 控制分发

手动安装最新版 apktool
下载最新版 apktool.jar 和 apktool 脚本:

https://github.com/iBotPeaches/Apktool/releases

假设你下载的是 apktool_2.9.3.jar,执行:

mv ~/Downloads/apktool_2.9.3.jar /usr/local/bin/apktool.jar
wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/osx/apktool
chmod +x apktool
sudo mv apktool /usr/local/bin/
确认版本:

apktool –version
✅ 再次执行你的命令:

apktool d /Users/xueqiaoming/allutils/utils/安卓反编译/apks/flight_2.6.14.apk -o ~/Desktop/ddd

你的系统没有安装 wget 工具,可以使用 curl 代替,或者先安装 wget。

✅ 方法一:用 curl 下载 apktool 脚本
在终端执行以下命令:

curl -o apktool https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/osx/apktool
chmod +x apktool
✅ 方法二:安装 wget 再执行原命令
如果你更喜欢使用 wget,先安装它:

brew install wget
然后再执行:

wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/osx/apktool
chmod +x apktool
安装完后,建议将 apktool 移动到全局目录:

sudo mv apktool /usr/local/bin/
之后就可以在任何目录下使用 apktool 命令了。

下载:

jadx-1.5.2.zip

🔗 官方下载地址(GitHub):
https://github.com/skylot/jadx/releases/tag/v1.5.2

  1. 编辑你的 shell 配置文件(macOS 默认 zsh)

nano ~/.zshrc
2. 在文件末尾添加这一行:

export PATH=”/Users/xueqiaoming/Downloads/jadx-1.5.2/bin:$PATH”
(这里假设 jadx 可执行文件在 bin 目录下)

  1. 保存并退出(Ctrl+O 回车保存,Ctrl+X 退出)
  2. 立即生效:

source ~/.zshrc
5. 测试

jadx-gui
或者

如果弹出 GUI 或显示帮助信息,说明配置成功!

如果你的 jadx 可执行文件不在 bin 文件夹,直接写可执行文件所在目录即可,比如:
编辑
export PATH=”/Users/xueqiaoming/Downloads/jadx-1.5.2:$PATH”

如果打不开
jadx-gui本质上是一个脚本,它最终会调用java来运行一个.jar文件。
windows 上 直接点击 jadx-gui.bat
mac上 进入bin目录,运行./jadx-gui

先创建本地仓库,再添加代码到仓库,然后提交上传到远程仓库。 http or ssh
https://blog.csdn.net/cy123cy456cy/article/details/134376003
https://blog.csdn.net/yzwfeng/article/details/123752599
1 前言
以前项目版本管理工具一直用的都是SVN,现在换成Git,并且项目托管平台使用的是GitLab。虽然经常用GitHub,但是却很少使用到分支,因为都是自己在写,也不用开发版与发布版、打Tag那些,所以这篇文章主要讲下GitLab与Git的使用。这篇文章还是会按我以前的写作风格,写的通俗易懂,并且全程自己操作一遍,目的是为了初学者也能看懂。

2 简介
Git:Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。简单说,它就是一个管理项目版本的工具。
GitLab:GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。简单说,GitLab的性质是和GitHub一样的,都是用来存储项目的仓库。
3 准备Git
3.1 安装Git
下载地址:Git - Downloads
安装步骤:双击安装,按默认选项一路下去即可。
安装完成后,在开始菜单里找到“Git”–>“Git Bash”,出现如下图,就说明Git安装成功!

3.2 配置信息
在上图命令行中输入你的用户名与邮箱

$ git config –global user.name “Your Name”
$ git config –global user.email “email@example.com
AI写代码
命令中的 –global 参数表示你这台机器上所有的Git仓库都会使用这个配置。

3.3 Android Studio中配置Git
在Android Studio中点击Settings–>Version Control –> Git,然后在Path To Git executable上输入你刚刚安装Git的位置,最后点击Test按钮出现Git executed successfully说明配置成功,如下图:

4 GitLab使用
4.1 注册账号
这里说下注册账号的时候需要注意的事项。
如果注册账号的时候提示如下错误

there was an error with the reCAPTCHA,please solve the reCAPTCHA again
AI写代码
那是因为注册时需要验证码验证,就是reCAPTCHA,是一个图形验证码。但是这个验证码需要翻Q才能看得到,否则你一直都注册不了。如图:

4.2 GitLab账户配置SSH Keys
4.2.1 首先需要检查你电脑是否已经有 SSH Keys

在Git Bash 客户端,输入如下代码:

$ cd ~/.ssh
$ ls
AI写代码
如下说明已经存在,存在就可以忽略步骤4.2.2,直接进入步骤4.2.3

4.2.2 创建一个 SSH Keys

在Git Bash 客户端,输入如下代码:

$ ssh-keygen -t rsa -C “your_email”
AI写代码
然后根据提示进行相应操作,如下图所示:
第一个Enter表示Keys存储的位置,默认按回车键即可。第二个和第三个Enter表示Push文件的时候要输入的密码,不需要密码就默认按回车键即可,然后出现如图底部信息就说明创建成功了!

4.2.3 GitLab配置SSH Keys

进入上图所示存储 id_rsa.pub 的文件夹拷贝该文件中的内容,然后登录你的GitLab账号,点击网页右上角的头像–>Settings,点击左边菜单栏的 SSH Keys 进入页面添加 SSH key。如下操作:

4.3 创建项目
在GitLab网站点击导航条上的 “+” 即可进入创建项目的页面,然后根据提示填写相应信息,如下图:

Project path:项目路径
Project name:项目名称
Project description (optional):项目描述(可选项)
Visibility Level:可见登记,Private表示私有的,只有你自己或者组内的成员能访问,Internal表示所有登录的用户,Public表示公开的,所有人都可以访问。
创建完成后是这样的:

5 Android Studio中使用Git
5.1 将项目上传到GitLab
本地已创建好的项目为WildmaGit

5.1.1 配置忽略文件

Android Studio创建项目后会自动生成.gitignore文件,这个文件可以用来忽略那些不用加入到仓库的文件。项目根目录下与module目录下都会生成该文件,如下:

一般情况下我们只需要将项目根目录下的/.idea/workspace.xml与/.idea/libraries改成.idea即可,其他没有特殊要求就用默认的。如下:

修改前:

修改后:

5.1.2 初始化本地Git仓库

点击Android Studio顶部菜单栏上的VCS–>Import into Version Control–>Create Git Repository,如图:

然后选择需要初始化的项目根目录,如图:

初始化之后发现文件名由原来的白色变成了红色,这表示文件已经被git跟踪了,但是并没有添加到仓库中。如图:

5.1.3 将本地Git仓库已与远程仓库进行关联

打开项目文件夹,在该文件夹中打开Git Bash。输入如下命令后就代表本地Git仓库已与远程仓库进行关联了。

git remote add origin git@gitlab.com:wildma/WildmaGit.git
AI写代码
具体步骤见下图:

其中 git@gitlab.com:wildma/WildmaGit.git 为我们项目的远程地址,可以到我们前面创建项目中复制,如下:

image.png

5.1.4 添加文件

选中项目的根目录,点击Android Studio顶部菜单栏上的VCS–>Git–>Add…,如下图:

添加文件后发现文件名由原来的红色变成了绿色,说明已经将文件添加进仓库了。如下图:

5.1.5 提交文件

每次提交前需要先更新项目,原因是如果是多人合作的项目,需要先将远程仓库中他人提交的最新代码更新到本地仓库。如图:

然后选中Merge,点击OK,如果本地代码与远程代码有冲突就会弹出冲突提示,根据需求Merge即可,如图:

Update后就可以提交文件了,选中项目的根目录,点击Android Studio顶部菜单栏上的VCS–>Git–>Commit Directory…,如图:

然后会弹出如下提交框,这里可以选择你要提交的文件和填写提交信息,如图:

提交文件后发现文件名由原来的绿色又变成了最开始的白色,说明已经将文件提交上仓库了。如图:

5.1.6 将提交的文件推送到远程仓库

选中项目的根目录,点击Android Studio顶部菜单栏上的VCS–>Git–>Push…,如下图:

然后会弹出如下推送框

点击Push后,就可以在GitLab上看到刚刚推送的内容了。如下图:

image.png

5.2 从GitLab上clone项目
首先到GitLab上复制项目的地址,如图:

然后点击Android Studio顶部菜单栏上的VCS–>Checkout from Version Control–>Git ,如图:

最后填写相应的信息即可,如下图:

Git Repository URL:填写刚刚复制的项目地址
Parent Directory:项目路径
Directory Name:项目文件夹名称

点击clone后,项目就clone下来了!

5.3 分支管理
5.3.1 分支策略

在实际开发中,我们会用到很多分支。这里说下各分支的作用。

master分支:最稳定的分支,保存需要发布的版本,不在该分支上做任何开发。
dev分支:开发分支,保存最新的代码,平时开发就在该分支上。当某个版本开发完成后就合并到master分支,然后在master分支进行版本发布。
bug分支:用来修复bug的分支,一般是线上版出现bug的时候,从master分支创建一个新的bug分支进行bug修复,修复完成合并到master分支和dev分支(保证master分支与dev分支同步),然后删除该bug分支。
实际开发中我主要用到这三个分支,当然每个人都不同,有些人还会细分到功能分支,预发分支。其中master分支与dev分支都需要推送到远程,为了其他成员能共同开发,bug分支则放在本地即可,你自己修复完bug删掉即可。

5.3.2 分支操作

创建分支

点击Android Studio顶部菜单栏上的VCS–>Git–>Branches…,如图:

然后选择New Branch,输入分支的名字,例如“dev”,如图:

点击OK,分支dev就创建成功了,并且默认切换到该分支。重复上面的步骤可以看到当前分支显示的是dev,如图:

2.推送分支到远程

这时候我们在dev分支上修改内容,然后按照前面说的提交文件(步骤5.1.5),将提交的文件推送到远程仓库(步骤5.1.6)即可。如图:

点击push,然后就可以到Gitlab上看到我们刚刚推送的dev分支了,如图:

切换分支

dev分支上版本V1.0开发完了,需要将代码合并到master上进行发布。因为当前在dev分支,所以需要先切换到master分支,点击Android Studio顶部菜单栏上的VCS–>Git–>Branches…,打开Git Branches窗口,然后选择本地分支栏下的master->origin/master,然后点击Checkout。如图:

合并分支

第三步已经将分支切换到master了,现在进行分支合并。点击Android Studio顶部菜单栏上的VCS–>Git–>Branches…,打开Git Branches窗口,然后选择远程分支栏下的origin/dev,然后点击Merge。如图:

这个时候到GitLab上却发现master分支上并没有合并到dev分支修改的内容,那是因为刚刚只是将远程dev分支的内容合并到本地master分支,本地master分支还没有push到远程,push一下就可以啦~ 如图:

这个时候发现GitLab上master分支与dev分支是保持一致的了。然后将最新的master分支打包发布即可!

删除分支
删除本地分支:

点击Android Studio顶部菜单栏上的VCS–>Git–>Branches…,打开Git Branches窗口,选中本地dev分支,选择Delete即可。如图:

删除远程分支:

点击Android Studio顶部菜单栏上的VCS–>Git–>Branches…,打开Git Branches窗口,选中远程dev分支,选择Delete即可。如图:

5.4 标签(Tag)管理
标签一般是用于标记某个发布的版本, 例如你发布了版本v1.0,这个时候会打一个v1.0的Tag,主要是方便以后查看和管理某个版本的代码。

创建标签

点击Android Studio顶部菜单栏上的VCS–>Git–>Tag…,如图:

然后填写Tag名称与Tag信息,点击Create Tag即可创建本地标签。其中Commit可填写以前某次提交记录的id,表示在该次提交上打Tag。如果不填表示Tag打在最新提交的commit上。如图:

推送标签到远程
点击Android Studio顶部菜单栏上的VCS–>Git–>Push…,如图:

然后弹出Push框,选中Push Tags,点击Push即可推送到远程。如图:

最后到GitLab就可以看到刚刚创建的Tag了,如图:

checkout某个标签的代码

点击Android Studio顶部菜单栏上的VCS–>Git–>Branches…,如图:

然后选择Checkout Tag or Revision…,最后在弹出的Checkout框中填入Tag的名称即可。如图:

删除标签
在Android Studio中没找到删除Tag的操作,所以这里用Git命令。(有发现的小伙伴可以告诉我)
查看本地标签:

git tag
AI写代码
删除本地标签:

git tag -d tagName
AI写代码
删除远程标签:

git push origin :refs/tags/tagName
AI写代码
以上命令需要在Android Studio自带的命令行中输入,如图:

git remote set -url origin git@……git 修改远程仓地址
ls ~/.ssh 查看已有秘钥
ssh-keygen -t ed25519 -C “935607317@qq.com“ 生成秘钥 连续按3次回车
cat ~/.ssh/id_ed25519.pub 复制 添加到gitlab ssh

配置好签名文件,
./gradlew signingReport 可直接获取debug和release的sha1
signingConfigs {
release {
keyAlias ‘key0’
keyPassword ‘htnova1003’
storeFile file(‘cotton.jks’)
storePassword ‘htnova1003’
}
}

buildTypes {
    release {
        minifyEnabled true          // 开启代码混淆和压缩
        shrinkResources true        // 去掉未使用的资源
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }
    debug {
        minifyEnabled false         // debug 不压缩,方便调试
        shrinkResources false
    }
}

keytool -v -list -keystore /Users/xueqiaoming/Desktop/htnova.jks
keytool -list -keystore debug.keystore 去掉-v可以显示sha256

或者导出证书
keytool -exportcert -alias htnova -keystore /Users/xueqiaoming/Desktop/htnova.jks -rfc -file cert.pem
查看 cat cert.pem
openssl x509 -in cert.pem -noout -fingerprint -sha1

一、安装依赖环境(Node.js + Git)

安装 Node.js(建议 18+)

curl -fsSL https://rpm.nodesource.com/setup_18.x | bash -yum install -y nodejs

安装 Git

yum install -y git
✅ 二、安装 Hexo 并初始化博客

安装 hexo-cli

npm install -g hexo-cli

新建博客目录

mkdir ~/my-blog && cd ~/my-blog

初始化 Hexo 项目

hexo init
npm install
✅ 三、本地预览测试

启动 hexo 本地服务器

hexo server
访问:http://<服务器IP>:4000,确认博客正常运行。

✅ 四、生成静态网页
hexo clean
hexo generate
生成的静态文件位于:~/my-blog/public/

✅ 五、安装 Nginx 并配置博客
yum install -y nginx

替换默认配置

cat > /etc/nginx/conf.d/hexo.conf <<EOF
server {
listen 80;
server_name your.domain.com; # 如果没有域名可以用 IP

location / {
    root /root/my-blog/public;
    index index.html;
}

}
EOF

启动 Nginx

sudo /usr/local/nginx/sbin/nginx -s reload
ps -ef | grep nginx 查看nginx状态

假设你把博客文件放在 /var/www/my-blog/

sudo mv /root/my-blog /var/www/

设置权限给所有用户可读

sudo chmod -R 755 /var/www/my-blog/public

nginx配置
location / {
root /var/www/my-blog/public;
index index.html index.htm;
}

cd /root/my-blog
hexo clean && hexo g && hexo server

systemctl enable nginx
systemctl restart nginx

✅ 六、配置防火墙(开放 80 端口)
firewall-cmd –permanent –add-port=80/tcp
firewall-cmd –reload
✅ 七、你可以访问博客了!
浏览器打开:http://你的服务器IP/
你将看到 Hexo 的默认博客页面。

✅ (可选)更换主题美化博客
cd ~/my-blog/themes
git clone https://github.com/hexo-theme/hexo-theme-next next
cd ~/my-blog
sed -i ‘s/theme: landscape/theme: next/‘ _config.yml
hexo generate

如果没有npm:
✅ 先安装 Node.js(npm 会自动一起安装)
请按下面步骤执行(适配 CentOS 系统):

✅ 一、安装 Node.js(建议使用 Node 18)

curl -fsSL https://rpm.nodesource.com/setup_18.x | bash -
yum install -y nodejs
✅ 二、确认安装成功

node -v
npm -v
如果你看到版本号,就说明安装成功了。

✅ 三、然后继续安装 Hexo

npm install -g hexo-cli

✅ 1. 修改博客标题、作者信息
打开配置文件 _config.yml(项目根目录下):

vim _config.yml
修改以下内容(示例):
yaml

title: 安卓开发者的技术笔记
subtitle: 记录成长每一步
author: 小明
language: zh-CN
timezone: Asia/Shanghai
保存后重启:

hexo clean && hexo g && hexo s
✅ 2. 写第一篇正式文章
hexo new “我的第一篇博文”
然后编辑生成的文件:
source/_posts/我的第一篇博文.md
写完后生成+启动:
cd /root/my-blog
hexo clean && hexo g && hexo server


title: 如何用 Java 实现安卓推流 Demo(MediaProjection + MediaCodec + FFmpeg)
date: 2025-07-11 21:35:00
tags:
- Android
- 推流
- Java
- FFmpeg
categories:
- 安卓开发

💡 项目背景

在无人机、车载设备等场景下,经常需要将屏幕内容实时录制并推送到服务器(RTMP 流媒体服务器),以便实现远程监控、直播等功能。

本文将介绍如何使用 Java 实现一个 Android 推流 Demo,采用的技术栈包括:

  • MediaProjection:获取屏幕内容
  • MediaCodec:硬件编码 H.264 视频流
  • Mobile-FFmpeg:将编码后的数据推送到 RTMP
  • rtmp-rtsp-stream-client-java:简化推流实现

📦 技术要点

1. 权限申请(录屏 + 网络)

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

2. 初始化 MediaProjection
使用系统提供的录屏能力:

java
复制
编辑
MediaProjectionManager mProjectionManager = 
    (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);

Intent captureIntent = mProjectionManager.createScreenCaptureIntent();
startActivityForResult(captureIntent, REQUEST_CODE_CAPTURE);
3. 使用 MediaCodec 进行编码
配置编码器输出:

java
复制
编辑
MediaCodec codec = MediaCodec.createEncoderByType("video/avc");

MediaFormat format = MediaFormat.createVideoFormat("video/avc", 720, 1280);
format.setInteger(MediaFormat.KEY_BIT_RATE, 4 * 1024 * 1024);
format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, 
    MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
4. 推流 RTMP(FFmpeg 方案)
你可以通过 Mobile-FFmpeg 执行推流命令:

bash
复制
编辑
ffmpeg -re -i /sdcard/output.mp4 -c:v copy -f flv rtmp://your-server/live/stream
也可以通过 Java 使用:

java
复制
编辑
FFmpeg.execute("-f rawvideo -pix_fmt yuv420p -s 720x1280 -i pipe:0 -f flv rtmp://...");
🔧 工程结构建议
cpp
复制
编辑
app/
├── MainActivity.java
├── encoder/            // MediaCodec 封装
├── ffmpeg/             // 推流接口封装
├── service/            // 前台服务录屏
└── ui/
🎯 推流测试地址
你可以部署 Nginx + RTMP 模块,配置地址如:

arduino
复制
编辑
rtmp://192.168.1.100/live/test
✅ 最终效果
启动应用后点击“开始推流”

系统弹出录屏权限

成功后开始将画面推流到 RTMP 服务器

可通过 VLC 或网页播放流

💬 总结
本文介绍了如何用 Java 实现安卓屏幕推流功能,适合无人机、车载系统、远程教学等场景。

后续可以扩展:

音频录制同步推流

摄像头推流(代替屏幕)

RTSP 推流支持

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment