Android学习19 -- 手搓App

ops/2025/2/5 6:38:31/

1 前言

之前工作中,很多时候要搞一个简单的app去验证底层功能,Android studio又过于重型,之前用gradle,被版本匹配和下载外网包折腾的堪称噩梦。所以搞app都只有找应用的同事帮忙。一直想知道一些简单的app怎么能手搓一下,简单快速的搞出来。趁着现在有时间,终于体验了一把。

我的环境是windows10,终端设备没有用虚拟机,用了一个安卓平板,荣耀平板5。

2 代码结构

代码架构如下:

其中要自己写的就是两个文件,MainActivity.java和AndroidManifest.xml。如下:

MainActivity.java

package com.example.simpleapp;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView tv = new TextView(this);tv.setText("Hello, Android!");setContentView(tv);}
}

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.simpleapp"android:versionCode="1"android:versionName="1.0"><application android:label="SimpleApp"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>

关于这个文件,简单的介绍如下:

`AndroidManifest.xml` 是 Android 应用开发中的核心配置文件,为系统和开发者提供应用的关键信息,以下是简要介绍:

1. **基本信息声明** - 定义应用包名,作为应用唯一标识。 - 包含版本号,`versionCode` 供系统识别版本新旧,`versionName` 面向用户展示。

2. **组件声明** - **Activity**:代表应用界面,可设置为启动界面。 - **Service**:用于后台长时间运行任务。 - **Broadcast Receiver**:接收系统或应用广播消息。 - **Content Provider**:实现不同应用间的数据共享。

3. **权限声明**:列出应用正常运行所需权限,部分危险权限需运行时动态请求。

4. **其他配置** - 配置应用图标、名称、主题,决定应用外观展示。 - 声明应用对硬件特性和 Android 系统版本的要求。

3 环境配置

之后就是要配置一大堆组件了。

其中platform-tools,cmdline-tools,jdk-23.0.1都要自己下载,前面两个可以去安卓官网下,jdk去甲骨文网站下。Adnroid_SDK可以用过cmdline-tools里面的sdkmanager.bat自动下载。

platform-tools里面主要是adb,fastboot这些工具。

cmdline-tools主要就是开发中的工具,是一堆bat文件。sdkmanager管理SDK的,avdmanager管理虚拟机的,lint是代码静态检查,apkanalyzer是APK文件分析。

撸apk,主要要用sdkmanager。使用list命令可以看现在可以下载哪些。

sdkmanager --list --sdk_root=D:\Tools\Adnroid_SDK

先安装build tool

sdkmanager --install "build-tools;35.0.0"

我的目标设备是荣耀平板5,很老的一个7寸平板。看了一下设备的OS是Android9, Android9对应的SDK版本是28,安装的命令是:

sdkmanager --install "platforms;android-28" --sdk_root=D:\Tools\Adnroid_SDK

之后就是设置环境变量,主要是ANDROID_HOME,JAVA_HOME,然后jdk的bin,build-tools,platform-tools这几个都要加到PATH之中。

4 操作步骤

然后就可以开撸。

4.1 编译java文件

首先是编译java文件

javac -d bin -classpath "D:\Tools\Adnroid_SDK\platforms\android-28\android.jar" src/com/example/simpleapp/MainActivity.java

之后会在bin下面生成com/example/simpleapp/MainActivity.class。

4.2 生成dex

然后生成classes.dex,输入就是上一步的class文件。

d8 --output=out/ bin/com/example/simpleapp/MainActivity.class 

之后会在out下生成classes.dex。看了一下介绍,安卓的虚拟机的字节码是DEX bytecode,和一般的虚拟机还有不同,所以这里要处理下。

d8: This tool is the DEX compiler. It takes Java bytecode (.class files) and converts it into DEX bytecode (.dex files), which is what the Android Runtime (ART) executes.

4.3 生成apk

之后使用aapt生成apk,这一步的输入参数就是那个AndroidManifest.xml,还有Android9的运行库jar。

aapt package -f -m -F out/app.unsigned.apk -M AndroidManifest.xml -I D:\Tools\Adnroid_SDK\platforms\android-28\android.jar

此时会生成一个基础的app.unsigned.apk。

然后将之前的class.dex加到apk之中。这里貌似直接用zip拖进去也行。。

aapt add out/app.unsigned.apk out/classes.dex

aapt (Android Asset Packaging Tool): This tool is used to package resources (like layouts, images, and strings) into a compiled format that Android can understand. It also handles the creation of the resources.arsc file and the AndroidManifest.xml processing.

apk本质其实就是一个zip文件,可以直接用winrar打开,此时内容如下:

有的介绍说要对齐一下。但是我没对齐也可以的。

zipalign -v 4 build/apk/app-debug-unaligned.apk build/apk/app-debug.apk

4.4 签名

最后就是签名,这一步感觉倒是挺无聊的。但是不签名,确实无法安装:

签名的步骤如下: 

keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key
apksigner sign --ks my-release-key.jks --out out/app.signed.apk out/app.unsigned.apk

签完名,apk里面会多一个META-INF文件夹。 

最后的文件大小大概是8k,不是我吹牛,这么小的安卓app绝对堪称罕见中的罕见了。。

5 运行

之后就是推送APK。当然,之前要进入开发者模式,然后把usb调试打开。

adb install out/app.signed.apk

然后就提示是否安装:

(这个图是另一个实验的app)

之后会提示说有一些东西太老之类的,但是可以看到期待的画面了。

6 参考和其他

最后,谷歌官方是很不推荐这种做法,推荐用Android Studio和Gradle,理由如下:

Important Considerations
Complexity: This process is very manual and error-prone.
Maintenance: Maintaining a project built this way is extremely difficult.
Features: You're missing out on all the features and optimizations that Gradle provides.
Dependencies: Managing dependencies manually would be a nightmare.
Android Studio: Android Studio and Gradle are designed to make Android development much easier.
Android SDK: You need to have the Android SDK installed and configured correctly.
Environment Variables: You need to set the ANDROID_HOME environment variable.
Missing files: You need to create the res directory and the strings.xml file.


Conclusion
While you can technically create a very simple Android 9 APK using aapt and d8 directly, it's strongly discouraged for anything beyond experimentation or very specific edge cases. Gradle is the standard build system for Android, and it provides a much more robust, efficient, and maintainable way to develop Android apps. I highly recommend using Gradle unless you have a very compelling reason not to.

之前倒是写过一个Gardle的文,但是很简单,也没有涉及到apk这一层。可以看看:Android学习18 -- Gradle_resourcehashescache.bin-CSDN博客 

参考:

ChatGPT和Gemini


http://www.ppmy.cn/ops/155798.html

相关文章

基于SpringBoot养老院平台系统功能实现一

一、前言介绍&#xff1a; 1.1 项目摘要 随着全球人口老龄化的不断加剧&#xff0c;养老服务需求日益增长。特别是在中国&#xff0c;随着经济的快速发展和人民生活水平的提高&#xff0c;老年人口数量不断增加&#xff0c;对养老服务的质量和效率提出了更高的要求。传统的养…

oracle: 表分区>>范围分区,列表分区,散列分区/哈希分区,间隔分区,参考分区,组合分区,子分区/复合分区/组合分区

分区表 是将一个逻辑上的大表按照特定的规则划分为多个物理上的子表&#xff0c;这些子表称为分区。 分区可以基于不同的维度&#xff0c;如时间、数值范围、字符串值等&#xff0c;将数据分散存储在不同的分区 中&#xff0c;以提高数据管理的效率和查询性能&#xff0c;同时…

Nacos 的介绍和使用

1. Nacos 的介绍和安装 与 Eureka 一样&#xff0c;Nacos 也提供服务注册和服务发现的功能&#xff0c;Nacos 还支持更多元数据的管理&#xff0c; 同时具备配置管理功能&#xff0c;功能更丰富。 1.1. windows 下的安装和启动方式 下载地址&#xff1a;Release 2.2.3 (May …

2月3日星期一今日早报简报微语报早读

2月3日星期一&#xff0c;农历正月初六&#xff0c;早报#微语早读。 1、多个景区发布公告&#xff1a;售票数量已达上限&#xff0c;请游客合理安排行程&#xff1b; 2、2025春节档总票房破70亿&#xff0c;《哪吒之魔童闹海》破31亿&#xff1b; 3、美宣布对中国商品加征10…

Vue安装相关依赖冲突问题

问题出现 我在安装某一个依赖的时候&#xff0c;出现的问题。 npm install gcpaas/data-room-ui 报错原因 在使用vue/cli脚手架安装项目时&#xff0c;选择ESlint&#xff0c;再安装依赖包的时候&#xff0c;会报错。就是我上面的报错信息。 npm7版本之前遇到依赖冲突会忽视&…

Github 2025-02-04 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2025-02-04统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1Python中的算法实现集合 创建周期:2831 天开发语言:Python协议类型:MIT LicenseStar数量:178357 个Fork数量:…

5 前端系统开发:Vue2、Vue3框架(上):Vue入门式开发和Ajax技术

文章目录 前言一、Vue框架&#xff08;简化DOM操作的一个前端框架&#xff09;&#xff1a;基础入门1 Vue基本概念2 快速入门&#xff1a;创建Vue实例&#xff0c;初始化渲染&#xff08;1&#xff09;创建一个入门Vue实例&#xff08;2&#xff09;插值表达式&#xff1a;{{表…

fpga系列 HDL:XILINX Vivado ZYNQ-7000 PS-PL数据交互 AXI4 实现笔记

12_PL读写PS端DDR数据.mp4 打开AXI HP0 interface 参照HELLO WORLD新建Block Design&#xff0c;打开AXI HP0 interface,配置PL Fabric Clocks 时钟 添加转换模块 添加复位 添加时钟并进行连接 配置端口属性 连接复位后保存&#xff1a; 分配地址 代码 https://github.co…