feat: build apk from project(dir) support

This commit is contained in:
hyb1996
2018-01-24 17:29:25 +08:00
parent 316415343f
commit c93c27fcaa
22 changed files with 365 additions and 34 deletions

View File

@@ -1,15 +1,14 @@
package com.stardust.scriptdroid.autojs.build;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import com.stardust.autojs.apkbuilder.ApkBuilder;
import com.stardust.autojs.apkbuilder.ManifestEditor;
import com.stardust.autojs.apkbuilder.util.StreamUtils;
import com.stardust.autojs.project.ProjectConfig;
import com.stardust.pio.PFiles;
import com.stardust.scriptdroid.App;
import org.androidannotations.annotations.Click;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@@ -105,10 +104,28 @@ public class AutoJsApkBuilder extends ApkBuilder {
}
public AutoJsApkBuilder setScriptFile(String path) throws IOException {
replaceFile("assets/script.js", path);
if (PFiles.isDir(path)) {
copyDir("assets/project/", path);
} else {
replaceFile("assets/project/main.js", path);
}
return this;
}
public void copyDir(String relativePath, String path) throws IOException {
File fromDir = new File(path);
File toDir = new File(this.mWorkspacePath, relativePath);
toDir.mkdir();
for (File child : fromDir.listFiles()) {
if (child.isFile()) {
StreamUtils.write(new FileInputStream(child),
new FileOutputStream(new File(toDir, child.getName())));
} else {
copyDir(PFiles.join(relativePath, child.getName() + "/"), child.getPath());
}
}
}
@Override
public ApkBuilder replaceFile(String relativePath, String newFilePath) throws IOException {
StreamUtils.write(new FileInputStream(newFilePath), new FileOutputStream(new File(this.mWorkspacePath, relativePath)));
@@ -123,10 +140,42 @@ public class AutoJsApkBuilder extends ApkBuilder {
.setVersionCode(config.versionCode)
.setPackageName(config.packageName);
setArscPackageName(config.packageName);
updateProjectConfig(config);
setScriptFile(config.jsPath);
return this;
}
private void updateProjectConfig(AppConfig config) {
if (!PFiles.isDir(config.jsPath)) {
return;
}
ProjectConfig projectConfig = ProjectConfig.fromProjectDir(config.jsPath);
if (projectConfig == null)
projectConfig = new ProjectConfig();
projectConfig.setName(config.appName)
.setPackageName(config.packageName)
.setVersionCode(config.versionCode)
.setVersionName(config.versionName)
.setMainScriptFile("main.js");
updateProjectConfigAssets(projectConfig, config.jsPath, config.jsPath);
PFiles.write(ProjectConfig.configFileOfDir(config.jsPath), projectConfig.toJson());
}
private void updateProjectConfigAssets(ProjectConfig config, String projectDir, String dir) {
File main = new File(projectDir, config.getMainScriptFile());
for (File file : new File(dir).listFiles()) {
if (file.isDirectory()) {
updateProjectConfigAssets(config, projectDir, file.getPath());
continue;
}
if (file.equals(main)) {
continue;
}
String relative = new File(projectDir).toURI().relativize(file.toURI()).getPath();
config.getAssets().add(relative);
}
}
@Override
public AutoJsApkBuilder build() throws IOException {
if (mProgressCallback != null) {

View File

@@ -4,6 +4,7 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.support.design.widget.TextInputEditText;
import android.support.design.widget.TextInputLayout;
import android.text.TextUtils;
@@ -13,6 +14,7 @@ import android.widget.ImageView;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.stardust.autojs.project.ProjectConfig;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.build.AutoJsApkBuilder;
import com.stardust.scriptdroid.build.ApkBuilderPluginHelper;
@@ -102,7 +104,6 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
}
private void setupWithSourceFile(ScriptFile file) {
mSourcePath.setText(file.getPath());
String dir = file.getParent();
if (dir.startsWith(getFilesDir().getPath())) {
dir = StorageFileProvider.DEFAULT_DIRECTORY_PATH;
@@ -110,6 +111,7 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
mOutputPath.setText(dir);
mAppName.setText(file.getSimplifiedName());
mPackageName.setText(getString(R.string.format_default_package_name, System.currentTimeMillis()));
setSource(file);
}
@Override
@@ -123,12 +125,25 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
String initialDir = new File(mSourcePath.getText().toString()).getParent();
new FileChooserDialogBuilder(this)
.title(R.string.text_source_file_path)
.dir(initialDir == null ? StorageFileProvider.DEFAULT_DIRECTORY_PATH : initialDir)
.justScriptFile()
.singleChoice(file -> mSourcePath.setText(file.getPath()))
.dir(Environment.getExternalStorageDirectory().getPath(),
initialDir == null ? StorageFileProvider.DEFAULT_DIRECTORY_PATH : initialDir)
.singleChoice(this::setSource)
.show();
}
private void setSource(File file) {
mSourcePath.setText(file.getPath());
if (!file.isDirectory())
return;
ProjectConfig config = ProjectConfig.fromProjectDir(file.getPath());
if (config == null)
return;
mAppName.setText(config.getName());
mPackageName.setText(config.getPackageName());
mVersionCode.setText(String.valueOf(config.getVersionCode()));
mVersionName.setText(config.getVersionName());
}
@Click(R.id.select_output)
void selectOutputDirPath() {
@@ -221,6 +236,7 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
mProgressDialog = new MaterialDialog.Builder(this)
.progress(true, 100)
.content(R.string.text_on_progress)
.cancelable(false)
.show();
}

View File

@@ -22,6 +22,8 @@ import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.model.script.ScriptFile;
import com.stardust.scriptdroid.model.script.Scripts;
import com.stardust.scriptdroid.storage.file.StorageFileProvider;
import com.stardust.scriptdroid.ui.build.BuildActivity;
import com.stardust.scriptdroid.ui.build.BuildActivity_;
import com.stardust.scriptdroid.ui.common.ScriptLoopDialog;
import com.stardust.scriptdroid.ui.common.ScriptOperations;
import com.stardust.scriptdroid.ui.viewmodel.ScriptList;
@@ -246,6 +248,12 @@ public class ScriptListView extends ThemeColorSwipeRefreshLayout implements Swip
.timedTask(mSelectedScriptFile);
notifyOperated();
break;
case R.id.action_build_apk:
BuildActivity_.intent(getContext())
.extra(BuildActivity.EXTRA_SOURCE_FILE, mSelectedScriptFile.getPath())
.start();
notifyOperated();
break;
case R.id.action_sort_by_date:
sort(ScriptList.SORT_TYPE_DATE, mDirSortMenuShowing);
break;

View File

@@ -8,4 +8,8 @@
android:id="@+id/delete"
android:title="@string/text_delete"/>
<item
android:id="@+id/action_build_apk"
android:title="@string/text_build_apk"/>
</menu>

View File

@@ -33,6 +33,10 @@
<item
android:id="@+id/open_by_other_apps"
android:title="@string/text_open_by_other_apps"/>
<item
android:id="@+id/action_build_apk"
android:title="@string/text_build_apk"/>
</menu>
</item>

View File

@@ -252,7 +252,7 @@
<string name="apk_builder_build">构建中</string>
<string name="apk_builder_package">打包中</string>
<string name="apk_builder_clean">清理临时文件</string>
<string name="text_source_file_path">脚本文件路径</string>
<string name="text_source_file_path">脚本文件(夹)路径</string>
<string name="text_search">搜索</string>
<string name="text_select_icon">选择图标</string>
<string name="text_use_android_n_shortcut">添加到安卓7.0 Shortcut</string>