From a9ac419b3564590e5fccba048988e287490bc79c Mon Sep 17 00:00:00 2001 From: lzw <lzw@github.aaej.cn> Date: 星期一, 19 二月 2024 13:50:06 +0800 Subject: [PATCH] 1.修改成无界面的apk 2.修改成服务 --- build.gradle | 2 app/src/main/AndroidManifest.xml | 22 -- UStorageTest/build.gradle | 1 app/build.gradle | 7 app/src/main/aidl/com/fwupgrade/saymanss/IFwAidlInterface.aidl | 9 + app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java | 377 +++++++++++++++++++++++++++++++++++++++++++++++ gradle.properties | 5 7 files changed, 395 insertions(+), 28 deletions(-) diff --git a/UStorageTest/build.gradle b/UStorageTest/build.gradle index 829267a..4742da4 100644 --- a/UStorageTest/build.gradle +++ b/UStorageTest/build.gradle @@ -2,7 +2,6 @@ android { compileSdkVersion 27 - buildToolsVersion "27.0.3" defaultConfig { minSdkVersion 15 diff --git a/app/build.gradle b/app/build.gradle index a562033..48ad18c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,16 +2,17 @@ android { compileSdkVersion 27 -// buildToolsVersion "27.0.3" defaultConfig { applicationId "com.fwupgrade.saymanss" - minSdkVersion 15 + minSdkVersion 21 targetSdkVersion 27 versionCode 6 versionName "1.6" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } - + buildFeatures{ + aidl true + } signingConfigs { release { storeFile file("../key/key.jks") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 70b4af1..5c0b4a2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,28 +14,8 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> - <activity android:name=".HomePageActivity" - android:theme="@style/Theme.AppCompat.Light.NoActionBar" - android:configChanges="keyboard|keyboardHidden|navigation|orientation|screenSize" - android:launchMode="singleTask" - android:screenOrientation="portrait" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - <intent-filter> - <action android:name="android.intent.action.MAIN" /> - <category android:name="android.intent.category.LAUNCHER" /> - </intent-filter> - -<!-- <intent-filter>--> -<!-- <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>--> -<!-- <action android:name="android.hardware.usb.action.ACTION_USB_DEVICE_DETACHED"/>--> -<!-- <action android:name="android.hardware.usb.action.USB_STATE"/>--> -<!-- </intent-filter>--> - -<!-- <meta-data--> -<!-- android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"--> -<!-- android:resource="@xml/device_filter"/>--> - </activity> + <service android:name=".FwUpgradeService" android:exported="true"/> </application> </manifest> \ No newline at end of file diff --git a/app/src/main/aidl/com/fwupgrade/saymanss/IFwAidlInterface.aidl b/app/src/main/aidl/com/fwupgrade/saymanss/IFwAidlInterface.aidl new file mode 100644 index 0000000..d2dcbe8 --- /dev/null +++ b/app/src/main/aidl/com/fwupgrade/saymanss/IFwAidlInterface.aidl @@ -0,0 +1,9 @@ +// IFwAidlInterface.aidl +package com.fwupgrade.saymanss; + +// Declare any non-default types here with import statements + +interface IFwAidlInterface { + + void upgradeFw(String path,String device); +} \ No newline at end of file diff --git a/app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java b/app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java new file mode 100644 index 0000000..aa7ac8b --- /dev/null +++ b/app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java @@ -0,0 +1,377 @@ +package com.fwupgrade.saymanss; + +import android.app.Service; +import android.content.Intent; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbManager; +import android.os.Build; +import android.os.Handler; +import android.os.IBinder; +import android.os.Message; +import android.os.RemoteException; +import android.os.SystemClock; +import android.support.annotation.Nullable; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.Toast; + +import com.fwupgrade.saymanss.adapter.FwFileListAdapter; +import com.fwupgrade.saymanss.deviceplug.IUsbDevicePlugDelegate; +import com.fwupgrade.saymanss.deviceplug.UstorageDeviceInstance; +import com.fwupgrade.saymanss.utils.AppPathInfo; +import com.fwupgrade.saymanss.utils.UtilTools; +import com.fwupgrade.saymanss.view.GeneralDialog; +import com.jni.UStorageTestModule; +import com.spca.usb.CUSBListener; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * @ProjectName: FwUpgrade + * @Package: com.fwupgrade.saymanss + * @ClassName: FwUpgradeService + * @Description: java绫讳綔鐢ㄦ弿杩� + * @Author: zhanwei.li + * @CreateDate: 2024/2/19 10:02 + * @UpdateUser: 鏇存柊鑰� + * @UpdateDate: 2024/2/19 10:02 + * @UpdateRemark: 鏇存柊璇存槑 + * @Version: 1.0 + */ +public class FwUpgradeService extends Service implements IUsbDevicePlugDelegate { + + /** usb鎻掑叆. */ + private static final int USB_DEVICE_INSERT = 0; + /** usb鏉冮檺. */ + private static final int USB_DEVICE_PERRMISSION = 1; + /** usb鎷斿嚭. */ + private static final int USB_DEVICE_DETACHED = 2; + /** usb鎵撳紑. */ + private static final int USB_DEVICE_OPEN = 3; + /** 鍗囩骇缁撴潫. */ + private static final int USB_DEVICE_UPGRADE = 4; + /** 鏄剧ず */ + private static final int USB_DEVICE_MESSAGE = 5; + + private static final int UPGRADE_PRESET = 0; + + private static final int UPGRADE_FAIL = 3; + private static final int UPGRADE_SUCCESS = 4; + + private CameraInfo mCamInfo = null; + private static final String TAG = FwUpgradeService.class.getCanonicalName(); + private IFwAidlInterface.Stub mBinder = new IFwAidlInterface.Stub() { + @Override + public void upgradeFw(String path, String device) throws RemoteException { + Log.i(TAG,"瀹㈡埛绔皟鐢ㄦ洿鏂板浐浠舵柟娉�,device="+device+"_path="+path); + + } + }; + @Nullable + @Override + public IBinder onBind(Intent intent) { + return mBinder; + } + + @Override + public void onCreate() { + super.onCreate(); + Log.i(TAG,"onCreate"); + initTarget(); + initData(); + initDeviceSDK(); + + } + + + private File[] mFileList; + + private HashMap<String, Integer> tty = new HashMap<>(); + + private final Handler mHander = new Handler() { + @Override + public void dispatchMessage(Message msg) { + switch (msg.what) { + + case USB_DEVICE_INSERT: + Toast.makeText(FwUpgradeService.this, "USB璁惧宸叉彃鍏�", Toast.LENGTH_SHORT).show(); + break; + + case USB_DEVICE_PERRMISSION: + boolean isSuccessful = (boolean) msg.obj; + + if (isSuccessful) { + Toast.makeText(FwUpgradeService.this, "USB璁惧鏉冮檺鐢宠鎴愬姛", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(FwUpgradeService.this, "USB璁惧鏉冮檺鐢宠澶辫触", Toast.LENGTH_SHORT).show(); + } + break; + + case USB_DEVICE_DETACHED: + Toast.makeText(FwUpgradeService.this, "USB璁惧宸叉嫈鍑猴紝绛夊緟璁惧鎻掑叆", Toast.LENGTH_SHORT).show(); + break; + + case USB_DEVICE_OPEN: + Log.d(TAG, "USB_DEVICE_OPEN"); + CameraInfo cameraInfo = (CameraInfo) msg.obj; + + Toast.makeText(FwUpgradeService.this, "USB璁惧鍒濆鍖栨垚鍔燂紝鍙互鍑嗗鍗囩骇", Toast.LENGTH_SHORT).show(); + acceptFwList(); + mCamInfo = cameraInfo; + + executeUpgrade(mCamInfo); + + break; + + case GeneralDialog.BUTTON_CLICK_OK: + + break; + + case USB_DEVICE_UPGRADE: + + String devName = (String) msg.obj; + int errCode = msg.arg1; + int succ_num = 0, fail_num = 0; + + Log.d("fwup","Upgrade result:" + devName + ", errCode: " + errCode); + + if (tty.containsKey(devName)) { + tty.put(devName, errCode == 0? UPGRADE_SUCCESS:UPGRADE_FAIL); + } + + for (Map.Entry<String, Integer> entry : tty.entrySet()) { + if (entry.getValue() == UPGRADE_SUCCESS) { + succ_num++; + } else if (entry.getValue() == UPGRADE_FAIL) { + fail_num++; + } + } + + if (succ_num + fail_num == tty.size()) { + Log.d(TAG, "Upgrade Finish!"); + + Intent intent = new Intent(); + intent.putExtra("result", succ_num == tty.size()? 0 : 1); + intent.setAction("com.fwupgrade.saymanss.UPGRADE_COMPLETE"); + intent.setPackage("safeluck.drive.training"); + sendBroadcast(intent); + + intent = new Intent(); + intent.putExtra("result", succ_num == tty.size()? 0 : 1); + intent.setAction("com.fwupgrade.saymanss.UPGRADE_COMPLETE"); + intent.setPackage("demo1.tech.anyun.com.myapplication"); + sendBroadcast(intent); + + +// System.exit(0); + } + break; + case USB_DEVICE_MESSAGE: + String text = (String) msg.obj; + Toast.makeText(FwUpgradeService.this, text, Toast.LENGTH_SHORT).show(); + break; + } + } + }; + // 姣忔鍗囩骇璺緞鍊兼渶灏忕殑 + private void initTarget() { + ArrayList<UsbDevice> targets = UstorageDeviceInstance.getInstance().acceptOTGDeviceInfo((UsbManager) getSystemService(USB_SERVICE)); + String min = "Z"; + + for (UsbDevice usbDevice: targets) { + if (usbDevice.getDeviceName().compareTo(min) < 0) { + min = usbDevice.getDeviceName(); + } + } + tty.put(min, UPGRADE_PRESET); + } + + /** + * 鑾峰彇fw鍒楄〃 + */ + private void acceptFwList() { + Log.d("fwup","acceptFwList: "); + File file = new File(AppPathInfo.getFwSavePath()); + File[] files = file.listFiles(); + if (files != null && files.length > 0) { + mFileList = files; + } else { + } + } + private void executeUpgrade(CameraInfo cameraInfo) { + if (mFileList != null && mFileList.length > 0) { + Log.i(TAG,"executeUpgrade"); + new Thread(new Update(cameraInfo, mFileList[0])).start(); + } + } + + + /** + * 鍒濆鍖栨暟鎹� + */ + private void initData() { + UtilTools.createFolderInSdcard(AppPathInfo.getFwSavePath()); + + } + + /** + * UstorageDeviceSDK鍒濆鍖�. + */ + private void initDeviceSDK() { + UstorageDeviceInstance.getInstance().tryAttcheDeviceHandle(FwUpgradeService.this, FwUpgradeService.this); + + + } + + @Override + public void usbDeviceInsert() { + Log.d(TAG,"usbDeviceInsert"); + } + + @Override + public void permissionFinish(boolean isSuccessful, CUSBListener.UsbControlBlock ctrlBlock) { + synchronized (this) { + Message msg = Message.obtain(); + msg.obj = isSuccessful; + msg.what = USB_DEVICE_PERRMISSION; + mHander.sendMessage(msg); + Log.d(TAG,"permissionFinish:" + isSuccessful); + if (isSuccessful && ctrlBlock != null) { + initFwUpgrade(ctrlBlock); + } + } + } + + @Override + public void usbDeviceDetached() { + Log.d(TAG,"usbDeviceDetached"); + } + + /** + * 鍒濆鍖栧崌绾х幆澧� + */ + private void initFwUpgrade(CUSBListener.UsbControlBlock ctrlBlock) { + final int vendorId = ctrlBlock.getVenderId(); + final int productId = ctrlBlock.getProductId(); + int fileDescriptor = ctrlBlock.getFileDescriptor(); + int busNum = ctrlBlock.getBusNum(); + int devNum = ctrlBlock.getDevNum(); + boolean isTarget = false; + String usbfsName = getUSBFSName(ctrlBlock); + String devName = ctrlBlock.getDeviceName(); + + String serial = ctrlBlock.getSerial(); + + Log.d(TAG,"sonixCamInit " + String.format("vendorId:%d productId:%d fileDescriptor:%d busNum:%d devNum:%d usbfsName:%s devName:%s serial:%s", vendorId, productId, fileDescriptor, busNum, devNum, usbfsName, devName, serial)); + + + if (tty.containsKey(devName) && tty.get(devName) == 0) { + isTarget = true; + tty.put(devName, 1); + } + + if (!isTarget) { + Log.d(TAG,"Not sonixCam, close"); + ctrlBlock.close(); + return; + } + + Log.d(TAG,"Is sonixCam, upgrade!"); + + Message msg = Message.obtain(); + //msg.obj = errCode == 0; + msg.obj = new CameraInfo(vendorId, productId, fileDescriptor, busNum, devNum, usbfsName, devName); + msg.what = USB_DEVICE_OPEN; + mHander.sendMessage(msg); + } + + + private final String getUSBFSName(final CUSBListener.UsbControlBlock ctrlBlock) { + String result = null; + final String name = ctrlBlock.getDeviceName(); + final String[] v = !TextUtils.isEmpty(name) ? name.split("/") : null; + if ((v != null) && (v.length > 2)) { + final StringBuilder sb = new StringBuilder(v[0]); + for (int i = 1; i < v.length - 2; i++) + sb.append("/").append(v[i]); + result = sb.toString(); + } + if (TextUtils.isEmpty(result)) { +// Log.w(TAG, "failed to get USBFS path, try to use default path:" + name); + result = "/dev/bus/usb"; + } + return result; + } + + class Update implements Runnable { + CameraInfo cam; + File file; + public Update(CameraInfo cam, File file) { + this.cam = cam; + this.file = file; + } + @Override + public void run() { + int errCode = fwUpdate(cam, file); + + Message msg = Message.obtain(); + msg.obj = cam.devName; + msg.arg1 = errCode; + msg.what = USB_DEVICE_UPGRADE; + mHander.sendMessage(msg); + } + } + + int fwUpdate(final CameraInfo cam, final File file) { + int errCode = -1; + int retry = 0; + + synchronized (this) { + Log.d(TAG, String.format("Upgrade %s...", cam.devName)); + + Message msg = Message.obtain(); + msg.obj = String.format("Upgrade %s...", cam.devName); + msg.what = USB_DEVICE_MESSAGE; + mHander.sendMessage(msg); + + while (retry++ <= 3) { + errCode = UStorageTestModule.getInstance().sonixCamInit(cam.vendorId, cam.productId, cam.fileDescriptor, cam.busNum, cam.devNum, cam.usbfsName); + Log.d(TAG, "Initialize result:" + errCode); + if (errCode != 0) { + return errCode; + } + errCode = UStorageTestModule.getInstance().updateFW(file.getPath()); + Log.d(TAG, "Upgrade result:" + errCode); + UStorageTestModule.getInstance().sonixCamUnInit(); + if (errCode == 0) { + return 0; + } + SystemClock.sleep(1000); + } + } + return errCode; + } + + static class CameraInfo { + int vendorId; + int productId; + int fileDescriptor; + int busNum; + int devNum; + String usbfsName; + String devName; + public CameraInfo(int vendorId, int productId, int fileDescriptor, int busNum, int devNum, String usbfsName, String devName) { + this.vendorId = vendorId; + this.productId = productId; + this.fileDescriptor = fileDescriptor; + this.busNum = busNum; + this.devNum = devNum; + this.usbfsName = usbfsName; + this.devName = devName; + } + } +} diff --git a/build.gradle b/build.gradle index a868baa..de09b28 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.0' + classpath 'com.android.tools.build:gradle:4.2.2' // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle.properties b/gradle.properties index 69b4e93..44b8275 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,10 +9,11 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m +org.gradle.jvmargs=-Xmx1536m --add-opens java.base/java.io=ALL-UNNAMED + # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -android.enableAapt2=false + -- Gitblit v1.8.0