Android学习19 -- 手搓App

1 前言

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

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

2 代码结构

代码架构如下:

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

MainActivity.java

java 复制代码
package com.example.simpleapp;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        tv.setText("Hello, Android!");
        setContentView(tv);
    }
}

AndroidManifest.xml

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命令可以看现在可以下载哪些。

bash 复制代码
sdkmanager --list --sdk_root=D:\Tools\Adnroid_SDK

先安装build tool

bash 复制代码
sdkmanager --install "build-tools;35.0.0"

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

bash 复制代码
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文件

bash 复制代码
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文件。

bash 复制代码
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。

bash 复制代码
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拖进去也行。。

bash 复制代码
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打开,此时内容如下:

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

bash 复制代码
zipalign -v 4 build/apk/app-debug-unaligned.apk build/apk/app-debug.apk

4.4 签名

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

签名的步骤如下:

bash 复制代码
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调试打开。

bash 复制代码
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

相关推荐
江太翁几秒前
mediapipe流水线分析 三
android·mediapipe
与火星的孩子对话30 分钟前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
tmacfrank2 小时前
Android 网络全栈攻略(四)—— TCPIP 协议族与 HTTPS 协议
android·网络·https
fundroid3 小时前
Kotlin 协程:Channel 与 Flow 深度对比及 Channel 使用指南
android·kotlin·协程
草字3 小时前
cocos 打包安卓
android
DeBuggggggg4 小时前
centos 7.6安装mysql8
android
浩浩测试一下5 小时前
渗透信息收集- Web应用漏洞与指纹信息收集以及情报收集
android·前端·安全·web安全·网络安全·安全架构
移动开发者1号6 小时前
深入理解原子类与CAS无锁编程:原理、实战与优化
android·kotlin
陈卓4106 小时前
MySQL-主从复制&分库分表
android·mysql·adb
移动开发者1号6 小时前
深入理解 ThreadLocal:原理、实战与优化指南
android·kotlin