Ubuntu中使用纯命令行进行Android开发

安装JDK

sudo apt install openjdk-8-jdk

注意本文采用jdk1.8,因为后文设置的android版本太低。

安装Android命令行工具和SDK(不可用):

访问https://developer.android.google.cn/studio,拉到最底下,找到“仅限命令行工具”,选择Linux下载即可。

下载后,在Linux下新建文件夹,把这个压缩包弄进去,然后解压:

unzip commandlinetools-linux-11076708_latest.zip

接下来进入cmdlines-tools目录,新建一个latest目录,将解压后的所有文件移到该目录:

mkdir latest
mv * latest

注意mv会将除latest外所有文件移入latest,当移动latest时会报错,但此时已经完成了移动。

接下来进入latest下的bin目录,输入:

./sdkmanager --list

这将列出所有可安装的Android工具。

这里我们安装最新版的build-tools和platforms:

./sdkmanage "build-tools;35.0.0"
./sdkmanager "platforms;android-35"

走到这一步,就卡住了,来看Android文档是咋说的:Android Studio | Android Developers

创建和更新 Android 项目。(现已改用 Android Studio 完成。)

因此,在这里面,我们需要安装旧版的Android SDK,而非新版的命令行工具。

安装Android SDK

下载:

wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz

解压:

tar xzvf android-sdk_r24.4.1-linux.tgz

配置环境变量,打开~/.bashrc文件,在最后写入:

export ANDROID_HOME=<你的Android SDK路径>
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools

然后source一下:

source ~/.bashrc

还没完,这时候应该进入可以打开图形界面的系统(或X11转发),直接输入命令:

android

然后再在弹出的图形化界面中安装build-tools和platform-tools。这里Android已经给我们选好了,直接点“install”即可。

然后点击每一个父项目,点“Accept license”即可。

安装Gradle及Android插件

建议使用GitHub下载加速网站GitHub 文件加速直接访问下载:https://github.com/gradle/gradle-distributions/releases/download/v8.11.0/gradle-8.11-bin.zip。然后解压:

unzip gradle-8.11-bin.zip

然后设置GRADLE_HOME和PATH环境变量:

vim ~/.bashrc

在最后写入:

export GRADLE_HOME<你的Gradle路径>
export PATH=$PATH:$GRADLE_HOME/bin

然后保存,更新:

source ~/.bashrc

创建一个项目

切换到新的文件夹,然后输入命令:

android create project [选项]

其中,选项解释如下:

  • -n --name:项目名称。
  • -a --activity:创建的默认活动的名称。[必填]
  • -k --package:应用程序的Android包名称。[必填]
  • -v --gradle版本:gradle安卓插件版本。
  • -t-target:新项目的目标ID。通过android list targets查看。[必填]
  • -g --gradle:使用gradle模板。若指定-g,则必须指定参数-v,即gradle安卓插件版本。
  • -p --path:新项目的目录。[必填]

如:

android create project -n demo -a MainActivity -k com.woyou.demo -t 1 -p . -g -v 4.0.0

运行完后,文件目录如下:

.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── src├── androidTest│   └── java│       └── com│           └── woyou│               └── demo│                   └── MainActivityTest.java└── main├── AndroidManifest.xml├── java│   └── com│       └── woyou│           └── demo│               └── MainActivity.java└── res├── drawable-hdpi│   └── ic_launcher.png├── drawable-ldpi│   └── ic_launcher.png├── drawable-mdpi│   └── ic_launcher.png├── drawable-xhdpi│   └── ic_launcher.png├── layout│   └── main.xml└── values└── strings.xml

打包

修改Android糟糕的Gradle配置

在打包之前,需要修改Android糟糕的Gradle配置,因此android命令早就不维护了:

打开gradle-wrapper,设置项目中gradle的版本和zip的网络地址:

#Wed Apr 10 15:27:10 PDT 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-6.1.1-all.zip # 新增这一行

打开build.gradle,设置镜像仓库:

repositories {google()jcenter()maven { setUrl("https://maven.aliyun.com/repository/central") }maven { setUrl("https://maven.aliyun.com/repository/jcenter") }maven { setUrl("https://maven.aliyun.com/repository/google") }maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin") }maven { setUrl("https://maven.aliyun.com/repository/public") }maven { setUrl("https://jitpack.io") }maven { setUrl("https://maven.aliyun.com/nexus/content/groups/public/") }maven { setUrl("https://maven.aliyun.com/nexus/content/repositories/jcenter") }maven { setUrl("http://maven.aliyun.com/nexus/content/repositories/releases")}mavenCentral()gradlePluginPortal()}

然后将runProguard改成minifyEnabled:

minifyEnabled false
proguardFile getDefaultProguardFile('proguard-android.txt')

然后加上allprojects:

allprojects {repositories {google()jcenter()maven { setUrl("https://maven.aliyun.com/repository/central") }maven { setUrl("https://maven.aliyun.com/repository/jcenter") }maven { setUrl("https://maven.aliyun.com/repository/google") }maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin") }maven { setUrl("https://maven.aliyun.com/repository/public") }maven { setUrl("https://jitpack.io") }maven { setUrl("https://maven.aliyun.com/nexus/content/groups/public/") }maven { setUrl("https://maven.aliyun.com/nexus/content/repositories/jcenter") }maven { setUrl("http://maven.aliyun.com/nexus/content/repositories/releases")}mavenCentral()gradlePluginPortal()}
}

经过这些操作后,完整的build.gradle如下:

buildscript {repositories {google()jcenter()maven { setUrl("https://maven.aliyun.com/repository/central") }maven { setUrl("https://maven.aliyun.com/repository/jcenter") }maven { setUrl("https://maven.aliyun.com/repository/google") }maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin") }maven { setUrl("https://maven.aliyun.com/repository/public") }maven { setUrl("https://jitpack.io") }maven { setUrl("https://maven.aliyun.com/nexus/content/groups/public/") }maven { setUrl("https://maven.aliyun.com/nexus/content/repositories/jcenter") }maven { setUrl("http://maven.aliyun.com/nexus/content/repositories/releases")}mavenCentral()gradlePluginPortal()}dependencies {classpath 'com.android.tools.build:gradle:4.0.0'}
}
apply plugin: 'android'android {compileSdkVersion 'android-29'buildToolsVersion '29.0.3'buildTypes {release {minifyEnabled falseproguardFile getDefaultProguardFile('proguard-android.txt')}}
}allprojects {repositories {google()jcenter()maven { setUrl("https://maven.aliyun.com/repository/central") }maven { setUrl("https://maven.aliyun.com/repository/jcenter") }maven { setUrl("https://maven.aliyun.com/repository/google") }maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin") }maven { setUrl("https://maven.aliyun.com/repository/public") }maven { setUrl("https://jitpack.io") }maven { setUrl("https://maven.aliyun.com/nexus/content/groups/public/") }maven { setUrl("https://maven.aliyun.com/nexus/content/repositories/jcenter") }maven { setUrl("http://maven.aliyun.com/nexus/content/repositories/releases")}mavenCentral()gradlePluginPortal()}
}

接下来输入命令:

./gradlew build

它将会输出两个apk文件,分别在build/outputs/apk/debug和build/outputs/apk/release内。debug版有Android的Debug签名,release则没有任何签名,因此无法安装,需要进行手动签名:

将apk拷出

cp build/outputs/apk/release/android_demo-release-unsigned.apk .

生成签名文件:

keytool -genkey -v -keystore <文件名(*.keystore)> -alias <别名> -keyalg RSA -validity <有效天数>

签名:

jarsigner -verbose -keystore <签名文件>  -signedjar <签名后的文件名> <未签名的文件名> <别名>

签名完毕,可正常安装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年高校大数据挑战赛A题中文文本纠错求解全过程文档及程序

2023年高校大数据挑战赛 A题 中文文本纠错 原题再现&#xff1a; 中文文本纠错的任务主要是针对中文文本中出现的错误进行检测和纠正&#xff0c;属于人工智能自然语言处理的研究子方向。中文文本纠错通常使用的场景有政务公文、裁判文书、新闻出版等&#xff0c;中文文本纠错…

Python基础学习-07不可重复的set集合

目录 1、set的定义 2、set的基本操作 3、set的函数 4、嵌套和解析 5、本节总结 1、set的定义 • set的属性 1&#xff09;无序不重复元素集 2&#xff09;不支持索引、切片、嵌套 3&#xff09;主要用于关系测试和消除重复元素 4&#xff09;支持&#x…

catchadmin-webman 宝塔 部署

1&#xff1a;宝塔的php 中删除禁用函数 putenv 问题&#xff1a; 按照文档部署的时候linux&#xff08;php&#xff09; vue (本地) 无法访问后端api/login 的接口 。 解决办法&#xff1a; webman 没有配置nginx 反向代理 配置就能正常访问了

Tomcat 和 Netty 的区别及应用场景分析

在 Java Web 开发中&#xff0c;Tomcat 和 Netty 都是常见的网络框架&#xff0c;它们各自有着不同的设计理念和适用场景。本文将通过详细的对比和实际场景示例&#xff0c;帮助你理解 Tomcat 和 Netty 在功能、性能、架构等方面的差异&#xff0c;帮助你在实际开发中做出更合理…

三次握手理解

1. 背景介绍 在TCP&#xff08;传输控制协议&#xff09;通信中&#xff0c;为了建立可靠的连接&#xff0c;使用了三次握手的机制。这是一种在客户端和服务器之间进行连接初始化的方法&#xff0c;其目的是确保双方都有发送和接收数据的能力&#xff0c;并且协商好连接的相关…

要卸载 Grafana 或者从 TiDB 集群中删除 Grafana 服务节点,你需要按以下步骤操作

要卸载 Grafana 或者从 TiDB 集群中删除 Grafana 服务节点&#xff0c;你需要按以下步骤操作&#xff0c;具体步骤取决于你想要卸载的是 Grafana 软件 还是 TiDB 集群中的 Grafana 服务节点。下面是两种情况的卸载步骤。 1. 卸载 TiDB 集群中的 Grafana 节点 如果你只想卸载 …

Ubuntu 20.04 配置开发环境(持续更新)

搜狗输入法不能显示中文 sudo apt install libqt5qml5 libgsettings-qt1 sudo apt install libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml-module-qtquick2 编译环境配置 sudo apt-get update #base tools of ubuntu sudo apt install net-tools gitk tree vim termina…

Vim 编辑器学习笔记

文章目录 Vim 编辑器学习笔记1. Vi/Vim 的发展历史简介2. Vim 的三种操作模式3. 光标移动命令4. 常用编辑操作命令底行模式常用命令文件操作显示行号查找与替换 命令模式常用命令删除复制与粘贴撤销与重做**可视模式** 5. 分屏操作6. 进阶学习与插件管理 Vim 编辑器学习笔记 1…

力扣515:在每个树行中找最大值

给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3]提示&#xff1a; 二叉树的节点个数的范围是 [0,104]-231 < Node.val &l…

<项目代码>YOLOv8 番茄识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined

VUE_PROD_HYDRATION_MISMATCH_DETAILS 未明确定义。您正在运行 Vue 的 esm-bundler 构建&#xff0c;它期望这些编译时功能标志通过捆绑器配置全局注入&#xff0c;以便在生产捆绑包中获得更好的tree-shaking优化。 Vue.js应用程序正在使用ESM&#xff08;ECMAScript模块&#…

香港海洋投资发展有限公司:描绘海洋牧场未来蓝图,打造全球海洋经济标杆

在浩瀚无垠的蓝色海域中&#xff0c;香港海洋投资发展有限公司&#xff08;以下简称“香港海洋投资”&#xff09;正以其卓越的领导力和深厚的实力&#xff0c;引领着海洋经济的新一轮发展浪潮。近年来&#xff0c;公司倾力打造的海洋牧场项目&#xff0c;不仅成为了企业发展的…

《FreeRTOS列表和列表项篇》

FreeRTOS列表和列表项 1. 什么是列表和列表项&#xff1f;1.1 列表list1.2 列表项list item 2. 列表和列表项的初始化2.1 列表的初始化2.2 列表项的初始化 3. 列表项的插入4. 列表项末尾插入5. 列表项的删除6. 列表的遍历 列表和列表项是FreeRTOS的一个数据结构&#xff0c;是F…

MySQL进阶-索引的组合索引

练习题目 题目链接难度SQL进阶-索引的组合索引★★★☆☆ SQL思路 SQL进阶-索引的组合索引 初始化数据 drop table if exists user_profile; CREATE TABLE user_profile ( id int NOT NULL, device_id int NOT NULL, gender varchar(14) NOT NULL, age int , university va…

【iStat Menus for MacBook状态栏菜单系统监控工具--安装教程【简单操作,随时了解电脑情况】

Mac分享吧 文章目录 iStat Menus for MacBook状态栏菜单系统监控软件 效果图展示一、iStat Menus 状态栏菜单系统监控软件 Mac电脑版——v6.73(1240)1️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件3️⃣&#xff1a;软件自定义配置 安装完成&#xff01;&#xff01;&am…

netmap.js:基于浏览器的网络发现工具

netmap.js是一款基于浏览器&#xff0c;用于提供主机发现和端口扫描功能的网络发现工具。 netmap.js的执行速度也非常的快&#xff0c;由于其使用了es6-promise-pool&#xff0c;因此它可以有效地运行浏览器允许的最大并发连接数。 动机 由于我正需要一个基于浏览器的端口扫…

mapbox进阶技巧

1、filter过滤&#xff0c;使用过滤&#xff0c;可以根据不同条件展示我们想要展示的数据 代码示例&#xff1a;核心代码&#xff0c;根据点的size是否满足条件进行展示 filter: [<, size, 30] <!DOCTYPE html> <html lang"en"><head><me…

计算机网络 (2)计算机网络的类别

计算机网络的类别繁多&#xff0c;根据不同的分类原则&#xff0c;可以得到各种不同类型的计算机网络。 一、按覆盖范围分类 局域网&#xff08;LAN&#xff09;&#xff1a; 定义&#xff1a;局域网是一种在小区域内使用的&#xff0c;由多台计算机组成的网络。覆盖范围&#…

实战OpenCV之文字识别

基础入门 文字识别技术,也称为光学字符识别(Optical Character Recognition,OCR),是一种让计算机能够“读取”图像中的文字,并将其转化为可编辑文本的技术。这项技术在许多领域都有广泛的应用,包括但不限于:图片文字识别、文档管理、自动化数据输入、历史文献数字化。 …

【Qt】Qt在窗口中加载Web界面的方法汇总

1、Qt WebEngine 1)Qt版本:Qt5.4以上; 2)平台要求(https://doc.qt.io/archives/qt-5.9/qtwebengine-platform-notes.html): 例如:Windows下只能使用 MSVC 编译器,不支持MinGW编译器,会报错(: error: Unknown module(s) in QT: webenginewidgets) 并且不能用在Qt编…