build-aar.sh
6.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#!/bin/bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_ROOT="$(cd "$ROOT_DIR/../../.." && pwd)"
OUT_DIR="$(cd "$ROOT_DIR/.." && pwd)/android"
SRC_DIR="$ROOT_DIR/src"
BUILD_DIR="$ROOT_DIR/build"
DEPS_DIR="$ROOT_DIR/deps"
UPOS_DEMO_ROOT="$PROJECT_ROOT/UnifiedPOSDevicesDemo_V1.026_EN"
UPOS_AAR="$UPOS_DEMO_ROOT/app/libs/possdk-release.aar"
UPOS_CORE_JAR="$UPOS_DEMO_ROOT/app/libs/core-2.3.0.jar"
STUB_DIR="$BUILD_DIR/stubs"
CLASS_DIR="$BUILD_DIR/classes"
STUB_CLASS_DIR="$BUILD_DIR/stub-classes"
ANDROID_JAR="${ANDROID_JAR:-$HOME/Library/Android/sdk/platforms/android-34/android.jar}"
SDK_LIB_JAR="${SDK_LIB_JAR:-$PROJECT_ROOT/打印机SDK/Android/标签打印机安卓SDK-V3.3.1-20230327/TscDemo/app/libs/SDKLib.jar}"
OUT_AAR="$OUT_DIR/native_fast_printer-release.aar"
# Git Bash / MSYS:Windows 路径 C:\... 需转成 /c/...,否则 javac 拿不到 android.jar(会报 android.* 不存在)
normalize_path_for_bash() {
local p="$1"
if [[ -z "$p" ]]; then
echo ""
return
fi
if command -v cygpath >/dev/null 2>&1; then
cygpath -u "$p" 2>/dev/null || echo "$p"
return
fi
if [[ "$p" =~ ^[A-Za-z]: ]]; then
local d
d=$(echo "${p:0:1}" | tr '[:upper:]' '[:lower:]')
local r="${p:2}"
r="${r//\\//}"
echo "/$d$r"
return
fi
echo "$p"
}
ANDROID_JAR="$(normalize_path_for_bash "$ANDROID_JAR")"
SDK_LIB_JAR="$(normalize_path_for_bash "$SDK_LIB_JAR")"
UPOS_AAR="$(normalize_path_for_bash "$UPOS_AAR")"
UPOS_CORE_JAR="$(normalize_path_for_bash "$UPOS_CORE_JAR")"
mkdir -p "$DEPS_DIR"
JSON_JAR="$DEPS_DIR/json-20240303.jar"
if [[ ! -f "$JSON_JAR" ]]; then
echo "Downloading org.json jar for host compile..."
curl -fsSL -o "$JSON_JAR" "https://repo1.maven.org/maven2/org/json/json/20240303/json-20240303.jar"
fi
UPOS_CLASSES_JAR="$DEPS_DIR/possdk-classes.jar"
UPOS_JNI_DIR="$DEPS_DIR/possdk-jni"
if [[ -f "$UPOS_AAR" ]]; then
if [[ ! -f "$UPOS_CLASSES_JAR" ]] || [[ "$UPOS_AAR" -nt "$UPOS_CLASSES_JAR" ]] || [[ ! -d "$UPOS_JNI_DIR" ]]; then
echo "Extracting possdk classes.jar/jni from AAR..."
TMP_UPOS_DIR="$DEPS_DIR/.upos_aar_extract"
rm -rf "$TMP_UPOS_DIR"
mkdir -p "$TMP_UPOS_DIR"
(
cd "$TMP_UPOS_DIR"
# AAR is ZIP; jar can extract it.
jar xf "$UPOS_AAR"
)
if [[ ! -f "$TMP_UPOS_DIR/classes.jar" ]]; then
echo "ERROR: classes.jar not found inside possdk-release.aar" >&2
exit 1
fi
cp "$TMP_UPOS_DIR/classes.jar" "$UPOS_CLASSES_JAR"
rm -rf "$UPOS_JNI_DIR"
if [[ -d "$TMP_UPOS_DIR/jni" ]]; then
mkdir -p "$UPOS_JNI_DIR"
cp -R "$TMP_UPOS_DIR/jni/." "$UPOS_JNI_DIR/"
fi
rm -rf "$TMP_UPOS_DIR"
fi
else
echo "WARN: UnifiedPOS possdk-release.aar not found: $UPOS_AAR"
fi
rm -rf "$BUILD_DIR"
mkdir -p "$STUB_DIR/com/taobao/weex/annotation" \
"$STUB_DIR/com/taobao/weex/bridge" \
"$STUB_DIR/io/dcloud/feature/uniapp/common" \
"$STUB_DIR/com/alibaba/fastjson" \
"$CLASS_DIR" "$STUB_CLASS_DIR" "$OUT_DIR" "$BUILD_DIR/libs"
cat > "$STUB_DIR/com/taobao/weex/annotation/JSMethod.java" <<'STUB'
package com.taobao.weex.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface JSMethod { boolean uiThread() default true; }
STUB
cat > "$STUB_DIR/com/taobao/weex/bridge/JSCallback.java" <<'STUB'
package com.taobao.weex.bridge;
public interface JSCallback {
void invoke(Object value);
void invokeAndKeepAlive(Object value);
}
STUB
cat > "$STUB_DIR/io/dcloud/feature/uniapp/common/UniModule.java" <<'STUB'
package io.dcloud.feature.uniapp.common;
public class UniModule {}
STUB
cat > "$STUB_DIR/com/alibaba/fastjson/JSONObject.java" <<'STUB'
package com.alibaba.fastjson;
import java.util.HashMap;
public class JSONObject extends HashMap<String, Object> {
public String getString(String key){ Object v = get(key); return v == null ? null : String.valueOf(v); }
public Integer getInteger(String key){ Object v = get(key); if (v == null) return null; if (v instanceof Number) return ((Number)v).intValue(); return Integer.parseInt(String.valueOf(v)); }
}
STUB
if [[ ! -f "$ANDROID_JAR" ]]; then
echo "ERROR: ANDROID_JAR not found: $ANDROID_JAR" >&2
echo "Set ANDROID_JAR to your SDK platforms/android-XX/android.jar" >&2
exit 1
fi
if [[ ! -f "$SDK_LIB_JAR" ]]; then
echo "ERROR: SDK_LIB_JAR not found: $SDK_LIB_JAR" >&2
exit 1
fi
CP_MAIN="$ANDROID_JAR:$BUILD_DIR/stubs.jar:$SDK_LIB_JAR:$JSON_JAR"
if [[ -f "$UPOS_CLASSES_JAR" ]]; then
CP_MAIN="$CP_MAIN:$UPOS_CLASSES_JAR"
fi
if [[ -f "$UPOS_CORE_JAR" ]]; then
CP_MAIN="$CP_MAIN:$UPOS_CORE_JAR"
fi
find "$STUB_DIR" -name '*.java' -print0 | xargs -0 javac -source 1.8 -target 1.8 -encoding UTF-8 -cp "$ANDROID_JAR" -d "$STUB_CLASS_DIR"
jar cf "$BUILD_DIR/stubs.jar" -C "$STUB_CLASS_DIR" .
find "$SRC_DIR" -name '*.java' -print0 | xargs -0 javac -source 1.8 -target 1.8 -encoding UTF-8 -cp "$CP_MAIN" -d "$CLASS_DIR"
jar cf "$BUILD_DIR/classes.jar" -C "$CLASS_DIR" .
cp "$SDK_LIB_JAR" "$BUILD_DIR/libs/SDKLib.jar"
if [[ -f "$UPOS_CLASSES_JAR" ]]; then
cp "$UPOS_CLASSES_JAR" "$BUILD_DIR/libs/possdk-classes.jar"
fi
if [[ -f "$UPOS_CORE_JAR" ]]; then
cp "$UPOS_CORE_JAR" "$BUILD_DIR/libs/core-2.3.0.jar"
fi
if [[ -d "$UPOS_JNI_DIR" ]]; then
mkdir -p "$BUILD_DIR/jni"
cp -R "$UPOS_JNI_DIR/." "$BUILD_DIR/jni/"
fi
cat > "$BUILD_DIR/AndroidManifest.xml" <<'MANIFEST'
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.foodlabel.nativeprinter" />
MANIFEST
: > "$BUILD_DIR/R.txt"
mkdir -p "$BUILD_DIR/META-INF/com/android/build/gradle"
cat > "$BUILD_DIR/META-INF/com/android/build/gradle/aar-metadata.properties" <<'META'
aarFormatVersion=1.0
aarMetadataVersion=1.0
META
cd "$BUILD_DIR"
rm -f "$OUT_AAR"
# Windows Git Bash 通常没有 zip;AAR 本质是 ZIP,用 JDK 自带的 jar 打包(与 javac 同目录)
if command -v zip >/dev/null 2>&1; then
zip -q -r "$OUT_AAR" AndroidManifest.xml classes.jar R.txt META-INF libs jni
else
if ! command -v jar >/dev/null 2>&1; then
echo "ERROR: neither zip nor jar found in PATH. Install JDK and add JAVA_HOME/bin to PATH." >&2
exit 127
fi
# c0 = 仅存储;M = 不生成 jar 默认 MANIFEST(避免污染 AAR 的 META-INF)
jar c0Mf "$OUT_AAR" AndroidManifest.xml classes.jar R.txt META-INF libs jni
fi
echo "Built AAR: $OUT_AAR"