@rock-js/platform-android 0.12.9 → 0.12.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ import type { PluginApi } from '@rock-js/config';
2
+ export declare function registerValidateElfAlignmentCommand(api: PluginApi): void;
3
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../../src/lib/commands/validateElfAlignment/command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAWjD,wBAAgB,mCAAmC,CAAC,GAAG,EAAE,SAAS,QAoBjE"}
@@ -0,0 +1,27 @@
1
+ import path from 'node:path';
2
+ import { outro, RockError } from '@rock-js/tools';
3
+ import { validateElfAlignment } from './validateElfAlignment.js';
4
+ const ARGUMENTS = [
5
+ {
6
+ name: 'binaryPath',
7
+ description: 'Path to APK file to validate.',
8
+ },
9
+ ];
10
+ export function registerValidateElfAlignmentCommand(api) {
11
+ api.registerCommand({
12
+ name: 'validate-elf-alignment',
13
+ description: 'Validate ELF alignment of shared libraries in an APK.',
14
+ args: ARGUMENTS,
15
+ action: async (binaryPath) => {
16
+ if (!binaryPath) {
17
+ throw new RockError('Missing APK path. Provide it as an argument.');
18
+ }
19
+ if (path.extname(binaryPath).toLowerCase() !== '.apk') {
20
+ throw new RockError(`Expected an .apk file, got "${path.extname(binaryPath) || 'no extension'}".`);
21
+ }
22
+ await validateElfAlignment(binaryPath);
23
+ outro('Success 🎉.');
24
+ },
25
+ });
26
+ }
27
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../../../src/lib/commands/validateElfAlignment/command.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,SAAS,GAAG;IAChB;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,+BAA+B;KAC7C;CACF,CAAC;AAEF,MAAM,UAAU,mCAAmC,CAAC,GAAc;IAChE,GAAG,CAAC,eAAe,CAAC;QAClB,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,uDAAuD;QACpE,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,KAAK,EAAE,UAA8B,EAAE,EAAE;YAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,SAAS,CACjB,8CAA8C,CAC/C,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;gBACtD,MAAM,IAAI,SAAS,CACjB,+BAA+B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,cAAc,IAAI,CAC9E,CAAC;YACJ,CAAC;YACD,MAAM,oBAAoB,CAAC,UAAU,CAAC,CAAC;YACvC,KAAK,CAAC,aAAa,CAAC,CAAC;QACvB,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const ELF_ALIGNMENT_REGEX: RegExp;
2
+ export declare function validateElfAlignment(apkPath: string): Promise<void>;
3
+ //# sourceMappingURL=validateElfAlignment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateElfAlignment.d.ts","sourceRoot":"","sources":["../../../../../src/lib/commands/validateElfAlignment/validateElfAlignment.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAE7E,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,iBA0CzD"}
@@ -0,0 +1,165 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { color, logger, RockError, spawn, } from '@rock-js/tools';
5
+ import { findAndroidBuildTool, getAndroidBuildToolsPath } from '../../paths.js';
6
+ export const ELF_ALIGNMENT_REGEX = /2\*\*(1[4-9]|[2-9][0-9]|[1-9][0-9]{2,})/;
7
+ export async function validateElfAlignment(apkPath) {
8
+ if (!fs.existsSync(apkPath)) {
9
+ throw new RockError(`APK not found "${apkPath}".`);
10
+ }
11
+ const tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), `${path.basename(apkPath, '.apk')}_elf_`));
12
+ try {
13
+ logger.log('Checking APK ELF alignment...');
14
+ await runZipAlignCheck(apkPath);
15
+ const hasNativeLibs = await extractApkLibs(apkPath, tempDir);
16
+ if (!hasNativeLibs) {
17
+ logger.info('No native shared libraries found in APK. Skipping ELF alignment check.');
18
+ return;
19
+ }
20
+ const unalignedLibs = await findUnalignedLibs(tempDir);
21
+ if (unalignedLibs.length > 0) {
22
+ logger.info(`Found ${unalignedLibs.length} unaligned libs:`);
23
+ for (const lib of unalignedLibs) {
24
+ logger.info(` - ${lib}`);
25
+ }
26
+ }
27
+ const critical = unalignedLibs.filter(isRequiredAlignedAbi);
28
+ if (critical.length > 0) {
29
+ logger.warn(`\nThe following ${critical.length} lib(s) must be 16KB aligned (arm64-v8a/x86_64):`);
30
+ for (const lib of critical) {
31
+ logger.warn(` - ${lib}`);
32
+ }
33
+ throw new RockError('ELF alignment check failed.');
34
+ }
35
+ logger.info('ELF alignment check passed.');
36
+ }
37
+ finally {
38
+ await fs.promises.rm(tempDir, { recursive: true, force: true });
39
+ }
40
+ }
41
+ async function runZipAlignCheck(apkPath) {
42
+ const zipAlignPath = findAndroidBuildTool('zipalign');
43
+ if (!zipAlignPath) {
44
+ logger.info(`NOTICE: "zipalign" not found in Android Build-Tools directory: ${color.bold(getAndroidBuildToolsPath())}`);
45
+ return;
46
+ }
47
+ const supportsPageSize = await spawn(zipAlignPath, ['--help'], {
48
+ stdio: 'pipe',
49
+ })
50
+ .then(({ output }) => output.includes('-P <pagesize_kb>'))
51
+ .catch(() => false);
52
+ if (!supportsPageSize) {
53
+ logger.info('NOTICE: Zip alignment check requires build-tools version 35.0.0-rc3 or higher.');
54
+ logger.info(' You can install the latest build-tools by running:');
55
+ logger.info(' sdkmanager "build-tools;35.0.0-rc3"');
56
+ return;
57
+ }
58
+ try {
59
+ const { output } = await spawn(zipAlignPath, ['-v', '-c', '-P', '16', '4', apkPath], { stdio: 'pipe' });
60
+ const filtered = output
61
+ .split('\n')
62
+ .filter((line) => line.includes('lib/arm64-v8a') ||
63
+ line.includes('lib/x86_64') ||
64
+ line.includes('Verification'))
65
+ .join('\n')
66
+ .trim();
67
+ if (filtered) {
68
+ logger.log('APK zip-alignment');
69
+ logger.log(filtered);
70
+ }
71
+ }
72
+ catch (error) {
73
+ const errorMessage = error.stderr || error.stdout;
74
+ logger.warn(`Zip alignment check failed: ${errorMessage}`.trim());
75
+ }
76
+ }
77
+ /**
78
+ * Extracts native shared libraries from the APK.
79
+ * Returns `false` if the APK contains no native libraries (unzip exit code 11).
80
+ * This mirrors Android's check_elf_alignment.sh which ignores unzip failures
81
+ * when no lib/ entries exist.
82
+ */
83
+ async function extractApkLibs(apkPath, tempDir) {
84
+ try {
85
+ await spawn('unzip', [apkPath, 'lib/*', '-d', tempDir], { stdio: 'pipe' });
86
+ return true;
87
+ }
88
+ catch (error) {
89
+ // unzip exits with code 11 when no files match the pattern,
90
+ // e.g. a pure Kotlin/Java APK with no native libraries.
91
+ if (error.exitCode === 11) {
92
+ return false;
93
+ }
94
+ throw new RockError(`Failed to extract shared libraries from APK: ${apkPath}`, { cause: error.stderr });
95
+ }
96
+ }
97
+ const REQUIRED_ALIGNED_ABIS = ['arm64-v8a', 'x86_64'];
98
+ async function findUnalignedLibs(rootDir) {
99
+ const files = await listFiles(rootDir);
100
+ const unaligned = [];
101
+ for (const filePath of files) {
102
+ const isElf = await isElfBinary(filePath);
103
+ if (!isElf) {
104
+ continue;
105
+ }
106
+ const alignment = await readElfAlignment(filePath);
107
+ if (alignment && ELF_ALIGNMENT_REGEX.test(alignment)) {
108
+ logger.debug(`${path.relative(rootDir, filePath)}: ALIGNED (${alignment})`);
109
+ continue;
110
+ }
111
+ logger.debug(`${path.relative(rootDir, filePath)}: UNALIGNED (${alignment || 'unknown'})`);
112
+ unaligned.push(path.relative(rootDir, filePath));
113
+ }
114
+ return unaligned;
115
+ }
116
+ function isRequiredAlignedAbi(libPath) {
117
+ return REQUIRED_ALIGNED_ABIS.some((abi) => libPath.startsWith(`lib/${abi}/`));
118
+ }
119
+ async function isElfBinary(filePath) {
120
+ try {
121
+ const { output } = await spawn('file', [filePath], { stdio: 'pipe' });
122
+ return output.includes(': ELF');
123
+ }
124
+ catch (error) {
125
+ throw new RockError(`Failed to inspect file type for "${filePath}".`, {
126
+ cause: error.stderr,
127
+ });
128
+ }
129
+ }
130
+ async function readElfAlignment(filePath) {
131
+ try {
132
+ const { output } = await spawn('objdump', ['-p', filePath], {
133
+ stdio: 'pipe',
134
+ });
135
+ const loadLine = output
136
+ .split('\n')
137
+ .map((line) => line.trim())
138
+ .find((line) => line.startsWith('LOAD'));
139
+ if (!loadLine) {
140
+ return '';
141
+ }
142
+ const parts = loadLine.split(/\s+/);
143
+ return parts[parts.length - 1] ?? '';
144
+ }
145
+ catch (error) {
146
+ throw new RockError(`Failed to inspect ELF headers for "${filePath}".`, {
147
+ cause: error.stderr,
148
+ });
149
+ }
150
+ }
151
+ async function listFiles(dir) {
152
+ const entries = await fs.promises.readdir(dir, { withFileTypes: true });
153
+ const files = [];
154
+ for (const entry of entries) {
155
+ const fullPath = path.join(dir, entry.name);
156
+ if (entry.isDirectory()) {
157
+ files.push(...(await listFiles(fullPath)));
158
+ }
159
+ else if (entry.isFile()) {
160
+ files.push(fullPath);
161
+ }
162
+ }
163
+ return files;
164
+ }
165
+ //# sourceMappingURL=validateElfAlignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateElfAlignment.js","sourceRoot":"","sources":["../../../../../src/lib/commands/validateElfAlignment/validateElfAlignment.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"platformAndroid.d.ts","sourceRoot":"","sources":["../../../src/lib/platformAndroid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAOjE,KAAK,YAAY,GAAG,oBAAoB,CAAC;AAEzC,eAAO,MAAM,eAAe,GACzB,eAAe,OAAO,CAAC,YAAY,CAAC,MACpC,KAAK,SAAS,KAAG,cAmBjB,CAAC;AAEJ,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"platformAndroid.d.ts","sourceRoot":"","sources":["../../../src/lib/platformAndroid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQjE,KAAK,YAAY,GAAG,oBAAoB,CAAC;AAEzC,eAAO,MAAM,eAAe,GACzB,eAAe,OAAO,CAAC,YAAY,CAAC,MACpC,KAAK,SAAS,KAAG,cAoBjB,CAAC;AAEJ,eAAe,eAAe,CAAC"}
@@ -3,9 +3,11 @@ import { registerCreateKeystoreCommand } from './commands/generateKeystore.js';
3
3
  import { getValidProjectConfig } from './commands/getValidProjectConfig.js';
4
4
  import { registerRunCommand } from './commands/runAndroid/command.js';
5
5
  import { registerSignCommand } from './commands/signAndroid/command.js';
6
+ import { registerValidateElfAlignmentCommand } from './commands/validateElfAlignment/command.js';
6
7
  export const platformAndroid = (pluginConfig) => (api) => {
7
8
  registerBuildCommand(api, pluginConfig);
8
9
  registerRunCommand(api, pluginConfig);
10
+ registerValidateElfAlignmentCommand(api);
9
11
  registerCreateKeystoreCommand(api, pluginConfig);
10
12
  registerSignCommand(api);
11
13
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"platformAndroid.js","sourceRoot":"","sources":["../../../src/lib/platformAndroid.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAIxE,MAAM,CAAC,MAAM,eAAe,GAC1B,CAAC,YAAoC,EAAE,EAAE,CACzC,CAAC,GAAc,EAAkB,EAAE;IACjC,oBAAoB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACxC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACtC,6BAA6B,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACjD,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAEzB,OAAO;QACL,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,qCAAqC;QAClD,iBAAiB,EAAE;YACjB,IAAI,OAAO;gBACT,MAAM,aAAa,GAAG,qBAAqB,CACzC,GAAG,CAAC,cAAc,EAAE,EACpB,YAAY,CACb,CAAC;gBACF,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;YAC9B,CAAC;SACF;KACF,CAAC;AACJ,CAAC,CAAC;AAEJ,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"platformAndroid.js","sourceRoot":"","sources":["../../../src/lib/platformAndroid.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,mCAAmC,EAAE,MAAM,4CAA4C,CAAC;AAIjG,MAAM,CAAC,MAAM,eAAe,GAC1B,CAAC,YAAoC,EAAE,EAAE,CACzC,CAAC,GAAc,EAAkB,EAAE;IACjC,oBAAoB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACxC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACtC,mCAAmC,CAAC,GAAG,CAAC,CAAC;IACzC,6BAA6B,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACjD,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAEzB,OAAO;QACL,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,qCAAqC;QAClD,iBAAiB,EAAE;YACjB,IAAI,OAAO;gBACT,MAAM,aAAa,GAAG,qBAAqB,CACzC,GAAG,CAAC,cAAc,EAAE,EACpB,YAAY,CACb,CAAC;gBACF,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;YAC9B,CAAC;SACF;KACF,CAAC;AACJ,CAAC,CAAC;AAEJ,eAAe,eAAe,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rock-js/platform-android",
3
- "version": "0.12.9",
3
+ "version": "0.12.10",
4
4
  "description": "Android platform support and configuration for Rock",
5
5
  "type": "module",
6
6
  "types": "./dist/src/index.d.ts",
@@ -21,12 +21,12 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "@react-native-community/cli-config-android": "^20.0.0",
24
- "@rock-js/tools": "^0.12.9",
24
+ "@rock-js/tools": "^0.12.10",
25
25
  "tslib": "^2.3.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@react-native-community/cli-types": "^20.0.0",
29
- "@rock-js/config": "^0.12.9"
29
+ "@rock-js/config": "^0.12.10"
30
30
  },
31
31
  "publishConfig": {
32
32
  "access": "public"
@@ -4,6 +4,6 @@
4
4
  "android": "rock run:android"
5
5
  },
6
6
  "devDependencies": {
7
- "@rock-js/platform-android": "^0.12.9"
7
+ "@rock-js/platform-android": "^0.12.10"
8
8
  }
9
9
  }