Skip to content

Commit

Permalink
feat: aPPDevTool 自动检测、下载 Android Sdk 缺少工具
Browse files Browse the repository at this point in the history
APPDevTool 自动检测、下载 Android Sdk 缺少工具
  • Loading branch information
hewx815 committed Nov 3, 2023
1 parent 1e464ad commit fc4ee23
Show file tree
Hide file tree
Showing 13 changed files with 196 additions and 127 deletions.
4 changes: 2 additions & 2 deletions APPDevTool.config.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"resourceDir": "./for-vue2/dist/dev/app-plus",
"android": {
"AndroidSdkPath": "C:\\Users\\admin\\AppData\\Local\\Android\\Sdk",
"JavaPath": "C:\\Program Files\\Eclipse Adoptium\\jdk-8.0.382.5-hotspot"
"androidSdkPath": "C:\\Users\\admin\\AppData\\Local\\Android\\Sdk",
"javaPath": "C:\\Program Files\\Eclipse Adoptium\\jdk-8.0.382.5-hotspot"
// "AndroidSdkPath": "/Users/hewx/Library/Android/sdk",
// "JavaPath": "/Users/hewx/Library/Java/JavaVirtualMachines/corretto-1.8.0_382/Contents/Home"
}
Expand Down
3 changes: 2 additions & 1 deletion for-vue2/src/packages/plugins/APPDevTool/.eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"rules": {
"import/extensions": "off",
"node/no-extraneous-import": "off",
"prefer-promise-reject-errors": "off"
"prefer-promise-reject-errors": "off",
"@typescript-eslint/no-misused-promises": "off"
}
}
8 changes: 0 additions & 8 deletions for-vue2/src/packages/plugins/APPDevTool/TODO
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,5 @@
- **`HACK`: 临时性的解决方案或修补。**
- **`XXX`: 需要特别注意或需要进一步检查的地方(优化点)。**

## BUG androidSdkPath 效验

## BUG 自动下载 Build Tools

## BUG 自动下载 Android Platform SDK

## BUG 自动下载 java

## BUG 安装后 `gradle-wrapper.jar` 文件失效

Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import { spawn } from 'child_process';

const COMMAND = process.platform === 'win32' ? 'gradlew.bat' : './gradlew';
import { COMMAND_GRADLEW } from './constant.js';

export default function buildAPK(
projectPath: string,
): Promise<number | null> {
return new Promise((resolve, reject) => {
const gradlewPs = spawn(COMMAND, ['assembleDebug'], { cwd: projectPath, shell: true, stdio: 'inherit' });
const gradlewPs = spawn(COMMAND_GRADLEW, ['assembleDebug'], { cwd: projectPath, shell: true, stdio: 'inherit' });

gradlewPs.on('error', (err) => {
reject(err);
Expand Down
127 changes: 85 additions & 42 deletions for-vue2/src/packages/plugins/APPDevTool/androidServer/checkoutDep.ts
Original file line number Diff line number Diff line change
@@ -1,64 +1,107 @@
import { spawn } from 'child_process';
import { spawnSync } from 'child_process';
import path from 'path';
import { err } from '../utils.js';
import { readdir } from 'fs/promises';
import inquirer from 'inquirer8';
import { err, log } from '../utils.js';
import {
JAVA_V, COMPILE_SDK_V, BUIILD_TOOLS_V, COMMAND_SDKMANAGER,
} from './constant.js';

export default async function checkoutDep() {
function getJavaVersion(): Promise<string> {
return new Promise((resolve, reject) => {
const ps = spawn('./java.exe', ['-version'], { cwd: path.resolve(process.env.JAVA_HOME as string, './bin') });
function checkoutJavaVersion() {
const { stderr: stdout, error } = spawnSync(
'./java',
['-version'],
{
cwd: path.resolve(process.env.JAVA_HOME as string, './bin'),
encoding: 'utf-8',
},
);

ps.on('error', (e) => {
reject(e);
});
if (error) {
err(`获取 java 版本出错:${process.env.JAVA_HOME}`, error, 'android');
}

let oneTimes = true;
const str = stdout.split('\r\n')[0];

ps.stderr.on('data', (data) => {
if (oneTimes) {
oneTimes = false;
if (str.indexOf('openjdk version') !== 0 && str.indexOf('java version') !== 0) {
err(`获取 java 版本出错,未知字符串:${str}`, null, 'android');
}

const data1 = String(data).split('\r\n')[0];
const version = str.split(' ')[2].replace(/"/g, '').split('.');

if (data1.indexOf('openjdk version') !== 0 && data1.indexOf('java version') !== 0) {
reject(new Error());
} else {
const version = data1.split(' ')[2].replace(/"/g, '').split('.');
let versionStr = '';

let versionStr = '';
if (Number(version[0]) > 10) {
versionStr = `JavaVersion.VERSION_${version[0]}`;
}

if (Number(version[0]) > 10) {
versionStr = `VERSION_${version[0]}`;
}
if (Number(version[0]) > 25) {
versionStr = 'JavaVersion.VERSION_HIGHER';
}

if (Number(version[0]) > 25) {
versionStr = 'VERSION_HIGHER';
}
versionStr = `JavaVersion.VERSION_${version[0]}_${version[1]}`;

versionStr = `VERSION_${version[0]}_${version[1]}`;
if (versionStr !== JAVA_V) {
err(`java 版本不兼容
resolve(versionStr);
}
}
});
});
要求版本:${JAVA_V}
当前版本:${versionStr}
使用的java目录:${process.env.JAVA_HOME}
`, null, 'android');
}
}

function checkoutBuildTool() {
async function main() {
const toolsPath = path.resolve(process.env.ANDROID_SDK_ROOT as string, './tools/bin');
const buildToolsPath = path.resolve(process.env.ANDROID_SDK_ROOT as string, './build-tools');
const platformsPath = path.resolve(process.env.ANDROID_SDK_ROOT as string, './platforms');

const buildToolsVersions = await readdir(buildToolsPath);
const platformsVersions = await readdir(platformsPath);

const installList = [];
if (!buildToolsVersions.includes(BUIILD_TOOLS_V)) {
installList.push(`"build-tools;${BUIILD_TOOLS_V}"`);
}

if (!platformsVersions.includes(`android-${COMPILE_SDK_V}`)) {
installList.push(`"platforms;android-${COMPILE_SDK_V}"`);
}

if (installList.length !== 0) {
// eslint-disable-next-line no-console
console.clear();
log(`检查到本机 Android Sdk 缺少下方工具:
${installList.join('\n ')}`, 'android');

const res: { confirm: boolean; } = await inquirer.prompt({
type: 'confirm',
name: 'confirm',
message: '是否自动安装?',
});

if (res.confirm) {
const { error } = spawnSync(COMMAND_SDKMANAGER, [...installList], {
cwd: toolsPath, shell: true, stdio: 'inherit', encoding: 'utf-8',
});

if (error) {
err(`安装 android Sdk 构建工具 出错:${process.env.ANDROID_SDK_ROOT}`, error, 'android');
} else {
log(`检查到本机 Android Sdk 缺少下方工具:
${String(installList)}
`, 'android');
}
}
}
}

let javaVersion = '';
checkoutJavaVersion();
try {
javaVersion = await getJavaVersion();
await main();
} catch (e) {
err('获取 java 版本出错', e, 'android');
err(`效验 android Sdk 构建工具 出错:${process.env.ANDROID_SDK_ROOT}`, e, 'android');
}

return {
javaVersion,
};
// console.log(javaVersion);
// checkoutBuildTool();
}

// checkoutDep('C:\\Program Files\\Eclipse Adoptium\\jdk-8.0.382.5-hotspot');
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import {
} from '../utils.js';
import { listenKeyPress, clearAllListenKeyPress } from '../common/keyPress.js';
import type { KeypressCallBack } from '../common/keyPress.js';
import {
COMMAND_ADB, LF, CHOICE_DEVICE_HELP_TEXT, DEVICE_TYPES,
} from './constant.js';

export type DeviceOptions = {
deviceName: string;
Expand All @@ -14,25 +17,6 @@ export type DeviceOptions = {
};

export default async function choiceDevice(abdPath: string) {
const ADB_COMMAND = process.platform === 'win32' ? 'adb' : './adb';

const LF = process.platform === 'win32' ? '\r\n' : '\n';

const DEVICE_TYPES = [
{
name: '模拟器设备',
str: 'product',
type: 'emulator',
},
{
name: 'USB设备',
str: 'product',
type: 'usb',
},
];

const HELP_TEXT = '使用 R 键刷新';

let devicesGetting: boolean = false;

let device = {} as DeviceOptions;
Expand All @@ -42,7 +26,7 @@ export default async function choiceDevice(abdPath: string) {
return new Promise((resolve, reject) => {
devicesGetting = true;

const adbPs = spawn(ADB_COMMAND, ['devices', '-l'], { cwd: abdPath });
const adbPs = spawn(COMMAND_ADB, ['devices', '-l'], { cwd: abdPath });

adbPs.on('error', (error) => {
reject(error);
Expand Down Expand Up @@ -156,11 +140,11 @@ ${deviceInfoList.splice(2, deviceInfoList.length - 2).join(' ')}`;
// eslint-disable-next-line no-console
console.clear();
if (devices.length === 0) {
log(`${HELP_TEXT}
log(`${CHOICE_DEVICE_HELP_TEXT}
未搜索到任何设备`);
} else {
log(`${HELP_TEXT}
log(`${CHOICE_DEVICE_HELP_TEXT}
搜索设备成功, 共搜索到 ${devices.length} 个设备`);

Expand Down
64 changes: 64 additions & 0 deletions for-vue2/src/packages/plugins/APPDevTool/androidServer/constant.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
export const JAVA_V: string = 'JavaVersion.VERSION_1_8';

export const COMPILE_SDK_V: number = 30;

export const BUIILD_TOOLS_V: string = '30.0.3';

export const DEFAULT_APP_ID: string = '__UNI__CA5CB1E';

export const DEFAULT_APP_KEY: string = '537cba7f932e287fd25900de910bc831';

export const DEFAULT_VERSION_CODE: number = 1;

export const DEFAULT_VERSION_NAME: string = '1.0';

export const DEFAULT_APPLICATION_ID: string = 'com.android.testa';

export const COMMAND_SDKMANAGER: string = process.platform === 'win32' ? 'sdkmanager.bat' : './sdkmanager';

export const COMMAND_GRADLEW: string = process.platform === 'win32' ? 'gradlew.bat' : './gradlew';

export const COMMAND_ADB: string = process.platform === 'win32' ? 'adb' : './adb';

export const LF: string = process.platform === 'win32' ? '\r\n' : '\n';

export const CHOICE_DEVICE_HELP_TEXT: string = '使用 R 键刷新';

export const LISTEN_SERVER_HELP_TEXT: string = `
- 修改文件自动刷新
- 按下 R 键手动刷新
`;
export const LISTEN_SERVER_DELAY: number = 200;

export const COMMON_TEST_SIGNING: {
keyAlias: string;
keyPassword: string;
storeFile: string;
storePassword: string;
} = {
keyAlias: 'android',
keyPassword: '123456',
storeFile: 'default.keystore',
storePassword: '123456',
};

export const UNI_SDK_NAME_LIST: Array<string> = [
'uniapp-v8-release.aar',
'oaid_sdk_1.0.25.aar',
'lib.5plus.base-release.aar',
'breakpad-build-release.aar',
'android-gif-drawable-release@1.2.23.aar',
];

export const DEVICE_TYPES: Array<{ name: string, str: string, type: string; }> = [
{
name: '模拟器设备',
str: 'product',
type: 'emulator',
},
{
name: 'USB设备',
str: 'product',
type: 'usb',
},
];

0 comments on commit fc4ee23

Please sign in to comment.