@novastera-oss/nitro-metamask 0.6.2 → 0.7.0

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.
Files changed (168) hide show
  1. package/NitroMetamask.podspec +12 -3
  2. package/android/build.gradle +10 -13
  3. package/android/cargo-ecies.gradle +59 -78
  4. package/android/src/main/aidl/io/metamask/nativesdk/IMessegeService.aidl +8 -0
  5. package/android/src/main/aidl/io/metamask/nativesdk/IMessegeServiceCallback.aidl +8 -0
  6. package/android/src/main/java/com/margelo/nitro/nitrometamask/HybridNitroMetamask.kt +101 -3
  7. package/android/src/main/java/io/metamask/androidsdk/AnyRequest.kt +8 -0
  8. package/android/src/main/java/io/metamask/androidsdk/ClientMessageServiceCallback.kt +12 -0
  9. package/android/src/main/java/io/metamask/androidsdk/ClientServiceConnection.kt +42 -0
  10. package/android/src/main/java/io/metamask/androidsdk/CommunicationClient.kt +525 -0
  11. package/android/src/main/java/io/metamask/androidsdk/CommunicationClientModule.kt +47 -0
  12. package/android/src/main/java/io/metamask/androidsdk/CommunicationClientModuleInterface.kt +11 -0
  13. package/android/src/main/java/io/metamask/androidsdk/Constants.kt +5 -0
  14. package/android/src/main/java/io/metamask/androidsdk/Crypto.kt +35 -0
  15. package/android/src/main/java/io/metamask/androidsdk/DappMetadata.kt +36 -0
  16. package/android/src/main/java/io/metamask/androidsdk/Encryption.kt +9 -0
  17. package/android/src/main/java/io/metamask/androidsdk/ErrorType.kt +41 -0
  18. package/android/src/main/java/io/metamask/androidsdk/Ethereum.kt +328 -0
  19. package/android/src/main/java/io/metamask/androidsdk/EthereumEventCallback.kt +6 -0
  20. package/android/src/main/java/io/metamask/androidsdk/EthereumMethod.kt +80 -0
  21. package/android/src/main/java/io/metamask/androidsdk/EthereumRequest.kt +7 -0
  22. package/android/src/main/java/io/metamask/androidsdk/EthereumState.kt +7 -0
  23. package/android/src/main/java/io/metamask/androidsdk/KeyExchange.kt +77 -0
  24. package/android/src/main/java/io/metamask/androidsdk/KeyExchangeMessageType.kt +20 -0
  25. package/android/src/main/java/io/metamask/androidsdk/KeyStorage.kt +122 -0
  26. package/android/src/main/java/io/metamask/androidsdk/Logger.kt +18 -0
  27. package/android/src/main/java/io/metamask/androidsdk/Message.kt +3 -0
  28. package/android/src/main/java/io/metamask/androidsdk/MessageType.kt +11 -0
  29. package/android/src/main/java/io/metamask/androidsdk/OriginatorInfo.kt +12 -0
  30. package/android/src/main/java/io/metamask/androidsdk/RequestError.kt +8 -0
  31. package/android/src/main/java/io/metamask/androidsdk/RequestInfo.kt +9 -0
  32. package/android/src/main/java/io/metamask/androidsdk/Result.kt +11 -0
  33. package/android/src/main/java/io/metamask/androidsdk/RpcRequest.kt +7 -0
  34. package/android/src/main/java/io/metamask/androidsdk/SDKInfo.kt +6 -0
  35. package/android/src/main/java/io/metamask/androidsdk/SDKOptions.kt +6 -0
  36. package/android/src/main/java/io/metamask/androidsdk/SecureStorage.kt +9 -0
  37. package/android/src/main/java/io/metamask/androidsdk/SessionConfig.kt +10 -0
  38. package/android/src/main/java/io/metamask/androidsdk/SessionManager.kt +92 -0
  39. package/android/src/main/java/io/metamask/androidsdk/SubmittedRequest.kt +8 -0
  40. package/android/src/main/java/io/metamask/androidsdk/TimeStampGenerator.kt +7 -0
  41. package/android/src/main/jniLibs/arm64-v8a/libecies.so +0 -0
  42. package/android/src/main/jniLibs/armeabi-v7a/libecies.so +0 -0
  43. package/android/src/main/jniLibs/x86/libecies.so +0 -0
  44. package/android/src/main/jniLibs/x86_64/libecies.so +0 -0
  45. package/android/src/test/java/com/margelo/nitro/nitrometamask/CancellationStateMachineTest.kt +128 -0
  46. package/android/src/test/java/com/margelo/nitro/nitrometamask/ChainIdParsingTest.kt +65 -0
  47. package/android/src/test/java/com/margelo/nitro/nitrometamask/ConfigureStateMachineTest.kt +140 -0
  48. package/android/src/test/java/com/margelo/nitro/nitrometamask/ConnectSignJsonTest.kt +76 -0
  49. package/android/src/test/java/com/margelo/nitro/nitrometamask/MetaMaskInstallationCheckTest.kt +42 -0
  50. package/android/src/test/java/com/margelo/nitro/nitrometamask/PersonalSignParamsTest.kt +75 -0
  51. package/ios/Frameworks/Ecies.xcframework/Info.plist +47 -0
  52. package/ios/Frameworks/Ecies.xcframework/ios-arm64/Headers/ecies.h +20 -0
  53. package/ios/Frameworks/Ecies.xcframework/ios-arm64/Headers/module.modulemap +4 -0
  54. package/ios/Frameworks/Ecies.xcframework/ios-arm64/libecies.a +0 -0
  55. package/ios/Frameworks/Ecies.xcframework/ios-arm64-simulator/Headers/ecies.h +20 -0
  56. package/ios/Frameworks/Ecies.xcframework/ios-arm64-simulator/Headers/module.modulemap +4 -0
  57. package/ios/Frameworks/Ecies.xcframework/ios-arm64-simulator/libecies.a +0 -0
  58. package/ios/HybridNitroMetamask.swift +119 -54
  59. package/ios/NitroMetamaskTests/CancellationStateMachineTests.swift +150 -0
  60. package/ios/NitroMetamaskTests/ChainIdParsingTests.swift +117 -0
  61. package/ios/NitroMetamaskTests/ConfigureStateMachineTests.swift +174 -0
  62. package/ios/NitroMetamaskTests/ConnectSignJsonTests.swift +168 -0
  63. package/ios/NitroMetamaskTests/DefaultDappUrlTests.swift +80 -0
  64. package/ios/NitroMetamaskTests/PersonalSignParamsTests.swift +101 -0
  65. package/ios/metamask-ios-sdk/CommunicationLayer/CommClient.swift +43 -0
  66. package/ios/metamask-ios-sdk/CommunicationLayer/CommClientFactory.swift +17 -0
  67. package/ios/metamask-ios-sdk/CommunicationLayer/CommLayer.swift +36 -0
  68. package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/Deeplink.swift +26 -0
  69. package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/DeeplinkClient.swift +199 -0
  70. package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/DeeplinkManager.swift +83 -0
  71. package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/String.swift +48 -0
  72. package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/URLOpener.swift +19 -0
  73. package/ios/metamask-ios-sdk/CommunicationLayer/SocketClient.swift +27 -0
  74. package/ios/metamask-ios-sdk/Crypto/Crypto.swift +72 -0
  75. package/ios/metamask-ios-sdk/Crypto/Encoding.swift +15 -0
  76. package/ios/metamask-ios-sdk/Crypto/KeyExchange.swift +236 -0
  77. package/ios/metamask-ios-sdk/DeviceInfo/DeviceInfo.swift +11 -0
  78. package/ios/metamask-ios-sdk/Ethereum/AppMetadata.swift +28 -0
  79. package/ios/metamask-ios-sdk/Ethereum/ErrorType.swift +62 -0
  80. package/ios/metamask-ios-sdk/Ethereum/Ethereum.swift +810 -0
  81. package/ios/metamask-ios-sdk/Ethereum/EthereumMethod.swift +111 -0
  82. package/ios/metamask-ios-sdk/Ethereum/EthereumRequest.swift +40 -0
  83. package/ios/metamask-ios-sdk/Ethereum/EthereumWrapper.swift +10 -0
  84. package/ios/metamask-ios-sdk/Ethereum/RPCRequest.swift +14 -0
  85. package/ios/metamask-ios-sdk/Ethereum/RequestError.swift +88 -0
  86. package/ios/metamask-ios-sdk/Ethereum/ResponseMethod.swift +22 -0
  87. package/ios/metamask-ios-sdk/Ethereum/SubmitRequest.swift +26 -0
  88. package/ios/metamask-ios-sdk/Ethereum/TimestampGenerator.swift +16 -0
  89. package/ios/metamask-ios-sdk/Extensions/NSRecursiveLock.swift +14 -0
  90. package/ios/metamask-ios-sdk/Extensions/Notification.swift +10 -0
  91. package/ios/metamask-ios-sdk/Logger/Logging.swift +27 -0
  92. package/ios/metamask-ios-sdk/Models/AddChainParameters.swift +35 -0
  93. package/ios/metamask-ios-sdk/Models/Event.swift +19 -0
  94. package/ios/metamask-ios-sdk/Models/Mappable.swift +40 -0
  95. package/ios/metamask-ios-sdk/Models/NativeCurrency.swift +25 -0
  96. package/ios/metamask-ios-sdk/Models/OriginatorInfo.swift +26 -0
  97. package/ios/metamask-ios-sdk/Models/RequestInfo.swift +18 -0
  98. package/ios/metamask-ios-sdk/Models/SignContract.swift +48 -0
  99. package/ios/metamask-ios-sdk/Models/Typealiases.swift +9 -0
  100. package/ios/metamask-ios-sdk/Persistence/SecureStore.swift +134 -0
  101. package/ios/metamask-ios-sdk/Persistence/SessionConfig.swift +24 -0
  102. package/ios/metamask-ios-sdk/Persistence/SessionManager.swift +56 -0
  103. package/ios/metamask-ios-sdk/SDK/Dependencies.swift +35 -0
  104. package/ios/metamask-ios-sdk/SDK/MetaMaskSDK.swift +215 -0
  105. package/ios/metamask-ios-sdk/SDK/SDKInfo.swift +37 -0
  106. package/ios/metamask-ios-sdk/SDK/SDKOptions.swift +16 -0
  107. package/lib/commonjs/index.js +50 -3
  108. package/lib/commonjs/index.js.map +1 -1
  109. package/lib/module/index.js +49 -3
  110. package/lib/module/index.js.map +1 -1
  111. package/lib/typescript/src/__tests__/parseNitroError.test.d.ts +2 -0
  112. package/lib/typescript/src/__tests__/parseNitroError.test.d.ts.map +1 -0
  113. package/lib/typescript/src/index.d.ts +43 -3
  114. package/lib/typescript/src/index.d.ts.map +1 -1
  115. package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts +34 -6
  116. package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts.map +1 -1
  117. package/nitro.json +8 -2
  118. package/nitrogen/generated/android/NitroMetamask+autolinking.cmake +1 -1
  119. package/nitrogen/generated/android/NitroMetamask+autolinking.gradle +1 -1
  120. package/nitrogen/generated/android/NitroMetamaskOnLoad.cpp +27 -17
  121. package/nitrogen/generated/android/NitroMetamaskOnLoad.hpp +14 -5
  122. package/nitrogen/generated/android/c++/JConnectResult.hpp +2 -2
  123. package/nitrogen/generated/android/c++/JConnectSignResult.hpp +2 -2
  124. package/nitrogen/generated/android/c++/JHybridNitroMetamaskSpec.cpp +26 -25
  125. package/nitrogen/generated/android/c++/JHybridNitroMetamaskSpec.hpp +20 -22
  126. package/nitrogen/generated/android/c++/JVariant_NullType_Long.cpp +1 -1
  127. package/nitrogen/generated/android/c++/JVariant_NullType_Long.hpp +4 -4
  128. package/nitrogen/generated/android/c++/JVariant_NullType_String.cpp +1 -1
  129. package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +4 -4
  130. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/ConnectResult.kt +16 -1
  131. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/ConnectSignResult.kt +18 -1
  132. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/HybridNitroMetamaskSpec.kt +16 -19
  133. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/NitroMetamaskOnLoad.kt +1 -1
  134. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/Variant_NullType_Long.kt +15 -12
  135. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/Variant_NullType_String.kt +15 -12
  136. package/nitrogen/generated/ios/NitroMetamask+autolinking.rb +3 -1
  137. package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.cpp +1 -1
  138. package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.hpp +2 -2
  139. package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Umbrella.hpp +1 -1
  140. package/nitrogen/generated/ios/NitroMetamaskAutolinking.mm +1 -1
  141. package/nitrogen/generated/ios/NitroMetamaskAutolinking.swift +9 -8
  142. package/nitrogen/generated/ios/c++/HybridNitroMetamaskSpecSwift.cpp +1 -1
  143. package/nitrogen/generated/ios/c++/HybridNitroMetamaskSpecSwift.hpp +7 -1
  144. package/nitrogen/generated/ios/swift/ConnectResult.swift +1 -2
  145. package/nitrogen/generated/ios/swift/ConnectSignResult.swift +1 -2
  146. package/nitrogen/generated/ios/swift/Func_void_ConnectResult.swift +1 -2
  147. package/nitrogen/generated/ios/swift/Func_void_ConnectSignResult.swift +1 -2
  148. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -2
  149. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +1 -2
  150. package/nitrogen/generated/ios/swift/Func_void_std__variant_nitro__NullType__int64_t_.swift +1 -2
  151. package/nitrogen/generated/ios/swift/Func_void_std__variant_nitro__NullType__std__string_.swift +1 -2
  152. package/nitrogen/generated/ios/swift/HybridNitroMetamaskSpec.swift +3 -4
  153. package/nitrogen/generated/ios/swift/HybridNitroMetamaskSpec_cxx.swift +9 -2
  154. package/nitrogen/generated/ios/swift/Variant_NullType_Int64.swift +14 -2
  155. package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +13 -1
  156. package/nitrogen/generated/shared/c++/ConnectResult.hpp +1 -1
  157. package/nitrogen/generated/shared/c++/ConnectSignResult.hpp +1 -1
  158. package/nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.cpp +1 -1
  159. package/nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.hpp +1 -1
  160. package/package.json +18 -13
  161. package/rust/ecies-jni/Cargo.lock +50 -86
  162. package/rust/ecies-jni/Cargo.toml +1 -1
  163. package/rust/ecies-jni/src/lib.rs +164 -100
  164. package/src/__tests__/parseNitroError.test.ts +35 -0
  165. package/src/index.ts +53 -5
  166. package/src/specs/nitro-metamask.nitro.ts +34 -6
  167. package/scripts/verify-16k-page-alignment.py +0 -117
  168. package/scripts/verify-16k-page-alignment.sh +0 -5
package/src/index.ts CHANGED
@@ -1,17 +1,65 @@
1
1
  import { NitroModules } from 'react-native-nitro-modules'
2
- import type { NitroMetamask as NitroMetamaskSpec, ConnectResult } from './specs/nitro-metamask.nitro'
2
+ import type {
3
+ NitroMetamask as NitroMetamaskSpec,
4
+ ConnectResult,
5
+ ConnectSignResult,
6
+ } from './specs/nitro-metamask.nitro'
3
7
 
4
8
  /**
5
9
  * NitroMetamask - MetaMask connector for React Native
6
- *
10
+ *
11
+ * Provides native MetaMask wallet integration via Nitro modules.
12
+ *
7
13
  * @example
8
14
  * ```ts
9
15
  * import { NitroMetamask } from '@novastera-oss/nitro-metamask'
10
- *
11
- * const result = await NitroMetamask.connect()
16
+ *
17
+ * // Optional: configure before use
18
+ * NitroMetamask.configure('https://yourdomain.com', 'yourscheme')
19
+ *
20
+ * // Connect wallet
21
+ * const { address, chainId } = await NitroMetamask.connect()
22
+ *
23
+ * // Sign a message
12
24
  * const signature = await NitroMetamask.signMessage('Hello')
25
+ *
26
+ * // Connect and sign in one step (SIWE)
27
+ * const result = await NitroMetamask.connectSign('my-nonce', BigInt(Date.now()))
13
28
  * ```
14
29
  */
15
30
  export const NitroMetamask = NitroModules.createHybridObject<NitroMetamaskSpec>('NitroMetamask')
16
31
 
17
- export type { ConnectResult, NitroMetamaskSpec }
32
+ export type { ConnectResult, ConnectSignResult, NitroMetamaskSpec }
33
+
34
+ /**
35
+ * Parses a structured Nitro error message that contains a numeric error code prefix.
36
+ *
37
+ * Nitro errors from the native layer are formatted as `"[<code>] <message>"`.
38
+ * This utility extracts the code and message so the JS layer can handle them
39
+ * programmatically (e.g., detecting `code: 2` for MetaMask not installed).
40
+ *
41
+ * @param e - The error to parse. Can be an `Error`, a string, or any value.
42
+ * @returns An object `{ code: number; message: string }` if the error message
43
+ * matches the `[code] message` pattern, or `null` if it does not.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * import { parseNitroError } from '@novastera-oss/nitro-metamask'
48
+ *
49
+ * try {
50
+ * await NitroMetamask.connect()
51
+ * } catch (e) {
52
+ * const parsed = parseNitroError(e)
53
+ * if (parsed?.code === 2) {
54
+ * // MetaMask is not installed — redirect user to App Store / Play Store
55
+ * }
56
+ * }
57
+ * ```
58
+ */
59
+ export function parseNitroError(e: unknown): { code: number; message: string } | null {
60
+ const raw = e instanceof Error ? e.message : typeof e === 'string' ? e : null
61
+ if (raw === null) return null
62
+ const match = raw.match(/^\[(\d+)\]\s*(.*)/)
63
+ if (!match) return null
64
+ return { code: Number(match[1]), message: match[2] ?? '' }
65
+ }
@@ -1,14 +1,14 @@
1
- import { type HybridObject } from 'react-native-nitro-modules'
1
+ import { type HybridObject, type Int64 } from 'react-native-nitro-modules'
2
2
 
3
3
  export interface ConnectResult {
4
4
  address: string
5
- chainId: bigint
5
+ chainId: Int64
6
6
  }
7
7
 
8
8
  export interface ConnectSignResult {
9
9
  signature: string
10
10
  address: string
11
- chainId: bigint
11
+ chainId: Int64
12
12
  }
13
13
 
14
14
  export interface NitroMetamask extends HybridObject<{ ios: 'swift', android: 'kotlin' }> {
@@ -23,17 +23,45 @@ export interface NitroMetamask extends HybridObject<{ ios: 'swift', android: 'ko
23
23
  * This is used to return to your app after MetaMask operations.
24
24
  */
25
25
  configure(dappUrl?: string, deepLinkScheme?: string): void
26
+ /**
27
+ * Connect to the user's MetaMask wallet.
28
+ *
29
+ * Opens the MetaMask app via deep link to request wallet connection.
30
+ * If MetaMask is not installed, the promise rejects with `code: 2`.
31
+ *
32
+ * @returns Promise resolving to a `ConnectResult` containing the wallet
33
+ * `address` and `chainId`.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * const { address, chainId } = await NitroMetamask.connect()
38
+ * ```
39
+ */
26
40
  connect(): Promise<ConnectResult>
41
+ /**
42
+ * Request a `personal_sign` signature from the connected wallet.
43
+ *
44
+ * Must be called after a successful `connect()`. Opens MetaMask to prompt
45
+ * the user to sign the provided message.
46
+ *
47
+ * @param message - The plain-text message to sign.
48
+ * @returns Promise resolving to the hex-encoded signature string.
49
+ *
50
+ * @example
51
+ * ```ts
52
+ * const signature = await NitroMetamask.signMessage('Sign in to MyApp')
53
+ * ```
54
+ */
27
55
  signMessage(message: string): Promise<string>
28
56
  /**
29
57
  * Connect to MetaMask (if not already connected) and sign a message containing nonce and expiration.
30
58
  * Returns the signature along with the address and chainId that were used to sign.
31
59
  *
32
60
  * @param nonce - A unique nonce for this signing request
33
- * @param exp - Expiration timestamp (as bigint)
61
+ * @param exp - Expiration timestamp (as Int64)
34
62
  * @returns Promise resolving to ConnectSignResult containing signature, address, and chainId
35
63
  */
36
- connectSign(nonce: string, exp: bigint): Promise<ConnectSignResult>
64
+ connectSign(nonce: string, exp: Int64): Promise<ConnectSignResult>
37
65
  /**
38
66
  * Get the currently connected wallet address.
39
67
  * Returns null if not connected.
@@ -43,5 +71,5 @@ export interface NitroMetamask extends HybridObject<{ ios: 'swift', android: 'ko
43
71
  * Get the current chain ID.
44
72
  * Returns null if not connected.
45
73
  */
46
- getChainId(): Promise<bigint | null>
74
+ getChainId(): Promise<Int64 | null>
47
75
  }
@@ -1,117 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Verify 16 KB ELF program-header alignment for Google Play (PT_LOAD p_align).
4
-
5
- Uses NDK llvm-readobj (reliable). readelf(1) column positions vary by version;
6
- do not parse readelf -l by $NF.
7
- """
8
- from __future__ import annotations
9
-
10
- import os
11
- import re
12
- import shutil
13
- import subprocess
14
- import sys
15
-
16
- MIN_ALIGN = 16 * 1024
17
-
18
-
19
- def find_llvm_readobj() -> str | None:
20
- env = os.environ.get("ANDROID_NDK_HOME") or os.environ.get("ANDROID_NDK_ROOT")
21
- if env:
22
- prebuilt = os.path.join(env, "toolchains", "llvm", "prebuilt")
23
- if os.path.isdir(prebuilt):
24
- for host in (
25
- "linux-x86_64",
26
- "darwin-x86_64",
27
- "darwin-arm64",
28
- "windows-x86_64",
29
- ):
30
- cand = os.path.join(prebuilt, host, "bin", "llvm-readobj")
31
- if os.path.isfile(cand):
32
- return cand
33
- sdk = os.environ.get("ANDROID_SDK_ROOT") or os.environ.get("ANDROID_HOME")
34
- if sdk:
35
- for ver in ("28.2.13676358",):
36
- for host in ("linux-x86_64", "windows-x86_64", "darwin-x86_64"):
37
- cand = os.path.join(
38
- sdk, "ndk", ver, "toolchains", "llvm", "prebuilt", host, "bin", "llvm-readobj"
39
- )
40
- if os.path.isfile(cand):
41
- return cand
42
- return shutil.which("llvm-readobj")
43
-
44
-
45
- def verify_so(llvm_readobj: str, path: str) -> bool:
46
- try:
47
- out = subprocess.check_output(
48
- [llvm_readobj, "--program-headers", path],
49
- text=True,
50
- stderr=subprocess.DEVNULL,
51
- )
52
- except (subprocess.CalledProcessError, FileNotFoundError) as e:
53
- print(f"ERROR: llvm-readobj failed for {path}: {e}", file=sys.stderr)
54
- return False
55
-
56
- saw_nonzero = False
57
- # Each "ProgramHeader {" block: match PT_LOAD and its Alignment (not readelf columns).
58
- for block in out.split("ProgramHeader {")[1:]:
59
- if "Type: PT_LOAD" not in block:
60
- continue
61
- m = re.search(r"Alignment:\s*(\d+)", block)
62
- if not m:
63
- continue
64
- a = int(m.group(1))
65
- if a == 0:
66
- # p_align 0 = default; other LOADs carry explicit alignment on 16K builds
67
- continue
68
- saw_nonzero = True
69
- if a < MIN_ALIGN:
70
- print(
71
- f"FAIL {path}: PT_LOAD Alignment {a} < {MIN_ALIGN}",
72
- file=sys.stderr,
73
- )
74
- return False
75
-
76
- if not saw_nonzero:
77
- print(
78
- f"FAIL {path}: no PT_LOAD with non-zero Alignment (unexpected for .so)",
79
- file=sys.stderr,
80
- )
81
- return False
82
- return True
83
-
84
-
85
- def main() -> int:
86
- if len(sys.argv) < 2:
87
- print("Usage: verify-16k-page-alignment.py <shared-object> [...]", file=sys.stderr)
88
- return 2
89
-
90
- lr = find_llvm_readobj()
91
- if not lr:
92
- print(
93
- "ERROR: llvm-readobj not found. Set ANDROID_NDK_HOME or install Android NDK.",
94
- file=sys.stderr,
95
- )
96
- return 2
97
-
98
- ok = True
99
- for path in sys.argv[1:]:
100
- if not os.path.isfile(path):
101
- print(f"ERROR: not a file: {path}", file=sys.stderr)
102
- return 1
103
- print(f"Checking: {path}")
104
- if not verify_so(lr, path):
105
- ok = False
106
- else:
107
- print(f" OK (llvm-readobj PT_LOAD Alignment >= {MIN_ALIGN} where specified)")
108
-
109
- if not ok:
110
- print("verify-16k-page-alignment: FAILED", file=sys.stderr)
111
- return 1
112
- print("verify-16k-page-alignment: all checks passed")
113
- return 0
114
-
115
-
116
- if __name__ == "__main__":
117
- sys.exit(main())
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Thin wrapper; real check is scripts/verify-16k-page-alignment.py (llvm-readobj).
3
- set -euo pipefail
4
- ROOT="$(cd "$(dirname "$0")/.." && pwd)"
5
- exec python3 "$ROOT/scripts/verify-16k-page-alignment.py" "$@"