用的是 android studio 创建了一个工程,然后手动在命令行打包,进入工程里的
cd ~/Desktop/DexTest/app/src/main
mkdir gen
mkdir build
mkdir out
sdk 22.以后删除了 apkbuilder,可以在sdk 的 tools 目录里执行:
cat android | sed -e 's/com.android.sdkmanager.Main/com.android.sdklib.build.ApkBuilderMain/g' > apkbuilder
sudo chmod +x apkbuilder
#手动打包apk
SDK=/Users/yzr/Library/Android/sdk
BUILD_TOOLS=$(SDK)/build-tools/23.0.3
PLATFORMS=$(SDK)/platforms/android-23
aapt=$(BUILD_TOOLS)/aapt
dx=$(BUILD_TOOLS)/dx
aidl=$(BUILD_TOOLS)/aidl
apkbuilder=$(SDK)/tools/apkbuilder
adb=$(SDK)/platform-tools/adb
#资源编译,生成 R.java
aapt_task:
$(aapt) package \
-f \ #如果编译出来的文件已经存在,强制覆盖
-M AndroidManifest.xml \ # Mainifest.xml 的路径
-I $(PLATFORMS)/android.jar \ # 某个版本平台的 android.jar 的路径
-S res/ \ # res 文件夹路径
-J gen/ \ # 生成 R.java 的输出目录
-m #使得生成的包的目录放在 -J 参数指定的目录
#代码编译,生成 .class
javac_task:
javac -source 1.7 -target 1.7 \ # 使用 jdk1.8 编译 1.7 的 .class 文件
-encoding UTF-8 \
-bootclasspath $(PLATFORMS)/android.jar \ #覆盖引导类文件的位置
-d build/ \ #指定放置生成的类文件的位置
java/thereisnospon/dextest/*.java \
gen/thereisnospon/dextest/*.java \
#生成 .dex
dx_task:
$(dx) --dex --output=build/classes.dex \ #输出文件
build #输入目录
#资源文件初始包
resapk_task:
$(aapt) package -f \
-M AndroidManifest.xml \
-I $(PLATFORMS)/android.jar \
-S res/ \
-F out/pre.apk
#将.dex 文件加入到资源文件初始包中
apk_task:
$(apkbuilder) out/app.apk \
-v \
-u \
-z out/pre.apk \
-f build/classes.dex \
#签名,使用debug的签名
signer:
jarsigner -verbose \
-keystore ~/.android/debug.keystore \
-storepass android \
-keypass android \
out/app.apk androiddebugkey
#一次性打包
pkg:
make aapt_task
make javac_task
make dx_task
make resapk_task
make apk_task
make signer
#卸载apk
uninstall:
$(adb) uninstall thereisnospon.dextest
#安装apk
install:
$(adb) install out/app.apk
#运行
run:
make pkg
make uninstall
make install
$(adb) shell am start -n thereisnospon.dextest/thereisnospon.dextest.MainActivity
保存到 src/main 中为 Makefile
执行命令 :
make run